查看集群账号


查看当前集群账号信息:

kubectl config view

集群和账号相关信息:

apiVersion: v1
clusters: # 集群
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://192.168.1.140:6443
  name: kubernetes
contexts:
- context: # 集群与账号之间的对应关系
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes # 集群名称
current-context: kubernetes-admin@kubernetes  # 当前用的集群名称
kind: Config
preferences: {}
users:  # 用户
- name: kubernetes-admin # 集群管理员
  user:
    client-certificate-data: REDACTED # 客户端证书
    client-key-data: REDACTED # 客户端私钥

切换当前使用的集群账号:

]# kubectl config use-context kubernetes-admin@kubernetes 
Switched to context "kubernetes-admin@kubernetes".



创建集群账号


创建集群账号 set-credentials:

        创建一个新的集群账号来访问k8s集群,账号加入集群需要加密认证,所以需要先创建证书,创建证书使用到的ca在 /etc/kubernetes/pki 目录中的ca.crt 和 ca.key,证书的CN名称为账号名称。

openssl genrsa -out qiyang.key 2048
openssl req -new -key qiyang.key -subj "/CN=qiyang" -out qiyang.csr
openssl x509 -req -in qiyang.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out qiyang.crt -days 5000

创建账号命令:

kubectl config set-credentials qiyang --client-certificate=/etc/kubernetes/pki/qiyang.crt --client-key=/etc/kubernetes/pki/qiyang.key --embed-certs=true
User "qiyang" set.

kubectl config set-credentials qiyang    #“qiyang”这个名称为创建证书的CN字段的名称。

--client-certificate=客户端证书

--client-key=客户端秘钥

--embed-certs=true  # 为true时隐藏证书和秘钥,显示为 "REDACTED"

查看新创建的账号:

        创建完证书就可以使用 kubectl config view 中的user字段下看到新创建的用户了。

users:
- name: kubernetes-admin  #原有的集群账号
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
- name: qiyang  # 刚刚创建的集群账号。
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

将新账号添加到集群中 set-context:设置上下文

        使用新账号访问当前的集群需要使用如下命令去设置,账号的后面要跟上集群名称 qiyang@kubernetes。

kubectl config set-context qiyang@kubernetes --cluster=kubernetes --user=qiyang
Context "qiyang@kubernetes" created.

可以看到新的账号已经创建好了:

]# kubectl config view 
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://192.168.1.140:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
- context: # 新账号
    cluster: kubernetes
    user: qiyang
  name: qiyang@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
- name: qiyang
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

使用新账号访问集群 use-context:切换账号

kubectl config use-context qiyang@kubernetes 
Switched to context "qiyang@kubernetes".

新创建的账号没有任何权限所以查看不到资源:

kubectl get pods --all-namespaces 
Error from server (Forbidden): pods is forbidden: User "qiyang" cannot list resource "pods" in API group "" at the cluster scope

赋予权限:要想给新账号权限就要创建角色并绑定到用户

kubectl config use-context kubernetes-admin@kubernetes # 切换到管理员账号
kubectl create clusterrole qiyang-ClusterRole --verb='*' --resource='*'
kubectl create clusterrolebinding qiyang-ClusterRoleBinding --clusterrole=qiyang-ClusterRole --user=qiyang

权限中的角色创建和绑定详见:https://www.scriptjc.com/article/1015


多个人管理集群:

        如果多个人管理一个k8s集群时就需要创建多个linux账号和多个k8s账号,只需要将$HOME/.kube 目录中的内容全部拷贝到linux新账号的目录下并改属组属主即可。过程如下:

# 复制文件
cp -R ~/.kube/ /home/k8s/
chown -R k8s:k8s /home/k8s/.kube/
su k8s

# 切换k8s账号
kubectl config use-context qiyang@kubernetes

这样每个人就可以使用不同的账号管理k8s了。



添加或设置集群


设置集群 set-cluster:

        在k8s中一个平台或者一个集群是可以访问另一个集群的,设置新的集群同样使用 kubectl config 命令。

kubectl config set-cluster mycluster --kubeconfig=kubeconfig --server="https://192.168.1.140:6443" --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true

--kubeconfig=集群配置文件,默认位置在$HOME/.kube 中,测试的话可以指定其他位置,不过查看也要带上选项,否者查看的是默认的。

--server=集群访问地址,api server地址

--certificate-authority=集群ca证书,需要添加的集群中的 /etc/kubernetes/pki/ca.crt 

--embed-certs=true 隐藏证书

查看刚刚添加的集群:

]# kubectl config view --kubeconfig=kubeconfig 
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://192.168.1.140:6443
  name: mycluster
contexts: []
current-context: ""
kind: Config
preferences: {}
users: []



将用户添加到组


        将用户添加到组中需要在创建证书的时候将证书中的 O 字段设为组名system:masters ,这样创建出来的证书就在这个组当中,并拥有组的权限。

-subj "/CN=kubernetes-admin/O=system:masters"

实例:

# 创建证书
cd /etc/kubernetes/pki/
openssl genrsa -out qiyang-admin.key 2048
openssl req -new -key qiyang-admin.key -subj "/CN=qiyang-admin/O=system:masters" -out qiyang-admin.csr
openssl x509 -req -in qiyang-admin.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out qiyang-admin.crt -days 5000

# 创建集群
kubectl --kubeconfig=kubeconfig config set-cluster kubernetes --server="https://192.168.1.140:6443" --certificate-authority=ssl/kube-ca.pem --embed-certs=true

# 创建账号
kubectl --kubeconfig=kubeconfig config set-credentials qiyang-admin --client-certificate=/etc/kubernetes/pki/qiyang-admin.crt --client-key=/etc/kubernetes/pki/qiyang-admin.key --embed-certs=true
kubectl --kubeconfig=kubeconfig config set-context qiyang-admin@kubernetes --cluster=kubernetes --user=qiyang-admin

# 切换账号,这个账号就是超级管理员了,因为这个账号在管理员组system:masters中
kubectl --kubeconfig=kubeconfig config use-context qiyang-admin@kubernetes
kubectl --kubeconfig=kubeconfig get pods --all-namespaces



用token创建配置文件


创建sa,再将sa绑定权限,再获取sa默认绑定的token:

kubectl create serviceaccount clusterviewer
kubectl create clusterrolebinding clusterviewer --clusterrole=view --serviceaccount=default:clusterviewer 
kubectl describe serviceaccount clusterviewer 
kubectl describe secrets clusterviewer-token-fwq2n

创建配置文件:

# 这一步如果有ca则用ca,没有留空即可,之后用证书的token填上即可
kubectl --kubeconfig=kubeconfig config set-cluster kubernetes --server="https://192.168.1.31:6443" --certificate-authority=""

# 使用token替代证书
kubectl --kubeconfig=kubeconfig config set-credentials clusterviewer --token="eyJhbGci......emxC6A"
# 设置上下文
kubectl --kubeconfig=kubeconfig config set-context clusterviewer@kubernetes --cluster=kubernetes --user=clusterviewer
使用账号
kubectl --kubeconfig=kubeconfig config use-context clusterviewer@kubernetes
kubectl --kubeconfig=kubeconfig get pods