×

服务帐户概述

服务帐户是一个 OpenShift Container Platform 帐户,允许组件直接访问 API。服务帐户是在每个项目中存在的 API 对象。服务帐户提供了一种灵活的方式来控制 API 访问,而无需共享普通用户的凭据。

当您使用 OpenShift Container Platform CLI 或 Web 控制台时,您的 API 令牌会对您进行 API 身份验证。您可以将组件与服务帐户关联起来,以便它们可以访问 API 而无需使用普通用户的凭据。例如,服务帐户可以允许

  • 复制控制器进行 API 调用以创建或删除 Pod。

  • 容器内的应用程序进行 API 调用以进行发现。

  • 外部应用程序进行 API 调用以进行监控或集成。

每个服务帐户的用户名都源自其项目和名称。

system:serviceaccount:<project>:<name>

每个服务帐户也是两个组的成员。

描述

system:serviceaccounts

包含系统中的所有服务帐户。

system:serviceaccounts:<project>

包含指定项目中的所有服务帐户。

每个服务帐户自动包含两个密钥。

  • API 令牌

  • OpenShift Container Registry 的凭据

生成的 API 令牌和注册表凭据不会过期,但您可以通过删除密钥来撤销它们。当您删除密钥时,会自动生成一个新的密钥来代替它。

默认服务帐户

您的 OpenShift Container Platform 集群包含用于集群管理的默认服务帐户,并为每个项目生成更多服务帐户。

默认集群服务帐户

一些基础架构控制器使用服务帐户凭据运行。以下服务帐户在服务器启动时在 OpenShift Container Platform 基础架构项目 (openshift-infra) 中创建,并在集群范围内获得以下角色:

服务帐户 描述

replication-controller

分配了 system:replication-controller 角色

deployment-controller

分配了 system:deployment-controller 角色

build-controller

分配了 system:build-controller 角色。此外,build-controller 服务帐户包含在特权安全上下文约束中,以创建特权构建 Pod。

默认项目服务帐户和角色

每个项目中都会自动创建三个服务帐户。

服务帐户 用途

builder

由构建 Pod 使用。它被赋予 system:image-builder 角色,允许使用内部 Docker 注册表将镜像推送到项目中的任何 imagestream。

如果未启用 Build 集群功能,则不会创建 builder 服务帐户。

deployer

由部署 Pod 使用,并被赋予 system:deployer 角色,允许查看和修改项目中的复制控制器和 Pod。

如果未启用 DeploymentConfig 集群功能,则不会创建 deployer 服务帐户。

default

用于运行所有其他 Pod,除非它们指定不同的服务帐户。

项目中的所有服务帐户都具有 system:image-puller 角色,允许使用内部容器镜像注册表从项目中的任何镜像流中拉取镜像。

自动生成的镜像拉取密钥

默认情况下,OpenShift Container Platform 为每个服务帐户创建一个镜像拉取密钥。

在 OpenShift Container Platform 4.16 之前,还会为创建的每个服务帐户生成一个长期存在的服务帐户 API 令牌密钥。从 OpenShift Container Platform 4.16 开始,不再创建此服务帐户 API 令牌密钥。

升级到 4.17 后,任何现有的长期存在的服务帐户 API 令牌密钥都不会被删除,并将继续运行。有关检测集群中正在使用的长期存在的 API 令牌或在不需要时删除它们的信息,请参阅 Red Hat 知识库文章 OpenShift Container Platform 中长期存在的服务帐户 API 令牌

此镜像拉取密钥是将OpenShift镜像注册表集成到集群的用户身份验证和授权系统所必需的。

但是,如果您未启用ImageRegistry功能,或者在集群镜像注册表操作员的配置中禁用了集成的OpenShift镜像注册表,则不会为每个服务帐户生成镜像拉取密钥。

在先前启用了集成的OpenShift镜像注册表的集群上禁用它时,先前生成的镜像拉取密钥将自动删除。

创建服务帐户

您可以在项目中创建一个服务帐户,并通过将其绑定到角色来授予其权限。

步骤
  1. 可选:查看当前项目中的服务帐户

    $ oc get sa
    示例输出
    NAME       SECRETS   AGE
    builder    2         2d
    default    2         2d
    deployer   2         2d
  2. 在当前项目中创建一个新的服务帐户

    $ oc create sa <service_account_name> (1)
    1 要在不同的项目中创建服务帐户,请指定-n <project_name>
    示例输出
    serviceaccount "robot" created

    或者,您可以应用以下YAML来创建服务帐户

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: <service_account_name>
      namespace: <current_project>
  3. 可选:查看服务帐户的密钥

    $ oc describe sa robot
    示例输出
    Name:                robot
    Namespace:           project1
    Labels:	             <none>
    Annotations:	     <none>
    Image pull secrets:  robot-dockercfg-qzbhb
    Mountable secrets:   robot-dockercfg-qzbhb
    Tokens:              robot-token-f4khf
    Events:              <none>