×

服务账号概述

服务账号是一个 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 令牌和注册表凭据不会过期,但您可以通过删除密钥来撤销它们。当您删除密钥时,会自动生成一个新的密钥来代替它。

创建服务账号

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

步骤
  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>

向服务账号授予角色的示例

您可以像向普通用户帐户授予角色一样,向服务帐户授予角色。

  • 您可以修改当前项目的服务帐户。例如,要将 `view` 角色添加到 `top-secret` 项目中的 `robot` 服务帐户

    $ oc policy add-role-to-user view system:serviceaccount:top-secret:robot

    您可以选择应用以下 YAML 来添加角色

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: view
      namespace: top-secret
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: view
    subjects:
    - kind: ServiceAccount
      name: robot
      namespace: top-secret
  • 您也可以向项目中的特定服务帐号授予访问权限。例如,从服务帐号所属的项目中,使用-z标志并指定<service_account_name>

    $ oc policy add-role-to-user <role_name> -z <service_account_name>

    如果您想向项目中的特定服务帐号授予访问权限,请使用-z标志。使用此标志有助于防止打字错误,并确保仅向指定的特定服务帐号授予访问权限。

    您可以选择应用以下 YAML 来添加角色

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: <rolebinding_name>
      namespace: <current_project_name>
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: <role_name>
    subjects:
    - kind: ServiceAccount
      name: <service_account_name>
      namespace: <current_project_name>
  • 要修改不同的命名空间,您可以使用-n选项来指示它适用的项目命名空间,如下例所示。

    • 例如,要允许所有项目中的所有服务帐号查看my-project项目中的资源

      $ oc policy add-role-to-group view system:serviceaccounts -n my-project

      您可以选择应用以下 YAML 来添加角色

      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: view
        namespace: my-project
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: view
      subjects:
      - apiGroup: rbac.authorization.k8s.io
        kind: Group
        name: system:serviceaccounts
    • 要允许managers项目中的所有服务帐号编辑my-project项目中的资源

      $ oc policy add-role-to-group edit system:serviceaccounts:managers -n my-project

      您可以选择应用以下 YAML 来添加角色

      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: edit
        namespace: my-project
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: edit
      subjects:
      - apiGroup: rbac.authorization.k8s.io
        kind: Group
        name: system:serviceaccounts:managers