这一系列文档都是关于Kubernetes集群内部pods等资源对外部请求的认证与受权的管以及如何使用roles和role binding控制Kubernetes内部资源的访问权限。git
在生产环境中,Kubernetes管理员使用namespaces隔离集群上的资源。Namespaces在权限控制上扮演着资源的逻辑分界线角色。json
设想下面的应用场景:api
运维team中新加入一位同事名字叫Bob,他的主要工做是管理工程师组在Kubernetes上的部署工做。所以运维组的老大必须受权Bob操做engineering namesapces足够的权限。bash
下面的实验操做是发生在个人私人Kubernetes集群上,你可使用具备Kubernetes集群最高权限的任何集群资源上完成下面的实验。app
mkdir cred
cd cred
复制代码
openssl genrsa -out bob.key 2048
复制代码
openssl req -new -key bob.key -out bob.csr -subj "/CN=bob/O=eng"\n
复制代码
cat bob.csr | base64 | tr -d '\n'
复制代码
cat >> signing-request.yaml <<EOF
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: bob-csr
spec:
groups:
- system:authenticated
request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1lqQ0NBVW9DQVFBd0hURU1NQW9HQTFVRUF3d0RZbTlpTVEwd0N3WURWUVFLREFSbGJtZHVNSUlCSWpBTgpCZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF3amJvYldWeHFVd21kUS85SW50T01kNXBieUJtCjZPSEt2aDRsSm5DMEgrNVVWNXNGYUJhMm1TdFVFdG1ENGRuUk0zcFdBUVBPUEdQditaY1NCc1N5QmhYdmswY1kKNGJXcWRLRGdUMnpTWEoyemxTVFdlTUJBcFZwWFBseGRLRE80bXk5YWtjbFFUVmE2ZnJadU5MQTNBQnBBTGxxLwowY05Id0tlVkpGVlJoN0l2bzZ4VlZVY0wyN21YK3ZoMmpjZGZKZkU1bG5lQXRXT2xDL05IZE9TUzhuR3JEcCtUCmhJamI5Q0p4Ty90N3VLWUJOMWM2SG1qRUowTkc2cDZhaVRhZWZiYllONmVhVllOUVdWT2hYNFlqQWNTRWp6clUKOCtrd2drZ2h2YjFtNmV0OHQ3VUYzRlJzNDNiU0xrbExPVDBVUGd1MlRQN3RVajM1WlJweHY5ZUQ1UUlEQVFBQgpvQUF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUdFeTRCZS9vRDlUZ1p0V1hvM2FGNkxwUkpsZGtMYWJBbFE4CkdjVGJ1dlhwNmt4ODhDT0NwZjhIb2tMbEgzeiswajZjWktMUFZIVHdzdzJnbmNJbjBCM0RvL3U3dDlWT0d3RVEKaHpzd0cxSFI3VjUrZ1VEMzdmeXc3MGhZUFg0cGlCbncyNWJqLzljR2ViYTQwTjNqNjBHaUVrWlpUa0JUSzNRVApNWmdTMjB4S1UzS0RIOWJENkFJZlQvbUxXRkRRQURKekhVMm9UQ2hqK3JiUlgwYU5qazJVck42dWNqMEx0T0tlCjdoMWJ4YVJjU3BEcDhTWkhYODRwcWY1eVFFWEJ5dEt0ZjF5T3dBK2tCVldPdS81SkJWQVpQTmRyVElKR2g4RmEKbjF0S0E4RngyYStLdkN2b2txQjlrYzFVQ3U0d2QyRHVncWJKUmhwUGRiaStSM3htenlzPQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0K
usages:
- digital signature
- key encipherment
- server auth
> EOF
复制代码
kubectl apply -f signing-request.yaml
复制代码
kbuectl get csr
复制代码
从上图可见csr资源对应的状态仍然是Pending,集群管理员使用approve命令使其变成active运维
kubectl certificate approve bob-csr
kubectl get csr
复制代码
从上图可见csr资源已经变成Approved,Issued状态post
kubectl get csr bob-csr -o jsonpath='{.status.certificate}' | base64 --decode > bob.crt
复制代码
上面的bob.crt文件是用来对Bob进行认证和受权的文件。咱们从Kubernetes中得到bob.key私钥文件和bob.crt认证文件后,咱们就能够对bob帐户作受权工做了。jsonp
kubectl config set-credentials bob --client-certificate=bob.crt --client-key=bob.key
复制代码
经过上面命令可见bob用户已经添加到Kubernetes集群中ui
kubectl create namespace enginerging
复制代码
kubectl auth can-i list pods --namespace engineering
yes
复制代码
kubectl auth can-i list pods --namespace engineering --as bob
no
复制代码
明显可见Bob还不能操做enginering namespace的资源。这是为何?编码
即使咱们对Bob作关于Kubernetes集群访问的认证,可是咱们并无对Bob受权操做Kubernets资源的行为。
在这一系列文章的下一章节中,我将带你对bob用户受权操做Kubernetes资源的行为。这主要是关于 role和role binding的知识,继续加油哦!
文章翻译自A Practical Approach to Understanding Kubernetes Authentication ,行文略有删减