3 kubeconfig基于User认证实践

3.1 kubeconfig的作用

由于APIServer是基于无状态HTTP/HTTPS协议实现,所以每次与集群进行交互时都需要进行身份认证,通常都是使用证书进行认证,其认证所需要的信息都会存放在kubeconfig文件中。

kubeconfig基于User认证实践_用户名

客户端程序可以通过默认路径、--kubeconfig选项或者KUBECONFIG环境变量定义要加载的kubeconfig文件,从而能够在每次的请求通过APIServer的认证。

3.2 kubeconfig文件格式

kubeconfig文件主要分为四部分: cluster、users、context、current-context

  • cluster: 集群以列表形式定义在cluster配置段中,每个列表项代表一个Kubernetes集群,并拥有名称标识;
  • users: 访问集群的身份都定义在users配置段中,每个列表项代表一个能够认证到某个Kubernetes集群的凭据;
  • context: 将user与cluster二者之间的映射关系进行绑定,而后定义在context配置中;
  • current-context: 用于指定当前集群默认使用的context,表示当前正在使用哪个用户操作哪个集群;

默认使用kubeadm初始化Kubernetes集群过程中,在Master节点上生成的/etc/kubernetes/admin.conf文件就是一个kubeconfig格式的文件,它由kubeadm命令自动生成,可由kubectl加载后接入当前集群的APIServer。

默认kubectl加载的kubeconfig文件默认路径为$HOME/.kube/config,当然也可以通过--kubeconfig选项,或KUBECONFIG环境变量将其修改为其他路径。

kubectl config view命令能打印kubeconfig文件的内容,其中包含了集群列表、用户列表、上下文列表以及当前使用的上下文context等。

kubeconfig基于User认证实践_加载_02

3.3 自定义kubeconfig实践

创建一个UserAccount的用户,然后添加到kubeconfig文件中,最后通过kubectl加载kubeconfig文件中对应的证书信息,然后尝试认证到APIServer。

UserAccount用户不可以直接创建,需要创建证书文件,在证书申请文件中填写好证书对应的CN,也就是我们的用户名称,而后经由APIServer信任的CA(/etc/kubernetes/pki/ca.crt)签署证书请求文件。最后与APIServer进行认证时,APIServer会获取证书中的CN,以判断用户是否是合法的。

3.3.1 加入已有集群配置文件

1、创建证书私钥文件

mkdir /root/certs
umask 077
openssl genrsa -out /root/certs/qingchen.key 2048

2、创建证书签署请求文件,-subj选项中的CN的值将被APIServer识别为用户名,O的值将被识别为用户组

openssl req -new \
-key /root/certs/qingchen.key \
-out /root/certs/qingchen.csr \
-subj "/CN=qingchen/O=dev"

3、使用Kubernetes-ca的身份对文件进行签署

openssl x509 -req -days 3650 \
-in /root/certs/qingchen.csr \
-CA /etc/kubernetes/pki/ca.crt \
-CAkey /etc/kubernetes/pki/ca.key \
-CAcreateserial \
-out /root/certs/qingchen.crt

4、根据x509数字证书及私钥创建身份凭据

kubectl config set-credentials qingchen \
--client-certificate=/root/certs/qingchen.crt \
--client-key=/root/certs/qingchen.key \
--embed-certs=true

5、配置context上下文,以qingchen身份凭据访问已定义的Kubernetes集群,context名称为qingchen@kubernetes

kubectl config set-context qingchen@kubernetes \
--cluster=kubernetes \
--user=qingchen

6、将当前上下文切换为qingchen@kubernetes

kubectl config use-context qingchen@kubernetes

kubeconfig基于User认证实践_加载_03

7、测试qingchen用户能否通过APIServer认证

kubeconfig基于User认证实践_配置文件_04

#虽然报错,但是qingchen用户可以被APIServer正确认证

3.3.2 创建新的集群配置文件

1、添加集群配置,设定集群名称,设定APIServer地址,以及APIServer信任的CA证书

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

2、添加身份凭据,使用CA已签署的客户端证书即可

kubectl config set-credentials qingchen \
--kubeconfig=/tmp/config \
--client-certificate=/root/certs/qingchen.crt \
--client-key=/root/certs/qingchen.key \
--embed-certs=true

3、将qingchen用户与aliyun_k8s集群建立映射关系

kubectl config set-context qingchen@aliyun_k8s \
--cluster=aliyun_k8s \
--user=qingchen \
--kubeconfig=/tmp/config

4、设定默认上下文为qingchen@aliyun_k8s

kubectl config use-context qingchen@aliyun_k8s --kubeconfig=/tmp/config

5、qingchen用户未设置任何授权,但它能够被系统识别为qingchen用户,这表示身份认证正常,后续就可以授权

kubectl get nodes --kubeconfig=/tmp/config --context="qingchen@aliyun_k8s"

kubeconfig基于User认证实践_加载_05