diff --git a/content/zh/docs/reference/access-authn-authz/service-accounts-admin.md b/content/zh/docs/reference/access-authn-authz/service-accounts-admin.md new file mode 100644 index 0000000000..a962c5ddfb --- /dev/null +++ b/content/zh/docs/reference/access-authn-authz/service-accounts-admin.md @@ -0,0 +1,220 @@ +--- +reviewers: +- bprashanth +- davidopp +- lavalamp +- liggitt +title: 管理 Service Accounts +content_template: templates/concept +weight: 50 +--- + + + +{{% capture overview %}} + + +这是一个关于 service accounts 的集群管理指南,它假设您了解 [Service Accounts 用户指南](/docs/user-guide/service-accounts)。 + + +计划支持授权和用户帐户,但并不完整。有时会引用不完整的功能以便更好地描述 service accounts。 + +{{% /capture %}} + +{{% capture body %}} + + + +## 用户帐户与 service accounts + + +Kubernetes 区分用户帐户和 service account 的概念有以下几个原因: + + + + - 用户帐户是针对用户的。Service accounts 用于进程,这些进程在 pods 中运行。 + - 用户帐户应该是全局性的。名称必须在集群的所有命名空间中都是唯一的,未来的用户资源将不会使用命名空间。Service accounts 使用命名空间。 + - 通常,集群的用户帐户可能与企业数据库同步,在企业数据库中,新用户帐户的创建需要特殊的权限,并且与复杂的业务流程相关联。 + Service account 创建的目的是更加轻量级,允许集群用户为特定任务创建 Service account (即:最小特权原则)。 + - 对人员和 Service account 的审计考虑可能有所不同。 + - 复杂系统的配置包可能包括该系统组件的各种 Service account 的定义。由于 Service account 可以临时创建并具有命名空间名称,因此这种配置是可移植的。 + + + +## Service account 自动化 + + +三个独立的组件合作实现 service accounts 的自动化: + + + + - Service account 准入控制器 + - 令牌控制器 + - Service account 控制器 + + + +### Service Account 准入控制器 + + +pod 的修改是通过一个名为[准入控制器](/docs/reference/access-authn-authz/admission-controllers/)的插件实现的。它是 apiserver 的一部分。它可以同步操作,以便在创建或更新 pod 时对其进行修改。 +当此插件处于活动状态时(默认情况下在大多数发行版中),则在创建或修改 pod 时执行以下操作: + + + + 1. 如果 pod 没有设置 `ServiceAccount`,它将 `ServiceAccount` 设置为 `default`。 + 2. 它确保 pod 引用的 `ServiceAccount` 存在,否则拒绝它。 + 3. 如果 pod 不包含任何 `ImagePullSecrets`,则将 `ServiceAccount` 的 `ImagePullSecrets` 添加到 pod 中。 + 4. 它向包含 API 访问令牌的 pod 添加了一个 `volume`。 + 5. 它为 pod 内的每个容器添加一个 `volumeSource`,该 volume 被挂载到 `/var/run/secrets/kubernetes.io/serviceaccount`。 + + + +### 令牌控制器 + + +TokenController 作为控制器-管理器的一部分异步运行。它用于: + + + +- 观察 serviceAccount 创建并创建相应的 Secret 以允许 API 访问。 +- 观察 serviceAccount 删除并删除所有相应的 ServiceAccountToken Secrets。 +- 观察 secret 添加,并确保引用的 ServiceAccount 存在,并在需要时向该 secret 添加令牌。 +- 观察 secret 删除并在需要时从相应的 ServiceAccount 中删除引用。 + + +您必须使用 `--service-account-private-key-file` 选项将 service account 私钥文件传递给控制器-管理器中的令牌控制器。 +私钥将用于签署生成的 service account 令牌。同样,您必须使用 `--service-account-key-file` 选项将相应的公钥传递给 +kube-apiserver。公钥将用于在身份验证期间验证令牌。 + + + +#### 创建其他 API 令牌 + + +控制器循环确保每个 service account 都存在具有 API 令牌的 secret。要为 service account 创建其他 API 令牌, +请使用 ServiceAccountToken 引用 service account 的注解创建类型的 secret,控制器将使用生成的令牌更新它: + +secret.json: + +```json +{ + "kind": "Secret", + "apiVersion": "v1", + "metadata": { + "name": "mysecretname", + "annotations": { + "kubernetes.io/service-account.name": "myserviceaccount" + } + }, + "type": "kubernetes.io/service-account-token" +} +``` + +```shell +kubectl create -f ./secret.json +kubectl describe secret mysecretname +``` + + + +#### 删除/无效化 一个 service account 令牌 + +```shell +kubectl delete secret mysecretname +``` + + + +### Service Account 控制器 + + +Service Account 控制器在命名空间中管理 ServiceAccount,并确保每个活动命名空间中都存在一个名为 `default` 的 ServiceAccount。 + +{{% /capture %}}