ServiceAccount

Service account 是爲了方便 Pod 裏面的進程調用 Kubernetes API 或其他外部服務而設計的。它與 User account 不同

  • User account 是爲人設計的,而 service account 則是爲 Pod 中的進程調用 Kubernetes API 而設計;

  • User account 是跨 namespace 的,而 service account 則是僅侷限它所在的 namespace;

  • 每個 namespace 都會自動創建一個 default service account

  • Token controller 檢測 service account 的創建,併爲它們創建 secret

  • 開啓 ServiceAccount Admission Controller 後

    • 每個 Pod 在創建後都會自動設置 spec.serviceAccountName 爲 default(除非指定了其他 ServiceAccout)

    • 驗證 Pod 引用的 service account 已經存在,否則拒絕創建

    • 如果 Pod 沒有指定 ImagePullSecrets,則把 service account 的 ImagePullSecrets 加到 Pod 中

    • 每個 container 啓動後都會掛載該 service account 的 token 和 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 等)。

創建 Service Account

自動創建的 secret:

添加 ImagePullSecrets

授權

Service Account 爲服務提供了一種方便的認證機制,但它不關心授權的問題。可以配合 RBAC 來爲 Service Account 鑑權:

  • 配置 --authorization-mode=RBAC--runtime-config=rbac.authorization.k8s.io/v1alpha1

  • 配置 --authorization-rbac-super-user=admin

  • 定義 Role、ClusterRole、RoleBinding 或 ClusterRoleBinding

比如

Last updated