一 Kubernetes證書 1.1 TLS Kubernetes系統的各個組件需要使用TLS證書對其通信加密以及授權認證,建議在部署之前先生成相關的TLS證書。 1.2 CA證書創建方式 kubernetes 系統各個組件需要使用TLS證書對通信進行加密,通常可通過以下工具生產自建證書: open ...
一 Kubernetes證書
1.1 TLS
Kubernetes系統的各個組件需要使用TLS證書對其通信加密以及授權認證,建議在部署之前先生成相關的TLS證書。1.2 CA證書創建方式
kubernetes 系統各個組件需要使用TLS證書對通信進行加密,通常可通過以下工具生產自建證書:- openssl
- cfssl
- easyrsa
1.3 Kubernetes組件證書
部署kubernetes組件建議使用TLS雙向認證的,相關組件涉及的主要證書有:- etcd證書:etcd集群之間通信加密使用的TLS證書。
- kube-apiserver證書:配置kube-apiserver組件的證書。
- kube-controller-manager證書:用於和kube-apiserver通信認證的證書。
- kube-scheduler證書:用於和kube-apiserver通信認證的證書。
- kubelet證書【可選,非必需】:用於和kube-apiserver通信認證的證書,如果使用TLS Bootstarp認證方式,將沒有必要配置。
- kube-proxy證書【可選,非必需】:用於和kube-apiserver通信認證的證書,如果使用TLS Bootstarp認證方式,將沒有必要配置。
二 openssl生成證書
2.1 openssl創建證書
1 [root@master ~]# MASTER_IP=172.24.8.71 #定義MASTER_IP 2 [root@master ~]# mkdir cert #建議創建獨立存儲證書的目錄 3 [root@master ~]# cd cert 4 [root@master cert]# openssl genrsa -out ca.key 2048 #生成一個 2048 bit的ca.key 5 [root@master cert]# openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 10000 -out ca.crt #根據 ca.key 生成一個 ca.crt(使用 -days 設置證書的有效時間) 6 [root@master cert]# openssl genrsa -out server.key 2048 #生成一個 2048 bit 的 server.key 7 [root@master cert]# openssl req -new -key server.key -subj "/CN=${MASTER_IP}" -out server.csr #根據 server.key 生成一個 server.csr 8 [root@master cert]# openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 10000 #根據 ca.key、ca.crt 和 server.csr 生成 server.crt 9 [root@master cert]# openssl x509 -noout -text -in ./server.crt
三 cfssl生成證書
3.1 cfssl創建證書
1 [root@master ~]# curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl #下載cfssl軟體 2 [root@master ~]# chmod u+x /usr/local/bin/cfssl 3 [root@master ~]# curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson #下載json模板 4 [root@master ~]# chmod u+x /usr/local/bin/cfssljson 5 [root@master ~]# curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo 6 [root@master ~]# chmod u+x /usr/local/bin/cfssl-certinfo 7 [root@master ~]# mkdir cert 8 [root@master ~]# cd cert/ 9 [root@master cert]# cfssl print-defaults config > config.json 10 [root@master cert]# cfssl print-defaults csr > csr.json #創建模版配置json文件 11 [root@master cert]# cp config.json ca-config.json #複製一份作為CA的配置文件 12 [root@master cert]# vi ca-config.json 13 { 14 "signing": { 15 "default": { 16 "expiry": "168h" 17 }, 18 "profiles": { 19 "kubernetes": { 20 "expiry": "8760h", 21 "usages": [ 22 "signing", 23 "key encipherment", 24 "server auth" 25 "client auth" 26 ] 27 } 28 } 29 } 30 }欄位解釋: config.json:可以定義多個profiles,分別指定不同的過期時間、使用場景等參數;後續在簽名證書時使用某個profile;
- signing: 表示該證書可用於簽名其它證書;生成的ca.pem 證書中CA=TRUE;
- server auth: 表示client 可以用該CA 對server 提供的證書進行校驗;
- client auth: 表示server 可以用該CA 對client 提供的證書進行驗證。
1 [root@master cert]# cp csr.json ca-csr.json #複製一份作為CA的配置文件 2 [root@master cert]# vi ca-csr.json 3 { 4 "CN": "kubernetes", 5 "key": { 6 "algo": "rsa", 7 "size": 2048 8 }, 9 "names": [ 10 { 11 "C": "CN", 12 "ST": "Shanghai", 13 "L": "Shanghai", 14 "O": "k8s", 15 "OU": "System" 16 } 17 ] 18 }欄位解釋:
- CN: Common Name,kube-apiserver 從證書中提取該欄位作為請求的用戶名(User Name);瀏覽器使用該欄位驗證網站是否合法;
- C:country;
- ST:state;
- L:city;
- O: Organization,kube-apiserver 從證書中提取該欄位作為請求用戶所屬的組(Group);
- OU:organization unit。
1 [root@master cert]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca #生成CA密鑰(ca-key.pem)和證書(ca.pem)
提示:生成證書後,Kubernetes集群需要雙向TLS認證,則可將ca-key.pem和ca.pem拷貝到所有要部署的機器的/etc/kubernetes/ssl目錄下。
四 easyrsa生成證書
4.1 easyrsa創建證書
1 [root@master ~]# mkdir cert 2 [root@master ~]# curl -LO https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz #下載easyrsa軟體 3 [root@master ~]# tar xzf easy-rsa.tar.gz 4 [root@master ~]# cd easy-rsa-master/easyrsa3 5 [root@master easyrsa3]# ./easyrsa init-pki 6 [root@master easyrsa3]# MASTER_IP=172.24.8.71 #定義MASTER_IP 7 [root@master easyrsa3]# ./easyrsa --batch "--req-cn=${MASTER_IP}@`date +%s`" build-ca nopass #生成 CA解釋: --batch:設置為自動模式; --req-cn:設置預設的 CN
1 [root@master easyrsa3]# ./easyrsa --subject-alt-name="IP:${MASTER_IP}" build-server-full server nopass #生成伺服器證書和密鑰
解釋:
build-server-full [文件名]:生成一個鍵值對,在本地為客戶端和伺服器簽名。
1 [root@master easyrsa3]# cp pki/ca.crt pki/issued/server.crt pki/private/server.key /root/cert/ #複製相關證書
提示:生成證書後,Kubernetes集群可通過如下配置使用證書:
- --client-ca-file=/root/cert/ca.crt
- --tls-cert-file=/root/cert/server.crt
- --tls-private-key-file=/root/cert/server.key
五 相關證書及配置項
5.1 API Server 證書
API Server 證書配置為如下兩個選項:- --tls-cert-file string
- --tls-private-key-file string
5.2 Client CA 證書
- --client-ca-file string
5.3 請求頭證書
API Server 支持多種認證方式的,其中一種就是使用 HTTP 頭中的指定欄位來進行認證,相關配置如下:- --requestheader-allowed-names stringSlice
- --requestheader-client-ca-file string
5.4 kubelet證書
對於 Kubelet 組件,API Server 單獨提供了證書配置選項,從而指定 API Server 與 Kubelet 通訊所使用的證書以及其簽署的 CA。同時這個 CA 可以完全獨立與上述其他CA。同時 Kubelet 組件也提供了反向設置的相關選項: # API Server- --kubelet-certificate-authority string
- --kubelet-client-certificate string
- --kubelet-client-key string
- --client-ca-file string
- --tls-cert-file string
- --tls-private-key-file string
- --service-account-key-file stringArray
- --service-account-signing-key-file string