Kubernetes集群安装 (五)


Kubernetes集群安全设置之基于CA签名的双向数字证书认证方式


在一个安全的内网环境中,kubernetes的各个组件与master之间通过apiserver的非安全端口8080进行通信,但如果apiserver需要对外提供服务,或者集群中的某些容器也需要访问apiserver以获取集群中的某些信息,更安全的做法是启用https安全机制。kubernetes提供基于CA证书的双向数字认证方式和简单的基于HTTP BASE 或TOKEN的认证方式,其中CA证书方式的安全性最高

基于CA签名的双向数字证书的生成过程如下

(1)为apiserver生成一个数字证书,并用CA进行签名

(2)为apiserver进程配置证书相关的启动参数,包括CA证书、自己的经过CA签名后的证书及私钥

(3)为每个访问API Server的客户端进程,生成自己的数字证书,也都用CA证书进行签名,在相关程序的启动参数里增加CA证书、自己的证书等相关参数


1.设置kube-apiserver的CA证书相关的文件和启动参数,使用OpenSSL工具在Master上创建CA证书和私钥文件

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

注意:生成ca.crt时,-subj参数中“/CN”的值为Master主机名

准备master_ssl.cnf文件,该文件用于x509 v3版本的证书,在该文件中主要需要设置Master服务器的hostname(k8s-master)、IP地址(115.28.85.91),以及Kubernetes Master Service的虚拟服务名称(kubernetes.default等)和该虚拟服务的ClusterIP地址(169.169.0.1)

vim master_ssl.cnf
##
[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 = 169.169.0.1
IP.2 = 115.28.85.91

基于Master_ssl.cnf生成server.csr和server.crt文件,生成时 -subj 参数中的“/CN”指定的名字应为master所在主机的主机名

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个文件:

ca.crt ca.key master_ssl.cnf server.crt server.csr server.key

将文件复制到目录/etc/kubernetes/ssl,此目录可自定义

mkdir /etc/kubernetes/ssl
mv * /etc/kubernetes/ssl/

设置kube-apiserver的三个启动参数“--client-ca-file”、“--tls-cert-file”、“--tls-private-key-file”,分别代表CA根证书文件、服务端证书文件和服务端私钥文件:

##
#CA根证书文件
--client-ca-file=/etc/kubernetes/ssl/ca.crt
#服务端私钥文件
--tls-private-key-file=/etc/kubernetes/ssl/server.key
#服务端证书文件
--tls-cert-file=/etc/kubernetes/ssl/server.crt
> 同时可以关闭非安全端口8080,设置安全端口6443(默认值)
--insecure-port=0 
--secure-port=6443

重启kube-apiserver服务

systemctl restart kube-apiserver

2.设置kube-controller-manager的客户端证书、私钥和启动参数

生成客户端证书时,-CA参数和-CAkey参数使用的是apiserver的ca.crt和ca.key文件,然后将这些文件复制到/etc/kubernetes/ssl,接下来创建的配置文件kubeconfig,kube-controller-manager和kube-scheduler共用。

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

创建配置文件

vim /etc/kubernetes/kubeconfig
##
apiVersion: v1
kind: Config
users:
- name: controllermanager
  user:
    client-certificate: /etc/kubernetes/ssl/cs_client.crt
    client-key: /etc/kubernetes/ssl/cs_client.key
clusters:
- name: local
  cluster:
    certificate-authority: /etc/kubernetes/ssl/ca.crt
contexts:
- context:
    cluster: local
    user: controllermanager
  name: my-context
current-context: my-context

设置kube-controller-manager的服务启动参数,注意,master的地址为https安全服务地址,不适用非安全地址http://115.28.85.91:8080

vim /etc/kubernetes/controller-manager
##
--master=https://115.28.85.91:6443
--service-account-private-key-file=/etc/kubernetes/ssl/server.key
--root-ca-file=/etc/kubernetes/ssl/ca.crt
--kubeconfig=/etc/kubernetes/kubeconfig

3.设置kube-scheduler启动参数

vim /etc/kubernetes/scheduler
##
--master=https://115.28.85.91:6443
--kubeconfig=/etc/kubernetes/kubeconfig

重启服务

systemctl daemon-reload
systemctl restart kube-scheduler kube-controller-manager

4.设置没太Node上的kubelet的客户端证书、私钥和启动参数

首先复制kube-apiserver的ca.crt和ca.key文件到Node上,如果通过私钥访问node,需要设置私钥访问权限为600

scp -i node.pem /etc/kubernetes/ssl/ca.crt root@47.90.34.138:/etc/kubernetes/ssl
scp -i node.pem /etc/kubernetes/ssl/ca.key root@47.90.34.138:/etc/kubernetes/ssl

在生成kubelet_client.crt时-CA参数和-CAkey参数使用的是apiserver的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=47.90.34.138" -out kubelet_client.csr
 openssl x509 -req -in kubelet_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out kubelet_client.crt -days 5000

将文件服务复制到/etc/kubernetes/ssl中,执行完成后所有文件:

ca.crt ca.key ca.srl kubelet_client.crt kubelet_client.csr kubelet_client.key

编辑/etc/kubernetes/kubeconfig.yaml文件,kubelet和kube-proxy共用此配置文件。

vim /etc/kubernetes/kubeconfig.yaml
##
apiVersion: v1
kind: Config
users:
- name: kubelet
  user:
    client-certificate: /etc/kubernetes/ssl/kubelet_client.crt
    client-key: /etc/kubernetes/ssl/kubelet_client.key
clusters:
- name: local
  cluster:
    server: https://115.28.85.91:6443
    certificate-authority: /etc/kubernetes/ssl/ca.crt
contexts:
- context:
    cluster: local
    user: kubelet
  name: my-context
current-context: my-contextku

设置kubelet服务的启动参数

vim /etc/kubernetes/kubelet
##
--kubeconfig=/etc/kubernetes/kubeconfig.yaml

5.设置kube-proxy服务启动参数

vim /etc/kubernetes/proxy 
##
--master=https://115.28.85.91:6443 --kubeconfig=/etc/kubernetes/kubeconfig.yaml

6.重启服务

systemctl daemon-reload
systemctl restart kubelet kube-proxy

验证

curl https://115.28.85.91:6443/api/v1/nodes --cert /etc/kubernetes/ssl/cs_client.crt --key /etc/kubernetes/ssl/cs_client.key --cacert /etc/kubernetes/ssl/ca.crt -k


kubectl --server=https://115.28.85.91:6443 --certificate-authority=/etc/kubernetes/ssl/ca.crt --client-certificate=/etc/kubernetes/ssl/cs_client.crt --client-key=/etc/kubernetes/ssl/cs_client.key get cs


kubectl --server=https://115.28.85.91:6443 --certificate-authority=/etc/kubernetes/ssl/ca.crt --client-certificate=/etc/kubernetes/ssl/cs_client.crt --client-key=/etc/kubernetes/ssl/cs_client.key get nodes

注意:

在Master节点上开启6443端口的访问权限

声明:初心|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - Kubernetes集群安装 (五)


愿你勿忘初心,并从始至终