メモ置き場

ServiceAccountメモ

ServiceAccountの作成

  • kind: ServiceAccount のリソースを作成する
apiVersion: v1
kind: ServiceAccount
metadata:
  name: app
# 作成
$ kubectl apply -f serviceaccount.yaml
serviceaccount/app created

# 作成されたServiceAccount
$ kubectl get serviceaccounts app -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"name":"app","namespace":"default"}}
  creationTimestamp: "2022-02-12T15:09:24Z"
  name: app
  namespace: default
  resourceVersion: "8673"
  uid: a6f73c64-8edc-4105-a302-52dfb34e22cc
secrets:
- name: app-token-7tr8w

SecretからのServiceAccountTokenの参照

# `secrets.name`の名前でservice-account-tokenのSecretが生成される。
$ kubectl get secret app-token-7tr8w -o yaml
apiVersion: v1
data:
  ca.crt: # 省略
  namespace: ZGVmYXVsdA== # default
  token: # 省略
kind: Secret
metadata:
  annotations:
    kubernetes.io/service-account.name: app
    kubernetes.io/service-account.uid: a6f73c64-8edc-4105-a302-52dfb34e22cc
  creationTimestamp: "2022-02-12T15:09:24Z"
  name: app-token-7tr8w
  namespace: default
  resourceVersion: "8672"
  uid: 2984d917-48c5-4d6b-92f4-e9449b96fa40
type: kubernetes.io/service-account-token
  • type: kubernetes.io/service-account-tokenのSecretを自分で作成して他のservice-account-tokenを作成することもできる。
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
  annotations:
    kubernetes.io/service-account.name: app
type: kubernetes.io/service-account-token

PodからのServiceAccountTokenの参照

  • PodのServiceAccountはspec.serviceAccountで指定する。
    • 指定しない場合、同じnamespaceのdefaultサービスアカウントが割り当てられる
  • ServiceAccountを利用してPod内からKubernetes APIにアクセスする場合、
    • apiserverの名前解決にはkubernetes.default.svcを使用する
    • コンテナの/var/run/secrets/kubernetes.io/serviceaccountにトークン情報を格納したvolume(Projected Volume)がマウントされているので、これらを利用してアクセスする
      • token, ca.crt, namespace
      • tokenは定期的に失効・再作成されているので、アプリケーション側でも定期的に読み直す必要がある
# kubectl get pods -o yamlの抜粋
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-mdz9t
      readOnly: true
...
  volumes:
  - name: kube-api-access-mdz9t
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace

参考