kubectl の yaml 生成バグについて

1 min read読了の目安(約1100字

Kubernetes で yaml を書く際、一から yaml を書くケースはあまり多くないと思います。一般的にはkubectlコマンドで yaml のテンプレートを生成し、それに追記する場合が多いでしょう。

この記事では yaml 生成時のバグについて解説します。バグとしてはサービスをexposeする際にnamespaceを指定しても yaml に反映されないというものです。具体的には、下記コマンドを入力すると

$ kubectl create ns testns
$ kubectl -n testns create deployment test-deploy --image=nginx
$ kubectl -n testns expose deployment.apps/test-deploy --port=80 --dry-run=client -o yaml

下記が出力されます。

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: test-deploy
  name: test-deploy
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: test-deploy
status:
  loadBalancer: {}

namespacetestnsを指定しているにも関わらず yaml に出力されていません。ちなみにこれは--dry-run=clientを指定した場合のみ発生し、指定しなければ正常に出力されます。

通常業務で使用する際はレビューなり動作確認なりをする時間があるので気づくと思います。むしろ、CKA/CKADのような資格試験で時間が限られている場合、このバグを踏んでパニックになってしまう恐れがありますので、受験を検討されている方は確認しておくことをおすすめします。

対象となるKubernetesバージョンについては、少なくともv1.19とv1.20で上記不具合を確認しています。upstream の方は下記パッチで直しましたので Kubernetes v1.21 以降は不具合は解消される予定です。

https://github.com/kubernetes/kubernetes/commit/8d83dfe2075be68344a633418de7ef81e1dd5957