koukiblog

たぶんweb系の話題

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