# 前言
本篇主要紀錄 Kubernetes RBAC 的部分使用方法
# 目標
- 在 cluster 內建立一個 user, 該 user 只可通過 client 端的 private key 以及 certificate 方可存取
- 限制 cluster 內特定 user 只可存取特定的 namespace
- 在本文中, 我們會建立一個 user
ray
, grouplearnordie
, 只可訪問 namespacekube-system
# 建立用戶憑證
# 建立一個 private key, 名稱為 ray.key
openssl genrsa -out ray.key 2048 |
# 建立一個 csr, 並定義 user name 以及 user group
openssl req -new -key ray.key -out ray.csr -subj "/CN=ray/O=learnordie" |
# 生成最終 crt 文件
預設 Kubernetes CA 文件位置為 /etc/kubernetes/pki/
目錄下
openssl x509 -req -in ray.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out ray.crt -days 500 |
# 建立 user 及 context
上面我們生成了由 Kubernetes CA 所簽署的 crt, 接下來我們使用這個 crt 來建立 user, 以及 context
# 建立 user
kubectl config set-credentials ray --client-certificate=ray.crt --client-key=ray.key |
# 建立 context
可以擁有多個 context, 用於記住不同操作對象的整套資訊, 例如 user ray, cluster 為 ray-cluster, 預設的 namespace 為 ray-namespace, 可使用 kubectl config use-context
來設定預設的 context, 可使用 kubectl config current-context
取得預設 context
kubectl config set-context demo-context --cluster=yourClusterName --namespace=kube-system --user=ray |
# 建立 role 以及 rolebinding
依照上面的步驟, 已經建立了 user 以及 context, 這時如果我們使用此 context 來取得資訊, 將會出錯, 因為此時的 user ray 並沒有任何的權限
kubectl get pods --context demo-context |
因此, 接下來我們要建立代表權限的 role, 以及用來綁定 user 以及 role 的 role binding
# 建立 role
建立以下 yaml file, 名為 demo-role.yaml
apiVersion: rbac.authorization.k8s.io/v1 |
從 demo-role.yaml
建立該 role
kubectl apply -f demo-role.yaml |
# 建立 role binding
建立以下 yaml file, 名為 demo-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1 |
從 demo-role-binding.yaml
建立該 role binding
kubectl apply -f demo-role-binding.yaml |
這時如果可以看看 role 以及 role binding 有沒有出現在 kube-system
kubectl get role -n kube-system |
# 驗證
沒意外的話, 現在使用 demo-context 來取得 namespace 為 kube-system 的 resources pods, deployments, replicasets 都是沒有問題的
kubectl get pods --context demo-context |
每次使用 demo-context, Kubernetes 都會去檢查當初簽署的 ray.csr 以及 ray.crt, 換言之, 要是少了這兩樣東西, 便無法以 ray 這個 user 對 cluster 做操作, 若要變更檢查金鑰的目錄, 可修改 config 檔案, 預設位置為 ~/.kube/config
# 參考來源
# Questions and Answers
以下的 openssl example command 的意思是?
- Example:
openssl genrsa -out ray.key 2048
- Answer:
生成一個 private key,-out
代表指定輸出檔案的檔名, 2048 表示要生成幾 bit 的 private key
以下的 openssl example command 的意思是?
- Example:
openssl req -new -key ray.key -out ray.csr -subj "/CN=ray/O=learnordie"
- Answer:
req: 代表建立一個 csr
-new: 產生一個新的 csr file
-key: 指定 private key
-out: 輸出 csr 名稱
-subj: 定義 subject field 的值, 格式通常為 /type0=value0/type1=value1/type2=...
以下的 openssl example command 的意思是?
- Example:
openssl x509 -req -in ray.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out ray.crt -days 500
- Answer:
x509: 有多種用途, 這邊為生成 crt
-req: 指定輸入檔案為 csr, 而非 crt
-in: 要讀取的檔案
-CA: 要使用的 CA 證書。 當使用此 flag 時, x509 用途 mini CA, issuer name 為 CA subject name, 且使用 CA private key 數位簽署 csr
-CAkey: 指定用來簽名的 CA private key
CAcreateserial: 建立一個 ca.srl 的序號檔, 用來記錄 CA 簽了多少個 crt, 如果已經有了就可以直接使用 CAserial 指定檔案
-out: 輸出檔案名稱
-days: 證書有效期限
以下的 kubernetes example command 的意思是?
- Example:
kubectl config set-credentials ray --client-certificate=ray.crt --client-key=ray.key
- Answer:
建立一個 Kubernetes user, 並指定 crt 以及 private key
以下的 kubernetes example command 的意思是?
- Example:
kubectl config set-context demo-context --cluster=yourClusterName --namespace=kube-system --user=ray
- Answer:
可以擁有多個 context, 用於記住不同操作對象的整套資訊, 例如 user ray, cluster 為 ray-cluster, 預設的 namespace 為 ray-namespace, 可使用kubectl config use-context
來設定預設的 context, 可使用kubectl config current-context
取得預設 context
留言