# 创建一个私钥 dev 为linux系统用户 cd /etc/kubernetes/pki openssl genrsa -out dev.key 2048) # 基于这个私钥生成证书 openssl req -new -key dev.key -out dev.csr -subj "/CN=dev" # 申请证书 openssl x509 -req -in dev.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out dev.crt -days 3000 # 查看证书 -text:使用文本输出, -noout: 不适应base64编码 openssl x509 -in dev.crt -text -noout # Issuer: 显示当前证书是由谁来签署的. # Subject: 中显示的CN是连入K8s集群的用户账户名 # Validity: 这是显示当前证书的有效期限. # 创建账号查看帮助 [root@m1 pki]# kubectl config set-credentials --help # 创建 users kubectl config set-credentials dev --client-certificate=./dev.crt --client-key=./dev.key --embed-certs=true # --embed-certs: ture:表示将证书和私钥包含到k8s中,并且隐藏不显示具体数据. # 若需要创建token认证信息: kubectl config set-credentials testuser --token=预共享的密钥 # 若需要创建基于用户名和密码的认证信息: kubectl config set-credentials testuser --username=test --password=PU@&@Xs # 若要基于外部认证信息需要使用: --auth-provider= 和 --auth-provider-arg=.. 等信息。 # 创建 contexts kubectl config set-context dev@kubernetes --cluster=cluster1 --user=dev # 更改用户 kubectl config use-context dev@kubernetes # 查看详细信息 kubectl config view # 此时换到新建的用户已经没权限了 # 切回管理员用户 kubectl config use-context dku bkubev@kubernetes # 创建一个新集群配置信息 kubectl config set-cluster cluster1 --kubeconfig=test.conf --server="https://192.168.13.117:6443" --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true kubectl config view --kubeconfig=/tmp/test.conf # K8s RBAC认证--------------------------------------------------------------------------------------------------------------------------------- kubectl get role kubectl get rolebinding kubectl get clusterrole kubectl get clusterrolebinding # 创建一个 role --- 这个指定给单独命名空间的权限 [root@m1 ~]# cat role-pod-reader.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: creationTimestamp: null name: pod-reader rules: - apiGroups: - "" resources: - pods verbs: - get - list - watch # 创建 rolebinding (只能获取 rolebinding 所在的名称空间) [root@m1 ~]# cat rolebingding-pods.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: null name: dev-pod-reader roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: pod-reader subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: dev # 创建一个 clsterrole [root@m1 ~]# cat cluster-role-dev.yml # 创建一个 clsterrolebinding(可以获取所有名称空间的pods) [root@m1 cluster]# cat clusterrolebinding-clusterrole-dev.yml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cluster-dev roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: dev-log subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: dev # 创建一个 rolebinding 绑定的是 clsterrole(那么它的权限也只会是 rolebinding 名称空间的权限, clsterrole被降级) [root@m1 cluster]# cat rolebingding-clusterrole-dev.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: cluster-dev roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: dev-log subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: dev # 查看集群安装时系统配置好的 clusterrole 相关权限 kubectl get clusterrole cluster-admin -o yaml kubectl get clusterrole admin -o yaml # 如果每个名称空间需要一个管理员工/ 只需要把 用户通过 rolebinding 绑定 clusterrole 的 admin 即可 [root@m1 role]# kubectl create rolebinding default--ns-admin --clusterrole=admin --user=dev [root@m1 role]# kubectl create rolebinding default--ns-admin --clusterrole=admin --user=dev --dry-run -o yaml # 这样就通过 rolebinding 绑定 clusterrole 实现了 # 定义pod的时候 如果定义了 serviceAccountName 则就可以控制pod已不同的权限来和apisever打交道了 kubectl explain pod.spec.serviceAccountName (serviceAccount已被废弃)