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
参考