k8s 創建 kubeconfig 用戶授權證書文件 用於 kubectl 訪問集群


k8s_secret_kubeconfig

  • TSSC

2.創建用戶授權-kubeconfig

  • 需要使用 openssl 工具手動創建單用戶的證書文件
  • 用於命令行管理 k8s 集群

2.1.創建用戶證書文件

  • user: devuser
# 創建用戶授權文件目錄
cd /etc/kubernetes/pki
mkdir -p users
cd users/

# 創建 openssl.cnf 配置文件
vim openssl.cnf
------------------------
[ req ]
default_bits = 2048
default_md = sha256
distinguished_name = req_distinguished_name
 
[req_distinguished_name]
 
[ v3_ca ]
basicConstraints = critical, CA:TRUE
keyUsage = critical, digitalSignature, keyEncipherment, keyCertSign
 
[ v3_req_server ]
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
 
[ v3_req_client ]
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth
------------------------

# 使用 openssl 工具創建用戶秘鑰文件
openssl genrsa -out devuser.key 2048

# 使用 openssl 工具生成用戶證書請求文件
openssl req -new -key devuser.key -subj "/CN=devuser/O=zuiyoujie" -out devuser.csr

# 使用 openssl 工具生成用戶證書
openssl x509 -req -in devuser.csr -CA ../ca.crt -CAkey ../ca.key -CAcreateserial -extensions v3_req_client -extfile openssl.cnf -out devuser.crt -days 3650

2.2.使用用戶證書生成 kubeconfig 配置文件

# 設置集群參數變量,設置一個集群,需要指定根證書和 server-api 服務地址,指定 kubeconfig 文件
export KUBE_APISERVER="https://{{K8S_MASTER_IP}}:6443"
kubectl config set-cluster {{K8S_CLUSTER_NAME}} \
--certificate-authority=../ca.crt \
--server=${KUBE_APISERVER} \
--embed-certs=true \
--kubeconfig=devuser

# 設置客戶端認證參數,設置一個證書用戶 devuser,需要指定用戶證書和秘鑰,指定 kubeconfig 文件
kubectl config set-credentials devuser \
--client-certificate=devuser.crt \
--client-key=devuser.key \
--embed-certs=true \
--kubeconfig=devuser

# 設置上下文參數,需要指定用戶名,可以指定 NAMESPACE,指定 kubeconfig 文件
kubectl config set-context {{K8S_CLUSTER_NAME}} \
--cluster={{K8S_CLUSTER_NAME}} \
--namespace=test01 \
--user=devuser \
--kubeconfig=devuser

# 設置上下文配置,指定 kubeconfig 文件
kubectl config use-context {{K8S_CLUSTER_NAME}} --kubeconfig=devuser

# 執行完畢,會在當前目錄生成以 devuser 命令的 kubeconfig 配置文件

2.3.配置 namespace 的訪問授權

  • 為單個用戶 devuser 創建 namespace 的相關授權,用於查看和切換 namespace
mkdir -p /opt/k8s/grant
cd /opt/k8s/grant
vim k8s_create_kubeconfig_ClusterRoleNamespace.yaml
-------------------------------
# 創建用戶授權規則:便於普通用戶查看或者切換 namespace
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: devuser-ns
  labels:
    rbac.zuiyoujie.com/name: devuser
rules:
  - apiGroups:
      - ""
    resources:
      - namespaces
    verbs:
      - get
      - list

# 綁定授權規則到用戶 devuser
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: devuser-ns
subjects:
  - kind: User
    name: devuser
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: devuser-ns
  apiGroup: rbac.authorization.k8s.io
---------------------------------

# 應用授權配置
kubectl apply -f k8s_create_kubeconfig_ClusterRoleNamespace.yaml

2.4.配置 k8s 集群的操作權限

  • 為單個用戶 devuser 創建 k8s 集群的操作權限
mkdir -p /opt/k8s/grant
cd /opt/k8s/grant
vim k8s_create_kubeconfig_ClusterRoleUser.yaml
--------------------------------
# 用戶授權規則:用戶的可操作權限
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: devuser
  labels:
    rbac.zuiyoujie.com/name: devuser
rules:
  - apiGroups:
      - ""
    resources:
      - pods
      - pods/attach
      - pods/exec
      - pods/log
      - pods/status
      - configmaps
      - services
    verbs:
      - get
      - list
      - watch
      - create
      - describe
  - apiGroups:
      - extensions
      - apps
    resources:
      - deployments
      - deployments/status
      - replicasets
      - replicasets/status
      - daemonsets
      - daemonsets/status
      - ingresses
      - ingresses/status
    verbs:
      - get
      - list
      - watch
      - describe
  - apiGroups:
      - metrics.k8s.io
    resources:
      - pods
      - nodes
    verbs:
      - get
      - list
      - watch

# 授權用戶 devuser 可以訪問的 namespace
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: devuser
  namespace: test01
  labels:
    rbac.zuiyoujie.com/name: devuser
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: devuser
subjects:
  - kind: User
    name: devuser
    apiGroup: rbac.authorization.k8s.io

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: devuser
  namespace: test02
  labels:
    rbac.zuiyoujie.com/name: devuser
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: devuser
subjects:
  - kind: User
    name: devuser
    apiGroup: rbac.authorization.k8s.io

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: devuser
  namespace: test03
  labels:
    rbac.zuiyoujie.com/name: devuser
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: devuser
subjects:
  - kind: User
    name: devuser
    apiGroup: rbac.authorization.k8s.io
---
---------------------------------

# 應用授權配置文件
kubectl apply -f k8s_create_kubeconfig_ClusterRoleUser.yaml

2.5.檢查綁定的授權規則

[root@zuiyoujie grant]# kubectl describe clusterrole devuser
Name:                            devuser
Labels:                          rbac.zuiyoujie.com/name=devuser
Annotations:                     PolicyRule:
  Resources                      Non-Resource URLs  Resource Names  Verbs
  ---------                      -----------------  --------------  -----
  configmaps                     []                 []              [get list watch create describe]
  pods/attach                    []                 []              [get list watch create describe]
  pods/exec                      []                 []              [get list watch create describe]
  pods/log                       []                 []              [get list watch create describe]
  pods/status                    []                 []              [get list watch create describe]
  pods                           []                 []              [get list watch create describe]
  services                       []                 []              [get list watch create describe]
  daemonsets.apps/status         []                 []              [get list watch describe]
  daemonsets.apps                []                 []              [get list watch describe]
  deployments.apps/status        []                 []              [get list watch describe]
  deployments.apps               []                 []              [get list watch describe]
  ingresses.apps/status          []                 []              [get list watch describe]
  ingresses.apps                 []                 []              [get list watch describe]
  replicasets.apps/status        []                 []              [get list watch describe]
  replicasets.apps               []                 []              [get list watch describe]
  daemonsets.extensions/status   []                 []              [get list watch describe]
  daemonsets.extensions          []                 []              [get list watch describe]
  deployments.extensions/status  []                 []              [get list watch describe]
  deployments.extensions         []                 []              [get list watch describe]
  ingresses.extensions/status    []                 []              [get list watch describe]
  ingresses.extensions           []                 []              [get list watch describe]
  replicasets.extensions/status  []                 []              [get list watch describe]
  replicasets.extensions         []                 []              [get list watch describe]
  nodes.metrics.k8s.io           []                 []              [get list watch]
  pods.metrics.k8s.io            []                 []              [get list watch]

[root@zuiyoujie grant]# kubectl describe clusterrole devuser-ns
Name:         devuser-ns
Labels:       rbac.zuiyoujie.com/name=devuser
Annotations:  PolicyRule:
  Resources   Non-Resource URLs  Resource Names  Verbs
  ---------   -----------------  --------------  -----
  namespaces  []                 []              [get list]


免責聲明!

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



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