kubernetes認證和serviceaccount


Service Account 為 Pod 提供必要的身份認證。所有的 kubernetes 集群中賬戶分為兩類,Kubernetes 管理的 serviceaccount(服務賬戶) 和 useraccount(用戶賬戶)。

kubectl 如果需要訪問 apiserver 需要經過 認證,授權,准入控制 三關。
kubectl 客戶端請求的時候首先需要進行認證,認證通過后再進行授權檢查,因有些增刪等某些操作需要級聯到其他資源或者環境,這時候就需要准入控制來檢查級聯環境是否有授權權限了。

獲取所有的 api version

[root@master ~]# kubectl api-versions
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
apps/v1beta1
apps/v1beta2
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1

使用 curl 訪問 apiservice

從上面可知,所有客戶端訪問 apiserver都需要經過驗證,因而我們在服務器上面也配置了驗證信息:

# 使用 kubectl 命令的用戶家目錄下有 .kube/config 文件,上面有 client-certificate-data 和  client-key-data 認證信息。
cat .kube/config 

啟用本地轉發端口,代理訪問 apiserver

# 因為訪問 apiserver 需要認證,但是在命令行中很難進行驗證,我們可以通過代理的方式,對 apiserver 進行訪問
kubectl proxy --port=8080

# 另起一個窗口
# 獲取所有的 namespace
curl http://localhost:8080/api/v1/namespaces

# 獲取 kube-system 下所有的 deployments
curl http://localhost:8080/apis/apps/v1/namespaces/kube-system/deployments/

創建服務賬戶

mkdir ~/sa
cd sa/
kubectl create serviceaccount admin

# 查看,新增了一個 secrets
kubectl get sa 或 kubectl get secret

[klvchen@master ~]$ kubectl describe sa admin
Name:                admin
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>                      # 可以在這里配置私有 registry 需要的驗證信息
Mountable secrets:   admin-token-h2nhw
Tokens:              admin-token-h2nhw
Events:              <none>

# 創建一個 pod 使用 admin 的 serviceaccount 
vi pod-sa-demo.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-sa-demo
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    klvchen.com/created-by: "cluster admin"
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
  serviceAccountName: admin

kubectl apply -f pod-sa-demo.yaml 

# 查看
kubectl describe pods pod-sa-demo
# 查看當前的用戶認證
kubectl config view

# 以 root 用戶執行
cd /etc/kubernetes/pki

# 配置 root 使用 kubectl 權限
mkdir ~/.kube
cp /etc/kubernetes/admin.conf /root/.kube/config

# 創建新的密鑰
(umask 077; openssl genrsa -out klvchen.key 2048)

# 創建證書請求,/CN 指定的是用戶名
openssl req -new -key klvchen.key -out klvchen.csr -subj "/CN=klvchen"

# 創建證書
openssl x509 -req -in klvchen.csr -CA ./ca.crt -CAkey ./ca.key -CAcreateserial -out klvchen.crt -days 365

# 查看證書
openssl x509 -in klvchen.crt -text -noout

# 在kubeconfig配置文件中設置一個用戶項
kubectl config set-credentials klvchen --client-certificate=./klvchen.crt --client-key=./klvchen.key --embed-certs=true

kubectl config set-context klvchen@kubernetes --cluster=kubernetes --user=klvchen

kubectl config view

# 切換用戶
kubectl config use-context klvchen@kubernetes

# 此用戶沒有權限查看資源
kubectl get pods 

# 切換回管理員賬號
kubectl config use-context kubernetes-admin@kubernetes

# 創建一個新的 kubectl 配置文件
kubectl config set-cluster mycluster --kubeconfig=/tmp/test.conf --server="https://192.168.0.205:6443" --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true

kubectl config view --kubeconfig=/tmp/test.conf 


免責聲明!

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



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