基于角色的访问控制
kubectl 连接服务器是怎么认证的?,所有连往apiserver的客户端在认证时如果我们要基于配置文件来保存客户端的认证信息而不是通过serviceAccount 使用token方式来认证的话我们就应该给他配置为一个配置文件,k8s集群的所有除了apiserver组件比如controler-manager等等都需要连入apiserver,都需要被apiserver所认证,所以他们都算的上是apiserver的客户端,包括kubectl,每一个组件为了能够连入正确的集群,能提供正确的账号,证书,私钥等认证时的信息我们需要把这个配置信息保存到一个文件,这个配置文件有一个称呼就叫kubeconfig,这个kubeconfig是apiserver客户端连入apiserver时使用的认证格式的客户端配置文件,我们的kubectl也是这样的客户端,他也有自己的配置文件,要打印配置文件内容可以用kubectl config view命令来查看,可以看出其也是一个标准的k8s资源对象。
kubectl config view
可以看到这个配置文件不单单让你访问一个k8s集群的,如果你有多个k8s集群却只有一台主机做客户端,为了让我们一个kubectl能控制多个集群,我们可以这样干,提供配置文件第一叫集群列表,这样我们就有了多个集群,对每一个集群来讲我们可能会用到多个账号,也有可能都使用的admin,于是我们事先定义好几个账号,因此我们接下来定义context,其指明我们用哪个账号访问哪个集群。一个context就包含一个用户名和集群,它用来指明用哪个账号访问哪个集群
我们自己做一个证书和私钥作为另外一个账号去认证到k8s apiserver上来,来了解一下他是怎么生成的。
- 先创建一个私钥生成一个签署证书,证书中的证书持有者和用户名必须保持一致,因为证书持有者的名称就是我们的用户账号名,我们服务器账号就是证书的subject。
- 首先,我们做一个私钥
cd /etc/kubernetes/pki/ ls (umask 077; openssl genrsa -out wohaoshuai.key 2048) ls
接下来我们基于这个私钥去生成一个证书,由我们的ca.crt来签署 ( 名称就是你的用户账号名字 )
openssl req -new -key wohaoshuai.key -out wohaoshuai.csr -subj "/CN=wohaoshuai"
接下来就可以签证了,用证书去签
openssl x509 -req -in wohaoshuai.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out wohaoshuai.crt -days 365
用kubeadm部署集群有一个问题,证书有效期为1000天还是三年,证书过期就比较麻烦
现在证书已经有了,自签证书,当然也可以去查看证书信息
openssl x509 -in wohaoshuai.crt -text -noout
接下来我们把这个用户账号信息给他添加到我们去认证为连接k8s集群的信息。而且他是由同一个k8s集群的CA授权的,所以他创建的证书认证是不会有问题的。
我们接下来创建一个用户
- wohaoshuai(用户的标识符)
- --embed-certs=true (将相应信息隐藏)
kubectl config set-credentials wohaoshuai --client-certificate=/etc/kubernetes/pki/wohaoshuai.crt --client-key=/etc/kubernetes/pki/wohaoshuai.key --embed-certs=true
查看配置
kubectl config view
设定上下文让wohaoshuai也能访问kubernetes
kubectl config set-context [email protected] --cluster=kubernetes --user=wohaoshuai
再次查看配置
kubectl config view
现在切换到wohaoshuai账户,这个账号是没有管理员的权限的
kubectl config use-context [email protected]
执行一些操作(可以看到没有权限)
kubectl get pods
当然我们少给大家演示了一步,就是设置cluster,如果我们新生成一个配置文件或者在当前配置文件中新定义一个集群,设置集群时方法其实也比较简单,第一,指定集群名,然后指定集群的CA的证书。因为我们要使用这个CA证书验证集群APIserver发过来的证书的,那么我们怎么去信任这个服务器证书呢?所以我们指明证书时apiserver发过来信息做认证时它才能对他完成认证。所以最关键就是我们要去设定哪个集群指明集群名字,指明集群服务访问地址,指明集群证书。即服务上级机构的证书。也就是当前pki路径下的ca.crt,所以我们最简单的办法就是我们指明server是谁,指明ca的证书是谁,指明把证书隐藏起来(--embed-certs=true)就行了
首先将用户换成默认的kubernetes-admin
Sets a cluster entry in kubeconfig. Specifying a name that already exists will merge new fields on top of existing values for those fields. Examples: # Set only the server field on the e2e cluster entry without touching other values. kubectl config set-cluster e2e --server=https://1.2.3.4 # Embed certificate authority data for the e2e cluster entry kubectl config set-cluster e2e --certificate-authority=~/.kube/e2e/kubernetes.ca.crt # Disable cert checking for the dev cluster entry kubectl config set-cluster e2e --insecure-skip-tls-verify=true Options: --embed-certs=false: embed-certs for the cluster entry in kubeconfig Usage: kubectl config set-cluster NAME [--server=server] [--certificate-authority=path/to/certificate/authority] [--insecure-skip-tls-verify=true] [options] Use "kubectl options" for a list of global command-line options (applies to all commands). [[email protected] ~]# cd /etc/kubernetes/pki/ && ls apiserver.crt apiserver-etcd-client.key apiserver-kubelet-client.crt ca.crt ca.srl front-proxy-ca.crt front-proxy-client.crt sa.key wohaoshuai.crt wohaoshuai.key apiserver-etcd-client.crt apiserver.key apiserver-kubelet-client.key ca.key etcd front-proxy-ca.key front-proxy-client.key sa.pub wohaoshuai.csrkubectl config set-cluster --help
执行命令
kubectl config use-context [email protected]
现在我们设置一个集群,我们新定义一个配置文件,我们不使用默认配置文件,我们刚刚所有设置都是保存在默认配置文件。kubectl默认加载配置文件路径为当前用户家目录下的.kube这个目录中的config文件,如果想把它保存在别的位置也可以,使用--kubeconfig选项即可。
kubectl config set-cluster mycluster --kubeconfig=/tmp/test.config --server="https://192.168.10.10:6443" --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-cer kubectl config view --kubeconfig=/tmp/test.config