在 Kubernetes User Account 中我们介绍了如何创建一个用户,用户就是 User Account,是给外部用户使用的
这里的 Service Account ,是给 Pod 使用的
基于 Service Account , 运行在Pod中的进程可以获取对应的username和token,从而用来访问 Api Server
对于 Service Account 最简单的使用是 base 在 namespace 上的
每一个namespace都携带一个名叫 default 的默认的 service account
我们在helloworld namespace 上部署一个nginx,然后我通过这个nginx尝试访问apiserver
这里需要分为2个步骤
1 先对应服务器端 CA
1.1 可以直接选择忽略
curl -k https://192.168.204.149:6443/api
1.2 找到并使用服务器端CA
看到 401 之后,此时并不是 RBAC 权限阻止了你,而是 api server 阻止了你
2. 需要对应 apiserver 的 token
/var/run/secrets/kubernetes.io/serviceaccount/token
找到token之后在命令行中加入token
curl --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjN6UW1TTTR2VlI2M3MxVklnRjFPZmtIa1JiVU92bVk1UENtMlBRQVFWQTAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJoZWxsb3dvcmxkIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tbHZjY2QiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6Ijg2YTQ3MjE1LTRiODctNDRhYy1hMTc2LWZkN2E0OTI4MjU1YiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpoZWxsb3dvcmxkOmRlZmF1bHQifQ.RnvDLG86wveeOmbY1jwJyu2YYX84KFnZkWP0hMo5gbSnMNfy8MDW6l00NiTqueTS5Efvzl9IQNo7cYJWLmwZ43hRSj9UaLnLHoWl3wgb0eT16AlSVL7WX5f05jdxH55gKqv-gOsF1u1btzltiI5a5iz5bvr02lOa23JD6xWpPKt5beBfcW6BSvbBboMYtwh_4fue6nOCBd96-nhOcd3ytdhQUu6Ta2o3BW7Ro1bMyJuwTWD_YxCKQj3Ab47n13W2MiztvXOF9dqGCRACBy_ZqvXNB3QsCyjDgnSWcc4jlkxKYsgmiQgOgFkdDzIrC-qGAdLpTF941QtYYZXqH91keQ" https://192.168.204.149:6443/api
此时你已经可以访问 api 端点了,但是仍然不能访问pod
curl --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjN6UW1TTTR2VlI2M3MxVklnRjFPZmtIa1JiVU92bVk1UENtMlBRQVFWQTAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJoZWxsb3dvcmxkIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tbHZjY2QiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6Ijg2YTQ3MjE1LTRiODctNDRhYy1hMTc2LWZkN2E0OTI4MjU1YiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpoZWxsb3dvcmxkOmRlZmF1bHQifQ.RnvDLG86wveeOmbY1jwJyu2YYX84KFnZkWP0hMo5gbSnMNfy8MDW6l00NiTqueTS5Efvzl9IQNo7cYJWLmwZ43hRSj9UaLnLHoWl3wgb0eT16AlSVL7WX5f05jdxH55gKqv-gOsF1u1btzltiI5a5iz5bvr02lOa23JD6xWpPKt5beBfcW6BSvbBboMYtwh_4fue6nOCBd96-nhOcd3ytdhQUu6Ta2o3BW7Ro1bMyJuwTWD_YxCKQj3Ab47n13W2MiztvXOF9dqGCRACBy_ZqvXNB3QsCyjDgnSWcc4jlkxKYsgmiQgOgFkdDzIrC-qGAdLpTF941QtYYZXqH91keQ" https://192.168.204.149:6443/api/v1/namespaces/default/pods
看见403之后,这里可以肯定已经是被 RBAC 阻止了
我们来给这个 serviceaccount 一个 最大管理员权限
kubectl create clusterrolebinding permissive-binding --clusterrole=cluster-admin --group=system:serviceaccounts:helloworld
由于赋给了最大管理员权限,所以此时,不仅能看到 default namespace 下的 pod 信息,还能看到 helloworld namespace下的pod信息
Service Account 使用一种特殊的secret对象,叫做 ServiceAccountToken,它会被自动mount到各个pod中