ServiceAccount Service account 是为了方便 Pod 里面的进程调用 Kubernetes API 或其他外部服务而设计的。它与 User account 不同 User account 是为人设计的,而 service account 则是为 Pod 中的进程调用 Kubernetes API 而设计; User account 是跨 namespace 的,而 service account 则是仅局限它所在的 namespace;
Service account 是为了方便 Pod 里面的进程调用 Kubernetes API 或其他外部服务而设计的。它与 User account 不同
spec.serviceAccountName 为 default(除非指定了其他 ServiceAccout)ca.crt 到 /var/run/secrets/kubernetes.io/serviceaccount/注意: 从 v1.24.0 开始,ServiceAccount 不再自动生成 Secret。如果你还想要自动生成 Secret,那么可以给 kube-controller-manager 配置特性
LegacyServiceAccountTokenNoAutoGeneration=false。
$ kubectl exec nginx-3137573019-md1u2 ls /var/run/secrets/kubernetes.io/serviceaccount ca.crt namespace token
注:你可以使用 https://jwt.io/ 来查看 token 的详细信息(如 PAYLOAD、SIGNATURE 等)。
$ kubectl create serviceaccount jenkins serviceaccount "jenkins" created $ kubectl get serviceaccounts jenkins -o yaml apiVersion: v1 kind: ServiceAccount metadata: creationTimestamp: 2017-05-27T14:32:25Z name: jenkins namespace: default resourceVersion: "45559" selfLink: /api/v1/namespaces/default/serviceaccounts/jenkins uid: 4d66eb4c-42e9-11e7-9860-ee7d8982865f secrets: - name: jenkins-token-l9v7v
自动创建的 secret:
kubectl get secret jenkins-token-l9v7v -o yaml apiVersion: v1 data: ca.crt: (APISERVER CA BASE64 ENCODED) namespace: ZGVmYXVsdA== token: (BEARER TOKEN BASE64 ENCODED) kind: Secret metadata: annotations: kubernetes.io/service-account.name: jenkins kubernetes.io/service-account.uid: 4d66eb4c-42e9-11e7-9860-ee7d8982865f creationTimestamp: 2017-05-27T14:32:25Z name: jenkins-token-l9v7v namespace: default resourceVersion: "45558" selfLink: /api/v1/namespaces/default/secrets/jenkins-token-l9v7v uid: 4d697992-42e9-11e7-9860-ee7d8982865f type: kubernetes.io/service-account-token
apiVersion: v1 kind: ServiceAccount metadata: creationTimestamp: 2015-08-07T22:02:39Z name: default namespace: default selfLink: /api/v1/namespaces/default/serviceaccounts/default uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6 secrets: - name: default-token-uudge imagePullSecrets: - name: myregistrykey
Service Account 为服务提供了一种方便的认证机制,但它不关心授权的问题。可以配合 RBAC 来为 Service Account 鉴权:
--authorization-mode=RBAC 和 --runtime-config=rbac.authorization.k8s.io/v1alpha1--authorization-rbac-super-user=admin比如
# This role allows to read pods in the namespace "default" kind: Role apiVersion: rbac.authorization.k8s.io/v1alpha1 metadata: namespace: default name: pod-reader rules: - apiGroups: [""] # The API group"" indicates the core API Group. resources: ["pods"] verbs: ["get", "watch", "list"] nonResourceURLs: [] --- # This role binding allows "default" to read pods in the namespace "default" kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1alpha1 metadata: name: read-pods namespace: default subjects: - kind: ServiceAccount # May be "User", "Group" or "ServiceAccount" name: default roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io