8.k8s.認證與訪問控制


#K8S認證與訪問控制(RBAC) 用戶證書創建

#k8s認證

主要認證 方式 http token、https證書
k8s不提供用戶管理,API Server把客戶端證書的CN字段作為User,把names.O字段作為Group

  • Pod認證 —>ServiceAccount —>service-account-toen—>API Server
  • k8s組件認證 —> 證書 —> kubeconfig —> API Server

Pod容器的訪問:Pod(dashborad 也是Pod形式運行)
k8s組件對API Server的訪問:kubectl、Controller Manager、Scheduler、kubelet、kubeproxy

#kubeconfig

kubeconfig 文件包含集群參數(CA證書、API Server地址),客戶端參數(證書和私鑰),集群
context 信息(集群名稱、用戶名)

#查看當前kubeconfig配置
kubectl config view
cat ~/.kube/config

#ServiceAccount(sa)

sa為Pod的進程調用Kubernetes API時提供身份標識,附帶着Secret用於訪問API Server的憑據

每個namespace會自動創建一個default service account
sa創建時,系統Token controller自動創建service-account-toen
pod創建時沒指定sa,系統會自動指派相同namespace下的默認sa
容器啟動時會掛載sa的token和ca.crt到/var/run/secrets/kubernetes.io/serviceaccount/

#查看當前ns默認sa配置
kubectl get sa default -o yaml
#查看自動創建的secret
kubectl get sa default -o yaml

#創建sa名稱myda (-n dev名稱空間 --dry-run不執行)
kubectl create sa mysa -n dev -o yaml --dry-run #只顯示yaml不執行

RBAC 授權模式

RBAC (Role-Based Access Control基於角色的訪問控制)將權限綁定到role,用戶與role綁定,獲取role權限

Subject (用戶User) —> 角色綁定 —> 角色 —> 獲取許可權限

  • User --> Rolebinding --> Role (Role僅用於對應ns ,Rolebinding可綁定RoleClusterrole)
  • User --> Clusterrolebinding --> Clusterrole (ClusterRole用於集群級別的資源)

RBAC API資源對象: Pods ConfigMaps Deployments Nodes Secrets Namespaces
role對應操作權限: create get delete list update edit watch exec

#查看集群管理員admin資源
kubectl get clusterrole admin -o yaml

#創建myrole ,查看資源
kubectl create role myrole --verb=get,list,watch --resource=pod,svc -o yaml --dry-run

#創建myrole-binding,綁定role為myrole,綁定用戶devuser
kubectl create rolebinding myrole-binding --role=myrole --user=devuser -o yaml --dry-run
#創建Dashboard登錄token實例
#創建sa名稱dashboard-admin,綁定到集群角色cluster-admin
kubectl create sa dashboard-admin -n kube-system
kubectl create clusterrolebinding  dashboard-admin \
  --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

#查看Dashboard登錄token
kubectl describe secrets -n kube-system \
$(kubectl get secret -A | awk '/dashboard-admin/{print $2}') |awk '/token:/{print$2}'

#k8s證書簽名創建用戶實例

#k8s創建用戶實例
##############################

#k8s創建devuser用戶管理dev空間所有資源

##############################
#參數

#group name , namespace
gname=dev
#user name
uname=${gname}user
#clusters name
cname=$(kubectl config get-contexts |awk '/*/{print $3}')
#API Server
apiserver="$(kubectl config view |awk '/server/{print $2}')"
#k8s根證書簽名路徑
ca_dir=/etc/kubernetes/pki
#可選,創建目錄
mkdir -p ${uname} ; cd ${uname}

##############################
#創建證書

#創建私鑰key
openssl genrsa -out ${gname}.key
#創建證書簽署請求csr(O=組織,CN=用戶)
#openssl rand -writerand ~/.rnd
openssl req -new -key ${gname}.key -out ${gname}.csr -subj "/O=${gname}/CN=${uname}"

#使用CA根證書簽名
openssl x509 -req -in ${gname}.csr -CAcreateserial -out ${gname}.crt \
-CA ${ca_dir}/ca.crt -CAkey ${ca_dir}/ca.key   -days 365
#驗證
#openssl x509 -in ${gname}.crt -text -noout -subject

##############################
#創建config文件

#集群參數
kubectl config set-cluster ${cname} \
--certificate-authority=${ca_dir}/ca.crt \
--embed-certs=true \
--server=${apiserver} \
--kubeconfig=config.${uname}

#客戶端認證
kubectl config set-credentials ${uname} \
--client-certificate=${gname}.crt \
--client-key=${gname}.key \
--embed-certs=true \
--kubeconfig=config.${uname}

#上下文參數(用戶關聯集群)
kubectl config set-context ${uname}@${cname} \
--cluster=${cname} \
--user=${uname} \
--namespace=${gname} \
--kubeconfig=config.${uname}

# 設置默認上下文
kubectl config use-context ${uname}@${cname} --kubeconfig=config.${uname}

#查看
kubectl config view --kubeconfig=config.${uname}

##############################
#權限

#創建namespace
kubectl create ns ${gname}

#查看clusterrole/admin
#kubectl get clusterrole admin -o yaml
#設置權限角色,所屬namespace的所有權(使用系統自帶的clusterrole)
kubectl create rolebinding ${uname}-admin-binding --clusterrole=admin --user=${uname} --namespace=${gname}

##############################

#kubectl認證
bash #進入新的終端環境
gname=dev
uname=${gname}user
#臨時使用config.${uname}授權文件
export KUBECONFIG=config.${uname}

#查看當前配置
kubectl config view
#查看sa
kubectl get sa

#運行Pod測試
kubectl run myweb --image=alivv/nginx:node --replicas=3

#查看Pod
kubectl get pod -n dev

exit #退出測試終端環境
#查看所有namespace的Pod
kubectl get pod -A

##############################
#刪除pod
kubectl delete deploy/myweb -n dev

#刪除ns
kubectl delete ns dev

Blog地址 https://www.cnblogs.com/elvi/p/11755851.html
本文git地址 https://gitee.com/almi/k8s/tree/master/notes


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM