×

服务账户概述

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

当您使用OpenShift Dedicated CLI或Web控制台时,您的API令牌会验证您对API的访问权限。您可以将组件与服务账户关联起来,以便它们无需使用普通用户的凭据即可访问API。

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

system:serviceaccount:<project>:<name>

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

描述

system:serviceaccounts

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

system:serviceaccounts:<project>

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

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

  • 一个API令牌

  • OpenShift Container Registry的凭据

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

默认服务账户

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

默认集群服务账户

一些基础设施控制器使用服务账户凭据运行。以下服务账户在服务器启动时在OpenShift Dedicated基础设施项目(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 注册表将镜像推送到项目中的任何镜像流。

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

部署者

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

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

默认

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

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

自动生成的镜像拉取密钥

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

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

升级到版本后,任何现有的长期有效的服务帐户 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>