1 2 3 |
在一个安全的内网环境中, 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签名的双向数字证书的生成过程如下(二进制安装):
- 为kube-apiserver生成一个数字证书, 并用CA证书签名
- 为kube-apiserver进程配置证书相关的启动参数, 包括CA证书(用于验证客户端证书的签名真伪) 、 自己的经过CA签名后的证书及私钥。
- 为每个访问Kubernetes API Server的客户端(如kubecontroller-manager、 kube-scheduler、 kubelet、 kube-proxy及调用APIServer的客户端程序kubectl等) 进程都生成自己的数字证书, 也都用CA证书签名, 在相关程序的启动参数里增加CA证书、 自己的证书等相关参数。
1.设置kube-apiserver的CA证书相关的文件和启动参数使用OpenSSL工具在Master服务器上创建CA证书和私钥相关的文件:(注意: 在生成ca.crt时, -subj参数中”/CN”的值为Master主机名)
1 2 3 4 5 6 7 8 9 |
注意:生成这些签名证书前,你可以新建一个目录,也可以在默认证书存放目录:/etc/kubernetes/pki 建议不要随便更改目录,使用默认,这样方便管理 mkdir -p /var/run/kubernetes && cd /var/run/kubernetes (新建目录) or cd /etc/kubernetes/pki openssl genrsa -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key -subj "/CN=k8s-master" -days 5000 -out ca.crt openssl genrsa -out server.key 2048 |
2.准备master_ssl.cnf文件, 该文件用于x509 v3版本的证书。 在该文件中主要需要设置Master服务器的hostname(k8s-master) 、 IP地址(192.168.66.20) , 以及Kubernetes Master Service的虚拟服务名称(kubernetes.default等) 和该虚拟服务的ClusterIP地址(10.96.0.1)

master_ssl.cnf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = kubernetes DNS.2 = kubernetes.default DNS.3 = kubernetes.default.svc DNS.4 = kubernetes.default.svc.cluster.local DNS.5 = k8s-master IP.1 = 10.96.0.1 IP.2 = 192.168.66.20 |
基于master_ssl.cnf创建server.csr和server.crt 在生成server.csr时,-subj参数中”/CN”的值需为Master的主机名:
1 2 3 |
openssl req -new -key server.key -subj "/CN=k8s-master" -config master_ssl.cnf -out server.csr openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 5000 -extensions v3_req -extfile master_ssl.cnf -out server.crt |
在全部执行完后会生成6个文件:
1 |
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根证书文件、 服务端证书文件和服务端私
钥文件:
1 2 3 4 5 6 7 8 9 10 11 12 |
打开kube-apiserver配置文件 vim /etc/kubernetes/manifests/kube-apiserver.yaml 添加或者修改: --client-ca-file=/var/run/kubernetes/ca.crt --tls-private-key-file=/var/run/kubernetes/server.key --tls-cert-file=/var/run/kubernetes/server.crt 同时, 可以关闭非安全端口(设置--insecure-port=0) , 设置安全端 口为6443(默认值) : --insecure-port=0 --secure-port=6443 |

然后重启kube-apiserver服务,如果是kubeadmin容器安装的 重启下kubelet
2.设置kube-controller-manager的客户端证书、 私钥和启动参数
1 2 3 |
openssl genrsa -out cs_client.key 2048 openssl req -new -key cs_client.key -subj "/CN=k8s-master" -out cs_client.csr openssl x509 -req -in cs_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out cs_client.crt -days 5000 |
其中, 在生成cs_client.crt时, -CA参数和-CAkey参数使用的是API
Server的ca.crt和ca.key文件。(保持和上面生成在同一目录,即可,否则自行指定ca.crt 和 ca.key 目录也可以)
接下来创建/etc/kubernetes/kubeconfig文件(kube-controller-manager与kube-scheduler共用) , 配置客户端证书等相关参数, 内容如下:
vim /etc/kubernetes/kubeconfig
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
apiVersion: v1 kind: Config users: - name: controllermanager user: client-certificate: /var/run/kubernetes/cs_client.crt client-key: /var/run/kubernetes/cs_client.key clusters: - name: local cluster: certificate-authority: /var/run/kubernetes/ca.crt server: https://192.168.66.20:6443 contexts: - context: cluster: local user: controllermanager name: my-context current-context: my-context |
然后设置kube-controller-manager服务的启动参数:
1 2 3 4 5 |
vim /etc/kubernetes/manifests/kube-controller-manager.yaml --service-account-key-file=/var/run/kubernetes/server.key --root-ca-file=/var/run/kubernetes/ca.crt --kubeconfig=/etc/kubernetes/kubeconfig |
最后重启kube-controller-manager服务
3.设置kube-scheduler启动参数
1 2 3 4 5 6 7 8 |
#kube-scheduler复用controller-manager创建的证书即可 kube-scheduler复用上一步kube-controller-manager创建的客户端证书, 配置启动参数 vim /etc/kubernetes/manifests/kube-scheduler.yaml --kubeconfig=/etc/kubernetes/kubeconfig |
重启kube-scheduler服务。
4.设置每个Node上kubelet的客户端证书、 私钥和启动参数
1 2 3 4 5 6 7 8 9 10 11 |
首先,复制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地址: openssl genrsa -out kubelet_client.key 2048 openssl req -new -key kubelet_client.key -subj "/CN=192.168.66.21" -out kubelet_client.crt openssl -x509 -req -in kubelet_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out kubelet_client.crt -days 5000 将这些文件复制到一个目录下(例如/var/run/kubernetes/) |
接下来创建/etc/kubernetes/kubeconfig文件(kubelet和kube-proxy进程共用) , 配置客户端证书等相关参数, 内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
apiVersion: v1 kind: Config users: - name: kubelet user: client-certificate: /etc/kubernetes/ssl_keys/kubelet_client.crt client-key: /etc/kubernetes/ssl_keys/kubelet_client.key clusters: - name: local cluster: certificate-authority: /var/run/kubernetes/ca.crt server: https://192.168.66.21:6443 contexts: - context: cluster: local user: kubelet name: my-context current-context: my-context |
然后设置kubelet服务的启动参
1 2 3 |
--kubeconfig=/etc/kubelet/kubeconfig 最后重启kubelet服务 |
5.设置kube-proxy的启动参数
1 2 3 4 5 |
kube-proxy复用上一步kubelet创建的客户端证书, 配置启动参数: --kubeconfig=/etc/kubernetes/kubeconfig 重启kube-proxy服务 |
后续节点依照第4步 第5步 操作即可
至此, 一个基于CA的双向数字证书认证的Kubernetes集群环境就搭
建完成了。
6.设置kubectl客户端使用安全方式访问API Server
1 2 3 4 5 6 7 8 9 10 11 |
在使用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) 最后输入需要执行的子命令, 即可对APIServer进行安全访问了: |
1 2 3 4 |
kubectl --server=https://192.168.66.20:6443 --certificate-authority=/etc/kubernetes/ssl_keys/ca.crt --client-certificate=/etc/kubernetes/ssl_keys/cs_client.crt --client-key=/etc/kubernetes/ssl_keys/cs_client.key get nodes |
- 本文固定链接: https://www.yoyoask.com/?p=4108
- 转载请注明: shooter 于 SHOOTER 发表