admin管理员组文章数量:1648949
《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中:
- system:serviceaccounts
这个组包括了系统中所有的Service Account。 - 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
- builder:被build pod使用,被赋予了system:image-builder角色(Role),允许它向当前OpenShift项目对应在OpenShift内部Docker Registry的Repository推送Image。
- deployer:被deployment pod使用,被赋予了system:deployer角色(Role),允许它修改当前项目中的RC和Pod配置。
- default:被其它pod使用。
另外,项目中所有的ServiceAccount都被赋予system:image-puller角色。可以拉取本项目对应在OpenShift内部Docker Registry的Image。
管理操作ServiceAccount
- 用集群管理员登录OpenShift
$ OCP_API=$(oc whoami --show-server)
- 创建名为robot的 ServiceAccount。
$ oc create sa robot
serviceaccount "robot" created
- 查看名为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>
- 查看名为robot的ServiceAccount的Token。返回的是第一个Token。
$ oc sa get-token robot
eyJhbGciOiJSUzI1NiIsImtpZCI6InhaVFRQNWtlb3RyRENwNmNTVWtpTzJ5UGw4dDhsVXMxWUlVX3BkSEdKRUkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJteS1zYSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJyb2JvdC10b2tlbi00andwcyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJyb2JvdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjY3Njg2ZWM1LWU2NjYtNGFkMi1iMTUxLTQzODMyNmRmNWMxZCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpteS1zYTpyb2JvdCJ9.GB4YjqqyZ2M3drIGlV4-jp4hMXasUsgCMRWvgO3V27FHwirR4RJkas8i_Lvuu3JBpozmjj6B_5rRirXDevPgJuTr36NsqGDg9CbCIkDmWMZw_QNDi6jpyLm_DSaPRQnp_9J7B2b7-IWH7alOAOtR9oY5GIjfOOFSVybahhwzY84H3N9rJDY23V676OluAQDNKV8IJRWufWrD237JX3Ew7Lg6snNerEmrnqmmMrTHKtmJC-y1N4FVOo96bkrEmeJSDQEaNJPC37JlMQvcSmmkiqOSPBkZ5y4s3NYeZ-ZH816jQiSQqlgr_IxD8XM01lQS3EE9EZNeU-8Ln80HX-i2rw
- 查看对应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登录
- 在一个新终端窗口执行命令,用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: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.
- 查看登录的身份。
$ oc whoami
system:serviceaccount:my-serviceaccount:robot
给ServiceAccount赋权
- 我们发现当使用名为robot的service account登录OpenShift后,没有权限对my-serviceaccount项目多任何操作。
$ oc project my-serviceaccount
error: You are not a member of project "my-serviceaccount".
- 再次使用集群管理员登录,然后执行以下命令,为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"
- 再次用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:6443" as "system:serviceaccount:my-serviceaccount:robot" using the token provided.
You have one project on this server: "my-serviceaccount"
Using project "my-serviceaccount".
- 执行命令,进一步查看my-serviceaccount项目的sa资源。
$ oc get sa
NAME SECRETS AGE
builder 2 101m
default 2 101m
deployer 2 101m
robot 2 16m
- 执行命令,确认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
参考
- https://docs.openshift/container-platform/4.5/authentication/understanding-and-creating-service-accounts.html
- https://bierkowski/openshift-morsels-login-as-a-service-account/
版权声明:本文标题:OpenShift 4 - 为Serivce Account赋权 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1729495100a1202815.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论