03 生成集群SSL证书
集群所需的 SSL 证书均通过 cfssl 工具包来生成。
以下内容均在本地主机上操作,cfssl 工具包也是下载到本地主机里。
3.1 生成 CA 证书
生成 CA 证书需要签名请求(CSR)文件,这些文件 k8s-deploy 已经提供,这里直接通过 cfssl 就可以生成 CA 证书。
执行命令后会生成 3 个文件:ca.csr ca.pem ca-key.pem
,集群只需要其中 2 个:ca.pem
和 ca-key.pem
,将这 2 个文件分发到 3 台服务器上。
wget https://github.com/pjgmow/cfssl/releases/download/v1.2.0/cfssl-all-v1.2.0-linux-amd64.tar.gz
tar xf cfssl-all-v1.2.0-linux-amd64.tar.gz
cp cfssl-all-v1.2.0-linux-amd64/* /usr/local/bin/
cd /data/k8s-deploy/tls-csr
cfssl gencert -initca ./ca-csr.json | cfssljson -bare ca
#K8S_HOST=(k8s-master-01 k8s-master-02 k8s-master-03)
#for h in ${K8S_HOST[@]};do scp ca*.pem root@$h:/etc/kubernetes/tls/;done
scp ca*.pem root@k8s-master-01:/etc/kubernetes/tls/
scp ca*.pem root@k8s-master-02:/etc/kubernetes/tls/
scp ca*.pem root@k8s-master-03:/etc/kubernetes/tls/
3.2 生成 etcd 证书
执行命令后会生成 3 个文件:etcd.csr etcd.pem etcd-key.pem
,集群只需要其中 2 个:etcd.pem
和 etcd-key.pem
,将这 2 个文件分发到 3 台服务器上。
# ETCD_CLUSTER_IP 是 etcd 集群的 IP 地址
# 这里是 192.168.3.201、192.168.3.202、192.168.3.203 3 台服务器组成集群
cd /data/k8s-deploy/tls-csr
ETCD_CLUSTER_IP=127.0.0.1,192.168.3.201,192.168.3.202,192.168.3.203
cfssl gencert -hostname=${ETCD_CLUSTER_IP} \
-ca=./ca.pem \
-ca-key=./ca-key.pem \
-config=./ca-config.json \
-profile=kubernetes ./etcd-csr.json | cfssljson -bare etcd
#K8S_HOST=(k8s-master-01 k8s-master-02 k8s-master-03)
#for h in ${K8S_HOST[@]};do scp etcd*.pem root@$h:/etc/kubernetes/tls/;done
scp etcd*.pem root@k8s-master-01:/etc/kubernetes/tls/
scp etcd*.pem root@k8s-master-02:/etc/kubernetes/tls/
scp etcd*.pem root@k8s-master-03:/etc/kubernetes/tls/
3.3 生成 kube-apiserver 证书
也一样会生成 3 个文件,集群只需要其中 2 个:kube-apiserver.pem
和 kube-apiserver-key.pem
,将这 2 个文件分发到 3 台服务器上。
# KUBE_APISERVER_IP 是 kube-apiserver 组件的 IP 地址和主机名
# 这里是 192.168.3.201、192.168.3.202、192.168.3.203 3 台服务器作为 master 节点
# 10.0.0.1 是 kubernetes Service资源的 IP 地址,也要加进来
cd /data/k8s-deploy/tls-csr
KUBE_APISERVER_IP=127.0.0.1,10.0.0.1,192.168.3.201,192.168.3.202,192.168.3.203,kubernetes,kubernetes.default,kubernetes.default.svc,kubernetes.default.svc.cluster,kubernetes.default.svc.cluster.local
cfssl gencert -hostname=${KUBE_APISERVER_IP} \
-ca=./ca.pem \
-ca-key=./ca-key.pem \
-config=./ca-config.json \
-profile=kubernetes ./kube-apiserver-csr.json | cfssljson -bare kube-apiserver
#K8S_HOST=(k8s-master-01 k8s-master-02 k8s-master-03)
#for h in ${K8S_HOST[@]};do scp kube-apiserver*.pem root@$h:/etc/kubernetes/tls/;done
scp kube-apiserver*.pem root@k8s-master-01:/etc/kubernetes/tls/
scp kube-apiserver*.pem root@k8s-master-02:/etc/kubernetes/tls/
scp kube-apiserver*.pem root@k8s-master-03:/etc/kubernetes/tls/
3.4 生成 admin 证书
admin 证书主要是用来创建集群管理员的 kubeconfig 凭证文件的,kubectl 命令连接 kube-apiserver 要用到 kubeconfig 里面的内容,证书签名请求文件不需要 hosts 字段。
admin.pem
和 admin-key.pem
这 2 个文件不需要分发到服务器上。
cd /data/k8s-deploy/tls-csr
cfssl gencert \
-ca=./ca.pem \
-ca-key=./ca-key.pem \
-config=./ca-config.json \
-profile=kubernetes ./admin-csr.json | cfssljson -bare admin
3.5 生成 kube-controller-manager 证书
将 kube-controller-manager.pem
和 kube-controller-manager-key.pem
这 2 个文件分发到 3 台服务器上。
# KUBE_CONTROLLER_MANAGER_IP 是 kube-controller-manager 组件的 IP 地址
# 这里是 192.168.3.201、192.168.3.202、192.168.3.203 3 台服务器作为 master 节点
cd /data/k8s-deploy/tls-csr
KUBE_CONTROLLER_MANAGER_IP=127.0.0.1,192.168.3.201,192.168.3.202,192.168.3.203
cfssl gencert -hostname=${KUBE_CONTROLLER_MANAGER_IP} \
-ca=./ca.pem \
-ca-key=./ca-key.pem \
-config=./ca-config.json \
-profile=kubernetes ./kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager
#K8S_HOST=(k8s-master-01 k8s-master-02 k8s-master-03)
#for h in ${K8S_HOST[@]};do scp kube-controller-manager*.pem root@$h:/etc/kubernetes/tls/;done
scp kube-controller-manager*.pem root@k8s-master-01:/etc/kubernetes/tls/
scp kube-controller-manager*.pem root@k8s-master-02:/etc/kubernetes/tls/
scp kube-controller-manager*.pem root@k8s-master-03:/etc/kubernetes/tls/
3.6 生成 kube-scheduler 证书
将 kube-scheduler.pem
和 kube-scheduler-key.pem
这 2 个文件分发到 3 台服务器上。
# KUBE_SCHEDULER_IP 是 kube-scheduler 组件的 IP 地址
# 这里是 192.168.3.201、192.168.3.202、192.168.3.203 3 台服务器作为 master 节点
cd /data/k8s-deploy/tls-csr
KUBE_SCHEDULER_IP=127.0.0.1,192.168.3.201,192.168.3.202,192.168.3.203
cfssl gencert -hostname=${KUBE_SCHEDULER_IP} \
-ca=./ca.pem \
-ca-key=./ca-key.pem \
-config=./ca-config.json \
-profile=kubernetes ./kube-scheduler-csr.json | cfssljson -bare kube-scheduler
#K8S_HOST=(k8s-master-01 k8s-master-02 k8s-master-03)
#for h in ${K8S_HOST[@]};do scp kube-scheduler*.pem root@$h:/etc/kubernetes/tls/;done
scp kube-scheduler*.pem root@k8s-master-01:/etc/kubernetes/tls/
scp kube-scheduler*.pem root@k8s-master-02:/etc/kubernetes/tls/
scp kube-scheduler*.pem root@k8s-master-03:/etc/kubernetes/tls/
3.7 生成 kube-proxy 证书
kube-proxy 是 Node 节点组件,证书签名请求文件也不需要 hosts 字段。
将 kube-proxy.pem
和 kube-proxy-key.pem
这 2 个文件分发到 3 台服务器上。
cd /data/k8s-deploy/tls-csr
cfssl gencert \
-ca=./ca.pem \
-ca-key=./ca-key.pem \
-config=./ca-config.json \
-profile=kubernetes ./kube-proxy-csr.json | cfssljson -bare kube-proxy
#K8S_HOST=(k8s-master-01 k8s-master-02 k8s-master-03)
#for h in ${K8S_HOST[@]};do scp kube-proxy*.pem root@$h:/etc/kubernetes/tls/;done
scp kube-proxy*.pem root@k8s-master-01:/etc/kubernetes/tls/
scp kube-proxy*.pem root@k8s-master-02:/etc/kubernetes/tls/
scp kube-proxy*.pem root@k8s-master-03:/etc/kubernetes/tls/