KubernetesでPodに指定したServiceAccountを削除したいときは"default"を指定する
KubernetesでPodに指定したServiceAccountを削除したいときにはまったのでメモ
たとえばこんな感じでPodにServiceAccountを付与したとき
apiVersion: apps/v1 kind: Deployment metadata: namespace: default spec: replicas: 2 selector: matchLabels: app: test template: metadata: labels: app: test spec: serviceAccountName: "foo" containers: - name: test image: busybox command: - sleep - "600"
サービスアカウントを指定を削除するために"serviceAccountName"要素を削除したマニフェストを作って適用したとする
apiVersion: apps/v1 kind: Deployment metadata: namespace: default spec: replicas: 2 selector: matchLabels: app: test template: metadata: labels: app: test spec: containers: - name: test image: busybox command: - sleep - "600"
この場合、 serviceAccountName: "foo" は残ってしまう。未指定の場合は過去の設定をそのまま引き継いでしまう。明示的にserviceAccountをリセットする必要がある。
このときに、 serviceAccountName: "" のように空白を指定すると結局無視されてしまうので注意が必要。serviceAccountのデフォルトは"default"というserviceAccountなので、 serviceAccountName: "default" を指定する必要がある。
これが正解。
apiVersion: apps/v1 kind: Deployment metadata: namespace: default spec: replicas: 2 selector: matchLabels: app: test template: metadata: labels: app: test spec: serviceAccountName: "default" containers: - name: test image: busybox command: - sleep - "600"
ちなみに、ServiceAccountNameを指定すると、ServiceAccountNameだけではなく、ServiceAccountという要素にも値が設定される。これはServiceAccountの方は既にDeprectedになっている古いAPIで互換性のために値がコピーされているだけなので気にしなくて良い。PodのSpecを見ると確認することができる。
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#pod-v1-core