k8s從1.8版本開始,集群中各個組件需要使用TLS證書對通信進行加密,每個k8s集群都需要有獨立的CA證書體系,這里我們采用比較常用的CloudFlare 的 PKI 工具集 cfssl 來生成 Certificate Authority (CA) 證書和秘鑰文件,CA 是自簽名的證書,用來簽名后續創建的其它 TLS 證書。
使用證書的組件如下:
- etcd:使用 ca.pem、etcd-key.pem、etcd.pem;(etcd對外提供服務、節點間通信(etcd peer)使用同一套證書)
- kube-apiserver:使用 ca.pem、ca-key.pem、kube-apiserver-key.pem、kube-apiserver.pem;
- kubelet:使用 ca.pem ca-key.pem;
- kube-proxy:使用 ca.pem、kube-proxy-key.pem、kube-proxy.pem;
- kubectl:使用 ca.pem、admin-key.pem、admin.pem;
- kube-controller-manager:使用 ca-key.pem、ca.pem、kube-controller-manager.pem、kube-controller-manager-key.pem;
- kube-scheduler:使用ca-key.pem、ca.pem、kube-scheduler-key.pem、kube-scheduler.pem;
1)安裝cfssl
生成證書時可在任一節點完成,這里在k8s-master01主機執行,證書只需要創建一次即可,以后在向集群中添加新節點時只要將 /etc/kubernetes/ssl 目錄下的證書拷貝到新節點上即可。
[root@k8s-master01 ~]# mkdir k8s/cfssl -p [root@k8s-master01 ~]# cd k8s/cfssl/ [root@k8s-master01 cfssl]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 [root@k8s-master01 cfssl]# chmod +x cfssl_linux-amd64 [root@k8s-master01 cfssl]# cp cfssl_linux-amd64 /usr/local/bin/cfssl [root@k8s-master01 cfssl]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 [root@k8s-master01 cfssl]# chmod +x cfssljson_linux-amd64 [root@k8s-master01 cfssl]# cp cfssljson_linux-amd64 /usr/local/bin/cfssljson [root@k8s-master01 cfssl]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 [root@k8s-master01 cfssl]# chmod +x cfssl-certinfo_linux-amd64 [root@k8s-master01 cfssl]# cp cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
2)創建CA根證書
由於維護多套CA實在過於繁雜,這里CA證書用來簽署集群其它組件的證書這個文件中包含后面簽署etcd、kubernetes等其它證書的時候用到的配置
[root@k8s-master01 ~]# vim /opt/k8s/certs/ca-config.json { "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "87600h" } } } }
- ca-config.json:可以定義多個 profiles,分別指定不同的過期時間、使用場景等參數;后續在簽名證書時使用某個 profile;
- signing:表示該證書可用於簽名其它證書;生成的 ca.pem 證書中 CA=TRUE;
- server auth:表示client可以用該 CA 對server提供的證書進行驗證;
- client auth:表示server可以用該CA對client提供的證書進行驗證;
- expiry: 表示證書過期時間,我們設置10年,當然你如果比較在意安全性,可以適當減少
3) 創建 CA 證書簽名請求模板
[root@k8s-master01 ~]# vim /opt/k8s/certs/ca-csr.json { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "ShangHai", "L": "ShangHai", "O": "k8s", "OU": "System" } ] }
4)生成CA證書、私鑰和csr證書簽名請求
該命令會生成運行CA所必需的文件ca-key.pem
(私鑰)和ca.pem
(證書),還會生成ca.csr
(證書簽名請求),用於交叉簽名或重新簽名。
[root@k8s-master01 ~]# cd /opt/k8s/certs/ [root@k8s-master01 certs]# cfssl gencert -initca /opt/k8s/certs/ca-csr.json | cfssljson -bare ca 2019/04/22 15:14:58 [INFO] generating a new CA key and certificate from CSR 2019/04/22 15:14:58 [INFO] generate received request 2019/04/22 15:14:58 [INFO] received CSR 2019/04/22 15:14:58 [INFO] generating key: rsa-2048 2019/04/22 15:14:58 [INFO] encoded CSR 2019/04/22 15:14:58 [INFO] signed certificate with serial number 546879892516414984619692113039590478695154941398
5)分發證書
可采用scp直接傳輸到所有節點,我這里還是采用ansible
[root@k8s-master01 certs]# ansible k8s-all -m copy -a 'src=/opt/k8s/certs/ca.csr dest=/etc/kubernetes/ssl/' [root@k8s-master01 certs]# ansible k8s-all -m copy -a 'src=/opt/k8s/certs/ca-key.pem dest=/etc/kubernetes/ssl/' [root@k8s-master01 certs]# ansible k8s-all -m copy -a 'src=/opt/k8s/certs/ca.pem dest=/etc/kubernetes/ssl/'