OpenShift 4 - 为Serivce Account赋权

76 篇文章 6 订阅
4 篇文章 1 订阅

OpenShift 4.x HOL教程汇总

什么是ServiceAccount

当你通过oc命令访问OpenShift集群时,你会被apiserver认证为一个特定的用户账户(User Account)。应用进程也可以访问apiserver,当它们这样做的时候,它们会被认证为一个特定的服务账户(Service Account)。

User Account是全局的、是跨namespace不能重复的;而Service Account则是仅局限它所在的namespace,即不同的namespace中可以有相同名称的Service Account。所以Service Account的命名方式是“system:serviceaccount::”。

User Account是为人设计的,而Service Account是为了方便Pod中的进程调用OpenShift API或其他外部服务而设计的,例如在Jenkins的Pipeline中需要从Registry拉取一个Image。我们(一个人)是否可以用在Terminal终端上使用Service Account对项目资源操作?答案是肯定的。由于一个Service Account只有对应的Token,因此当我们使用Service Account登录OpenShift的时候,我们只能使用它的Token作为认证凭证。而当我们用User Account登录OpenShift的时候,我们既可以使用user/password、还可以使用Token登录。

在创建Service Account的时候,每个Service Account会自动放在2个Group中:

  1. system:serviceaccounts
    这个组包括了系统中所有的Service Account。
  2. system:serviceaccounts:<PROJECT>
    这个组包括了<PROJECT>中所有的Service Account。

项目缺省的ServiceAccount

OpenShift会为每个项目创建3个缺省的ServiceAccount:builder、deployer、default。

$ oc new-project my-serviceaccount
$ oc get sa
NAME       SECRETS   AGE
builder    2         2d
default    2         2d
deployer   2         2d
  1. builder:被build pod使用,被赋予了system:image-builder角色(Role),允许它向当前OpenShift项目对应在OpenShift内部Docker Registry的Repository推送Image。
  2. deployer:被deployment pod使用,被赋予了system:deployer角色(Role),允许它修改当前项目中的RC和Pod配置。
  3. default:被其它pod使用。
    另外,项目中所有的ServiceAccount都被赋予system:image-puller角色。可以拉取本项目对应在OpenShift内部Docker Registry的Image。

管理操作ServiceAccount

  1. 用集群管理员登录OpenShift
$ OCP_API=$(oc whoami --show-server)
  1. 创建名为robot的 ServiceAccount。
$ oc create sa robot
serviceaccount "robot" created
  1. 查看名为robot的 ServiceAccount。其中可以看到sa挂载了2个secret,一个对应的是Image pull secret,一个对应的是Token。
$  oc describe sa robot
Name:                robot
Namespace:           my-serviceaccount
Labels:              <none>
Annotations:         <none>
Image pull secrets:  robot-dockercfg-7dxhs
Mountable secrets:   robot-token-4jwps
                     robot-dockercfg-7dxhs
Tokens:              robot-token-4jwps
                     robot-token-svpm2
Events:              <none>
  1. 查看名为robot的ServiceAccount的Token。返回的是第一个Token。
$ oc sa get-token robot
eyJhbGciOiJSUzI1NiIsImtpZCI6InhaVFRQNWtlb3RyRENwNmNTVWtpTzJ5UGw4dDhsVXMxWUlVX3BkSEdKRUkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJteS1zYSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJyb2JvdC10b2tlbi00andwcyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJyb2JvdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjY3Njg2ZWM1LWU2NjYtNGFkMi1iMTUxLTQzODMyNmRmNWMxZCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpteS1zYTpyb2JvdCJ9.GB4YjqqyZ2M3drIGlV4-jp4hMXasUsgCMRWvgO3V27FHwirR4RJkas8i_Lvuu3JBpozmjj6B_5rRirXDevPgJuTr36NsqGDg9CbCIkDmWMZw_QNDi6jpyLm_DSaPRQnp_9J7B2b7-IWH7alOAOtR9oY5GIjfOOFSVybahhwzY84H3N9rJDY23V676OluAQDNKV8IJRWufWrD237JX3Ew7Lg6snNerEmrnqmmMrTHKtmJC-y1N4FVOo96bkrEmeJSDQEaNJPC37JlMQvcSmmkiqOSPBkZ5y4s3NYeZ-ZH816jQiSQqlgr_IxD8XM01lQS3EE9EZNeU-8Ln80HX-i2rw
  1. 查看对应Token名的secret信息,确认其token内容和上一步获得的token内容一致。
$ oc describe secret robot-token-4jwps
Name:         robot-token-4jwps
Namespace:    my-serviceaccount
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: robot
              kubernetes.io/service-account.uid: 67686ec5-e666-4ad2-b151-438326df5c1d
 
Type:  kubernetes.io/service-account-token
 
Data
====
namespace:       5 bytes
service-ca.crt:  6079 bytes
token:           eyJhbGciOiJSUzI1NiIsImtpZCI6InhaVFRQNWtlb3RyRENwNmNTVWtpTzJ5UGw4dDhsVXMxWUlVX3BkSEdKRUkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJteS1zYSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJyb2JvdC10b2tlbi00andwcyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJyb2JvdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjY3Njg2ZWM1LWU2NjYtNGFkMi1iMTUxLTQzODMyNmRmNWMxZCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpteS1zYTpyb2JvdCJ9.GB4YjqqyZ2M3drIGlV4-jp4hMXasUsgCMRWvgO3V27FHwirR4RJkas8i_Lvuu3JBpozmjj6B_5rRirXDevPgJuTr36NsqGDg9CbCIkDmWMZw_QNDi6jpyLm_DSaPRQnp_9J7B2b7-IWH7alOAOtR9oY5GIjfOOFSVybahhwzY84H3N9rJDY23V676OluAQDNKV8IJRWufWrD237JX3Ew7Lg6snNerEmrnqmmMrTHKtmJC-y1N4FVOo96bkrEmeJSDQEaNJPC37JlMQvcSmmkiqOSPBkZ5y4s3NYeZ-ZH816jQiSQqlgr_IxD8XM01lQS3EE9EZNeU-8Ln80HX-i2rw

使用ServiceAccount登录

  1. 在一个新终端窗口执行命令,用robot的ServiceAccount登录OpenShift。
$ TOKEN=$(oc sa get-token robot)
$ oc login --token=${TOKEN} ${OCP_API} --insecure-skip-tls-verify
Logged into "https://api.cluster-beijing-f5b3.beijing-f5b3.sandbox1120.opentlc.com:6443" as "system:serviceaccount:my-serviceaccount:robot" using the token provided.
 
You don't have any projects. Contact your system administrator to request a project.
  1. 查看登录的身份。
$ oc whoami
system:serviceaccount:my-serviceaccount:robot

给ServiceAccount赋权

  1. 我们发现当使用名为robot的service account登录OpenShift后,没有权限对my-serviceaccount项目多任何操作。
$ oc project my-serviceaccount
error: You are not a member of project "my-serviceaccount".
  1. 再次使用集群管理员登录,然后执行以下命令,为robot增加my-serviceaccount项目的view权限。
$ oc policy add-role-to-user view system:serviceaccount:my-serviceaccount:robot
clusterrole.rbac.authorization.k8s.io/view added: "system:serviceaccount:my-serviceaccount:robot"
  1. 再次用robot登录OpenShift,确认提示说明可以访问my-serviceaccount项目了。
$  oc login --token=${TOKEN} ${OCP_API} --insecure-skip-tls-verify
Logged into "https://api.cluster-beijing-f5b3.beijing-f5b3.sandbox1120.opentlc.com:6443" as "system:serviceaccount:my-serviceaccount:robot" using the token provided.
 
You have one project on this server: "my-serviceaccount"
 
Using project "my-serviceaccount".
  1. 执行命令,进一步查看my-serviceaccount项目的sa资源。
$ oc get sa
NAME       SECRETS   AGE
builder    2         101m
default    2         101m
deployer   2         101m
robot      2         16m
  1. 执行命令,确认robot拥有的项目权限。
$ oc auth can-i list pod
yes
$ oc auth can-i list build
yes
$ oc auth can-i list imagestream
yes
$ oc auth can-i list dc
yes

参考

  1. https://docs.openshift.com/container-platform/4.5/authentication/understanding-and-creating-service-accounts.html
  2. https://bierkowski.com/openshift-morsels-login-as-a-service-account/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值