基于CA签名的双向数字证书认证方式
在一个安全的内网环境中,Kubernetes的各个组件与Master之间可 以通过kube-apiserver的非安全端口http://kube-apiserver-ip:8080进行访 问。
但如果API Server需要对外提供服务,或者集群中的某些容器也需 要访问API Server以获取集群中的某些信息,则更安全的做法是启用 HTTPS安全机制。Kubernetes提供了基于CA签名的双向数字证书认证方 式和简单的基于HTTP Base或Token的认证方式,其中CA证书方式的安 全性最高。本节先介绍如何以CA证书的方式配置Kubernetes集群,
要求 Master上的kube-apiserver、kube-controller-manager、kube-scheduler进程 及各Node上的kubelet、kube-proxy进程进行CA签名双向数字证书安全设 置。
基于CA签名的双向数字证书的生成过程如下。
(1)为kube-apiserver生成一个数字证书,并用CA证书签名。
(2)为kube-apiserver进程配置证书相关的启动参数,包括CA证书 (用于验证客户端证书的签名真伪)、自己的经过CA签名后的证书及 私钥。
(3)为每个访问Kubernetes API Server的客户端(如kubecontroller-manager、kube-scheduler、kubelet、kube-proxy及调用API Server的客户端程序kubectl等)进程都生成自己的数字证书,也都用CA 证书签名,在相关程序的启动参数里增加CA证书、自己的证书等相关 参数。
1.设置kube-apiserver的CA证书相关的文件和启动参数 使用OpenSSL工具在Master服务器上创建CA证书和私钥相关的文 件:
注意:在生成ca.crt时,-subj参数中“/CN”的值为Master主机名。
准备master_ssl.cnf文件,该文件用于x509 v3版本的证书。在该文件 中主要需要设置Master服务器的hostname(k8s-master)、IP地址 (192.168.18.3),以及Kubernetes Master Service的虚拟服务名称 (kubernetes.default等)和该虚拟服务的ClusterIP地址(169.169.0.1)。
基于master_ssl.cnf创建server.csr和server.crt文件。在生成server.csr 时,-subj参数中“/CN”的值需为Master的主机名:
在全部执行完后会生成6个文件:ca.crt、ca.key、ca.srl、server.crt、 server.csr、server.key。 将这些文件复制到一个目录下(例如/var/run/kubernetes/),然后设 置kube-apiserver的三个启动参数“--client-ca-file”“--tls-cert-file”和“--tlsprivate-key-file”,分别代表CA根证书文件、服务端证书文件和服务端私 钥文件:
同时,可以关闭非安全端口(设置--insecure-port=0),设置安全端 口为6443(默认值):
最后重启kube-apiserver服务。
2.设置kube-controller-manager的客户端证书、私钥和启动参数 代码如下
其中,在生成cs_client.crt时,-CA参数和-CAkey参数使用的是API Server的ca.crt和ca.key文件。然后将这些文件复制到一个目录下(例 如/var/run/kubernetes/)。
接下来创建/etc/kubernetes/kubeconfig文件(kube-controller-manager 与kube-scheduler共用),配置客户端证书等相关参数,内容如下:
然后设置kube-controller-manager服务的启动参数:
最后重启kube-controller-manager服务。
3、设置kube-scheduler启动参数
kube-scheduler复用上一步kube-controller-manager创建的客户端证 书,配置启动参数:
重启kube-scheduler服务。
4.设置每个Node上kubelet的客户端证书、私钥和启动参数
首先,复制kube-apiserver的ca.crt和ca.key文件到Node上,在生成 kubelet_client.crt时-CA参数和-CAkey参数使用的是API Server的ca.crt和 ca.key文件;在生成kubelet_client.csr时,将-subj参数中的“/CN”设置为 本Node的IP地址:
将这些文件复制到一个目录下(例如/var/run/kubernetes/)。 接下来创建/etc/kubernetes/kubeconfig文件(kubelet和kube-proxy进 程共用),配置客户端证书等相关参数,内容如下:
5.设置kube-proxy的启动参数
kube-proxy复用上一步kubelet创建的客户端证书,配置启动参数:
重启kube-proxy服务。 至此,一个基于CA的双向数字证书认证的Kubernetes集群环境就搭 建完成了。
6.设置kubectl客户端使用安全方式访问API Server
在使用kubectl对Kubernetes集群进行操作时,默认使用非安全端口 8080对API Server进行访问,也可以设置为安全访问API Server的模式, 需要设置3个证书相关的参数“—certificate-authority”“--clientcertificate”和“--client-key”,分别表示用于CA授权的证书、客户端证书 和客户端密钥。
◎ --certificate-authority:使用为kube-apiserver生成的ca.crt文件。
◎ --client-certificate:使用为kube-controller-manager生成的 cs_client.crt文件。
◎ --client-key:使用为kube-controller-manager生成的cs_client.key 文件。
同时,指定API Server的URL地址为HTTPS安全地址(例如 https://k8s-master:443),最后输入需要执行的子命令,即可对API Server进行安全访问了:
除了提供了基于CA的双向数字证书认证方式,Kubernetes也提供了 基于HTTP Base或Token的简单认证方式。各组件与API Server之间的通 信方式仍然采用HTTPS,但不使用CA数字证书。