仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

Kubernetes 1.16でYAMLではまる

最近、Kubernetes 1.16を使い始めました。ただ、Kubernetes 1.15まで問題なく動いていたYAMLファイルを使ってPodを作ろうとすると、なんかうまくいかないのでおかしいなと思ったのですが、APIがとうとう削除されたのが原因でした。

github.com

ChangeLogをきちんとみていればはまらない問題でした。1.15のChangeLogでも予告されてました。ただしKubernetes 1.15では本例の変更前と変更後のYAMLどちらの記述でも通ります。1.16以降は --runtime-config で再度有効にしない限り、変更が必要です。

デフォルトでは無効にされたAPIは次で確認できます。

kubernetes.io github.com

Kubernetes 1.16からは「Deployment apps/v1」を使う

なので、次のようなYAMLを使っていたのであれば

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginxapp1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginxapp1
    spec:
      containers:
      - name: nginxapp1
        image: nginx:alpine
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginxapp1-nodeport
  labels:
    app: nginxapp1
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginxapp1

次のように変えれば良いそうです。最初「言われたようにselectorとappをspecの中に書いたのになんで通らないのかなと思っていたら、 matchLabelsが必要だったという話でした。ちゃんとエラーをみないといけませんね。

stackoverflow.com

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginxapp1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginxapp1
  template:
    metadata:
      labels:
        app: nginxapp1
    spec:
      containers:
      - name: nginxapp1
        image: nginx:alpine
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginxapp1-nodeport
  labels:
    app: nginxapp1
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginxapp1

YAMLをブログに貼り付けた際にインデントが不足している箇所がある可能性があります。ご了承ください。