這是本系列文章的第二篇,在上篇文章中咱們介紹了Kubernetes訪問控制。在本文中,咱們將經過上手實踐的方式來進一步理解身份認證的概念。node
在生產環境中,Kubernetes管理員使用命名空間來隔離資源和部署。命名空間做爲一個邏輯邊界來強制基本訪問控制。git
假設如今咱們有個新的管理員叫Bob,要加入開發團隊爲研發組管理Kubernetes部署。咱們如今須要給他提供足夠的訪問權限以便於他管理工程命名空間。假設你是集羣管理員而且擁有管理全局資源和對象的權限,你須要登上Bob的帳戶並幫助他獲取訪問Kubernetes集羣所需的憑據。json
我在操做中使用的是Minikube,但本文示例的場景適用於任何使用其餘方式配置的Kubernetes集羣(只要你是集羣管理員身份就行)。api
首先,建立一個名爲cred的目錄,並運行如下命令爲Bob生成一個私鑰。併發
mkdir cred cd cred
openssl genrsa -out bob.key 2048 Generating RSA private key, 2048 bit long modulus ..................................................................................................................+++ ................................................+++ e is 65537 (0x10001)
咱們還須要一個能夠從私鑰生成的證書籤名請求。app
openssl req -new -key bob.key -out bob.csr -subj "/CN=bob/O=eng"\n
將密鑰移動到父級文件夾並在Base64中對其進行編碼。jsonp
cp bob.key .. cd .. cat cred/bob.csr | base64 | tr -d '\n' LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1lqQ0NBVW9DQVFBd0hURU1NQW9HQTFVRUF3d0RZbTlpTVEwd0N3WURWUVFLREFSbGJtZHVNSUlCSWpBTgpCZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEzSU9oUTArMFJUakpqZjBKTkd2Rmo0YWFlN1hYCkkrZWkzTzZWTEpqMHNKNDBvengyUTVndXBmeFc5b0lEYTJETnhVZjZkNHVMOUJ3V2lhdFdQdnBDNm80MHJQc2EKTjBUdEhEekFYeWppc0E5VXVRMVNKMWg5Mkg0TU9XWEpWNWJWaTlXYjBKU3hLbXVrSUVtaERJcW9TcEh6MU5xaApQMWNXOFFpNXpoVVBmWlpnOUhSaWVUQ2xEMmR3bWRtS1JjbU9uenNGVWhJWmZWanVZNzZJUm9KbksyaHNzVjZoCmMyY1JNTVNEdFA0ZDArYkxOY1BKdExpS3JjQkdwUGxLUEdrSHovM2NNbVhpVi8wY2xqUlppMzJCb3B4NlI1NUIKc0Z6cXZwcWgzNWxLNUVOUGxPZy9sdURFdllGeUtzOUY2aERBRFhDNzQxU0ZCQTI0TERzcTFiWWtVUUlEQVFBQgpvQUF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUxTejgxL2N3bjQxbVRrUDhabWhhUUx3MkpIRkN4ZUlaOFdpCkZOV0U1cnRVd3hrSjJGWVJKRlFUL1hJN0FoL0pXTkhqeHlhOUNyN3c0OThmanN3bDF2ZzQ1QUgrR29DeVEwTWkKOU1MMHl0WmZyaG5jYmtpRG9oSUpuaWhJTjlCUGpHVkw2SG1USytGc0sybG1ZZ1JDdk9Cclg3Rkh6ZjgwM0ZFNAp4ZkgrZlFsdGxDdEZTSEhuaUlzZTFEQ2J4cFVTdnRISXpYMFcyb2hXV3RPVkRpOTAzOW8zY2VaWmdVK3VRYno0Cmp2djJoeVdRNDhORFl3RWF1UUU2S3NBQTFLT0IyUkI2dE45bjFTVWoxU1B2WnBsQkVieDZ5MTkzaUJSVFJRM2wKM2JhdFRNUUEzelBsdk01ZEE2Vy8rQWcwVm0xMk1SR091VFRLSEU2bE5INE1DbHQvRGZZPQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0K
咱們須要將生成的base64編碼的字符串嵌入到YAML文件中,並將其做爲證書籤名請求提交給Kubernetes。這一步驟基本上能夠將Bob的私鑰與Kubernetes集羣相關聯。編碼
apiVersion: certificates.k8s.io/v1beta1 kind: CertificateSigningRequest metadata: name: bob-csr spec: groups: - system:authenticated request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1lqQ0NBVW9DQVFBd0hURU1NQW9HQTFVRUF3d0RZbTlpTVEwd0N3WURWUVFLREFSbGJtZHVNSUlCSWpBTgpCZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEzSU9oUTArMFJUakpqZjBKTkd2Rmo0YWFlN1hYCkkrZWkzTzZWTEpqMHNKNDBvengyUTVndXBmeFc5b0lEYTJETnhVZjZkNHVMOUJ3V2lhdFdQdnBDNm80MHJQc2EKTjBUdEhEekFYeWppc0E5VXVRMVNKMWg5Mkg0TU9XWEpWNWJWaTlXYjBKU3hLbXVrSUVtaERJcW9TcEh6MU5xaApQMWNXOFFpNXpoVVBmWlpnOUhSaWVUQ2xEMmR3bWRtS1JjbU9uenNGVWhJWmZWanVZNzZJUm9KbksyaHNzVjZoCmMyY1JNTVNEdFA0ZDArYkxOY1BKdExpS3JjQkdwUGxLUEdrSHovM2NNbVhpVi8wY2xqUlppMzJCb3B4NlI1NUIKc0Z6cXZwcWgzNWxLNUVOUGxPZy9sdURFdllGeUtzOUY2aERBRFhDNzQxU0ZCQTI0TERzcTFiWWtVUUlEQVFBQgpvQUF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUxTejgxL2N3bjQxbVRrUDhabWhhUUx3MkpIRkN4ZUlaOFdpCkZOV0U1cnRVd3hrSjJGWVJKRlFUL1hJN0FoL0pXTkhqeHlhOUNyN3c0OThmanN3bDF2ZzQ1QUgrR29DeVEwTWkKOU1MMHl0WmZyaG5jYmtpRG9oSUpuaWhJTjlCUGpHVkw2SG1USytGc0sybG1ZZ1JDdk9Cclg3Rkh6ZjgwM0ZFNAp4ZkgrZlFsdGxDdEZTSEhuaUlzZTFEQ2J4cFVTdnRISXpYMFcyb2hXV3RPVkRpOTAzOW8zY2VaWmdVK3VRYno0Cmp2djJoeVdRNDhORFl3RWF1UUU2S3NBQTFLT0IyUkI2dE45bjFTVWoxU1B2WnBsQkVieDZ5MTkzaUJSVFJRM2wKM2JhdFRNUUEzelBsdk01ZEE2Vy8rQWcwVm0xMk1SR091VFRLSEU2bE5INE1DbHQvRGZZPQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0K usages: - digital signature - key encipherment - server auth
kubectl create -f signing-request.yaml certificatesigningrequest.certificates.k8s.io/bob-csr created
使用如下kubectl命令驗證CSR:spa
kubectl get csr NAME AGE REQUESTOR CONDITION bob-csr 41s minikube-user Pending
請注意,請求此時依舊處於pending狀態。集羣管理員須要批准它,纔會變成active狀態。3d
kubectl certificate approve bob-csr certificatesigningrequest.certificates.k8s.io/bob-csr approved
kubectl get csr NAME AGE REQUESTOR CONDITION bob-csr 104s minikube-user Approved,Issued
既然證書已經批准併發布,咱們須要從集羣中獲取簽名證書。這是登陸Bob帳戶最關鍵的一步。
kubectl get csr bob-csr -o jsonpath='{.status.certificate}' | base64 --decode > bob.crt
bob.crt這一文件是用於Bob身份認證的客戶端證書。咱們如今擁有Kubernetes的私鑰(bob.key)和批准的證書(bob.crt)。只要Bob擁有這兩個憑據,他就能夠經過集羣進行身份認證。
那麼,如今就能夠將Bob做爲用戶添加到Kubernetes中。
kubectl config set-credentials bob --client-certificate=bob.crt --client-key=bob.key User "bob" set.
打開~/.kube/config 文件確認憑據已經設置完成。
讓咱們建立一個名爲engineering的新命名空間,Bob是其管理員。
kubectl create namespace engineering namespace/engineering created
kubectl get namespace NAME STATUS AGE default Active 37m engineering Active 0s kube-node-lease Active 37m kube-public Active 37m kube-system Active 37m
kubectl CLI以auth的形式提供了很是有用的開關,能夠驗證特定用戶的權限。讓咱們檢查一下當前的管理員用戶是否能夠訪問engineering命名空間。鑑於您集羣管理員的身份,所以能夠輕易看到輸出結果。
kubectl auth can-i list pods --namespace engineering yes
咱們也可以檢查Bob可否訪問engineering命名空間。
kubectl auth can-i list pods --namespace engineering --as bob no
很顯然,Bob沒法訪問命名空間,這是由於咱們建立了憑據可是沒有明確受權Bob對任何對象進行任何特定的動做。
在下一篇文章中,我將引導您完成受權Bob的全部步驟。同時,還會介紹角色以及角色綁定。保持關注喲~