×

服务帐户概述

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

创建服务帐户

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

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