服务器账号-绑定服务账户代币量机制

管理服务帐户

ServiceAccount 为在 Pod 中运行的进程提供身份。

Pod 中的进程可以使用其关联服务帐户的身份向集群的 API 服务器进行身份验证。

有关服务帐户的介绍,请参阅配置服务帐户。

本任务指南说明了有关 ServiceAccounts 的几个概念。 本指南还解释了如何获取或撤销代表 ServiceAccount 的令牌。

准备开始

您必须有一个 Kubernetes 集群,并且您的 Kubernetes 集群必须具有 kubectl 命令行工具。 建议在至少有两个不充当控制平面主机的节点的集群上运行本教程。 如果您还没有集群,您可以使用 Minikube 构建自己的集群,或者您可以使用以下任何一种 Kubernetes 工具构建一个集群:

为了能够准确地执行这些步骤,请确保您有一个名为 exampleslen 的命名空间。 如果没有,请运行以下命令来创建命名空间:

kubectl create namespace examplens

用户帐户和服务帐户

Kubernetes 区分用户账户和服务账户的原因如下:

绑定服务账户代币量机制

功能状态:Kubernetes v1.22 [稳定]

默认情况下,Kubernetes 控制平面(除其他事项外)向 Pod 添加一个投影卷,其中包含用于访问 Kubernetes API 的令牌。

以下示例演示了如何查找已启动的 Pod:

...
  - name: kube-api-access-
    projected:
      sources:
        - serviceAccountToken:
            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

此清单片段定义了一个由三个数据源组成的投影体积。 在当前场景中,每个数据源还表示卷内的独立路径。 这三个数据源是:

serviceAccountToken数据源,包含kubelet从kube-apiserver获取的token。 kubelet 使用 TokenRequest API 获取限时令牌。 为 TokenRequest 服务的令牌在 Pod 被删除后或在定义的生命周期(默认为 1 小时)后过期。 此令牌绑定到特定的 Pod,其受众设置为与 kube-apiserver 的受众相匹配。 这种机制取代了之前基于 Secrets 添加卷的机制,Secret 代表 Pod 的 ServiceAccounts 但没有过期。 configMap 数据源。 ConfigMap 包含一组证书颁发机构数据。 Pod 可以使用这些证书来确保它们连接到集群的 kube-apiserver(而不是中间件或意外配置错误的对等点)。 downwardAPI 数据源用于查找包含 Pod 的命名空间的名称,并使该名称信息可用于在 Pod 内运行的应用程序代码。

Pod 中安装此特定卷的所有容器都可以访问上述信息。

阐明:

没有具体的机制来使通过 TokenRequest 发出的令牌无效。 如果您不再信任绑定到 Pod 的服务帐户令牌,则可以删除该 Pod。 删除 Pod 会使它绑定的服务帐户令牌过期。

手动管理ServiceAccount的Secret

v1.22 之前的 Kubernetes 版本会自动创建凭证以访问 Kubernetes API。 这种较旧的机制基于首先创建令牌 Secret,然后将其附加到正在运行的 Pod。

在包括 Kubernetes v1.26 在内的最新版本中,API 凭据通过 TokenRequest API 使用,并使用 projected volumes 安装到 pod 中。 使用此方法获取的令牌具有绑定的生命周期,当挂载的 Pod 被删除时,这些令牌将自动过期。

您仍然可以使用 Secret 来存储服务帐户令牌; 例如,如果您需要一个永不过期的令牌。

一旦您手动创建一个 Secret 并将其与 ServiceAccount 相关联,Kubernetes 控制平面将自动使用令牌填充 Secret。

阐明:

尽管存在手动创建期 ServiceAccount 令牌的机制,但建议使用 TokenRequest 获取短期 API 访问令牌。

控制平面详细信息令牌控制器

服务帐户令牌控制器作为 kube-controller-manager 的一部分运行并异步工作。 其职责包括:

您必须通过 –service-account-private-key-file 标志将服务帐户私钥文件传递给 kube-controller-manager 令牌控制器。 此私钥用于签署生成的服务帐户令牌。 同样,您需要通过 –service-account-key-file 标志通知 kube-apiserver 相应的公钥。 公钥用于在身份验证过程中验证令牌。

ServiceAccount准入控制器

对 Pod 的更改是通过称为准入控制器的插件进行的。 它是 API 服务器的一部分。 准入控制器在 Pod 创建时同步修改它们。 如果插件被激活(在大多数发行版中默认情况下是激活的)服务器账号,它将在创建 Pod 时执行以下操作:

如果 Pod 没有设置 .spec.serviceAccountName,准入控制器会将 ServiceAccount 名称设置为传入 Pod 的默认名称。 准入控制器确保传入 Pod 引用的 ServiceAccount 确实存在。 如果没有 ServiceAccount 具有匹配的名称,准入控制器将拒绝传入的 Pod。 此检查甚至适用于默认的 ServiceAccount。 如果服务帐户的 automountServiceAccountToken 字段和 Pod 的 automountServiceAccountToken 字段都未明确设置为 false:如果新 Pod 的规范不包含任何 imagePullSecrets,则准入控制器添加从 ServiceAccount 复制的 imagePullSecrets。 令牌请求API

功能状态:Kubernetes v1.22 [稳定]

您使用 ServiceAccount 的 TokenRequest 子资源来获取该 ServiceAccount 的限时令牌。 您不需要调用它来获取要在容器中使用的 API 令牌,因为 kubelet 使用投影卷设置它。

查看是否要使用 kubectl 中的 TokenRequest API。

Kubernetes 控制平面(特别是 ServiceAccount 准入控制器)向 pod 添加一个计划的卷,kubelet 确保该卷包含允许容器作为正确的 ServiceAccount 进行身份验证的令牌。

(该机制取代了之前基于Secret添加卷的机制,Secret代表Pod使用的ServiceAccount,但没有过期。)

以下示例演示了如何查找已启动的 Pod:

...
  - name: kube-api-access-
    projected:
      defaultMode: 420 # 这个十进制数等同于八进制 0644
      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

此清单片段定义了一个由三个数据源信息组成的投影卷。

serviceAccountToken数据源,包含kubelet从kube-apiserver获取的token。 kubelet 使用 TokenRequest API 获取限时令牌。 为 TokenRequest 服务的令牌在 Pod 被删除后或在定义的生命周期(默认为 1 小时)后过期。 此令牌绑定到特定的 Pod,其受众设置为与 kube-apiserver 的受众相匹配。 configMap 数据源。 ConfigMap 包含一组证书颁发机构数据。 Pod 可以使用这些证书来确保它们连接到集群的 kube-apiserver(而不是中间件或意外配置错误的对等点)。 downwardAPI 数据源。 这个 downwardAPI 卷采用包含 Pod 的命名空间的名称,并使该名称信息可用于在 Pod 内运行的应用程序代码。

装载此卷的 Pod 中的所有容器都可以访问上述信息。

创建额外的 API 令牌

注意:

只有在机制不合适时才需要创建寿命的 API 令牌。 令牌请求机制提供限时令牌; 随着这些令牌过期,它们对信息安全的风险会降低。

要为 ServiceAccount 创建一个不会过期的持久 API 令牌,请创建一个类型为 kubernetes.io/service-account-token 的 Secret,并带有引用该 ServiceAccount 的注解。 然后服务器账号,控制平面生成一个期存在的令牌,并使用生成的令牌数据更新 Secret。

这是此类 Secret 的示例清单:

秘密/服务账户/mysecretname.yaml

apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
  name: mysecretname
  annotations:
    kubernetes.io/service-account.name: myserviceaccount

要基于此示例创建 Secret,请运行以下命令:

kubectl -n examplens create -f https://k8s.io/examples/secret/serviceaccount/mysecretname.yaml

要查看 Secret 的详细信息,请运行以下命令:

kubectl -n examplens describe secret mysecretname

输出类似于:

Name:           mysecretname
Namespace:      examplens
Labels:         
Annotations:    kubernetes.io/service-account.name=myserviceaccount
                kubernetes.io/service-account.uid=8a85c4c4-8483-11e9-bc42-526af7764f64
Type:   kubernetes.io/service-account-token
Data
====
ca.crt:         1362 bytes
namespace:      9 bytes
token:          ...

如果在 examples 命名空间中启动一个新的 Pod,则可以使用刚刚创建的 myserviceaccount service-account-token Secret。

删除/撤销 ServiceAccount 令牌

如果您知道 Secret 的名称并且该 Secret 包含要删除的令牌:

kubectl delete secret name-of-secret

否则先找到ServiceAccount使用的Secret。

# 此处假设你已有一个名为 'examplens' 的名字空间
kubectl -n examplens get serviceaccount/example-automated-thing -o yaml

输出类似于:

apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
            {"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"name":"example-automated-thing","namespace":"examplens"}}
  creationTimestamp: "2019-07-21T07:07:07Z"
  name: example-automated-thing
  namespace: examplens
  resourceVersion: "777"
  selfLink: /api/v1/namespaces/examplens/serviceaccounts/example-automated-thing
  uid: f23fd170-66f2-4697-b049-e1e266b7f835
secrets:
  - name: example-automated-thing-token-zyxwv

然后删除您现在知道其名称的 Secret:

kubectl -n examplens delete secret/example-automated-thing-token-zyxwv

控制平面发现 ServiceAccount 缺少它的 Secret,并创建一个替换:

kubectl -n examplens get serviceaccount/example-automated-thing -o yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
            {"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"name":"example-automated-thing","namespace":"examplens"}}
  creationTimestamp: "2019-07-21T07:07:07Z"
  name: example-automated-thing
  namespace: examplens
  resourceVersion: "1026"
  selfLink: /api/v1/namespaces/examplens/serviceaccounts/example-automated-thing
  uid: f23fd170-66f2-4697-b049-e1e266b7f835
secrets:
  - name: example-automated-thing-token-4rdrh

清理

如果您为实验创建了一个示例命名空间,则可以将其删除:

kubectl delete namespace examplens

控制平面详细信息 ServiceAccount 控制器

ServiceAccount 控制器管理命名空间内的 ServiceAccount,并确保每个活动命名空间中都存在名为“default”的 ServiceAccount。

令牌控制器

服务帐户令牌控制器作为 kube-controller-manager 的一部分运行并异步工作。 其职责包括:

您必须通过 –service-account-private-key-file 标志将服务帐户私钥文件传递给 kube-controller-manager 令牌控制器。 此私钥用于签署生成的服务帐户令牌。 同样,您需要通过 –service-account-key-file 标志通知 kube-apiserver 相应的公钥。 公钥用于在身份验证过程中验证令牌。

下一个

限 时 特 惠: 本每日持续更新海量各大内部创业教程,一年会员只需98元,全资源免费下载 
优惠码(不再需要): xnbaoku

声明:本站内容转载于网络,版权归原作者所有,仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任,若侵犯到你的版权利益,请联系我们,会尽快给予删除处理!

大鱼项目网 » 服务器账号-绑定服务账户代币量机制