004.Kubernetes二進位部署創建證書

  • 2019 年 11 月 15 日
  • 筆記

一 創建CA證書和密鑰

1.1 安裝cfssl工具集

  1 [root@k8smaster01 ~]# mkdir -p /opt/k8s/cert    2    3 [root@k8smaster01 ~]# curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /opt/k8s/bin/cfssl	#下載cfssl軟體    4 [root@k8smaster01 ~]# curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /opt/k8s/bin/cfssljson	#下載json模板    5 [root@k8smaster01 ~]# curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /opt/k8s/bin/cfssl-certinfo    6 [root@k8smaster01 ~]# chmod u+x /opt/k8s/bin/*    7 [root@k8smaster01 ~]# export PATH=/opt/k8s/bin:$PATH

1.2 創建根證書

  1 [root@k8smaster01 ~]# mkdir -p /opt/k8s/work    2 [root@k8smaster01 ~]# cd /opt/k8s/work    3 [root@k8smaster01 work]# cfssl print-defaults config > config.json    4 [root@k8smaster01 work]# cfssl print-defaults csr > csr.json					#創建模版配置json文件    5 [root@k8smaster01 work]# cp config.json ca-config.json					#複製一份作為CA的配置文件    6 [root@k8smaster01 work]# cat > ca-config.json <<EOF    7 {    8     "signing": {    9         "default": {   10             "expiry": "168h"   11         },   12         "profiles": {   13             "kubernetes": {   14                 "expiry": "87600h",   15                 "usages": [   16                     "signing",   17                     "key encipherment",   18                     "server auth",   19                     "client auth"   20                 ]   21             }   22         }   23     }   24 }   25 EOF

欄位解釋:

config.json:可以定義多個profiles,分別指定不同的過期時間、使用場景等參數;後續在簽名證書時使用某個profile;

  • signing: 表示該證書可用於簽名其它證書;生成的ca.pem 證書中CA=TRUE;
  • server auth: 表示client 可以用該CA 對server 提供的證書進行校驗;
  • client auth: 表示server 可以用該CA 對client 提供的證書進行驗證。

  1 [root@k8smaster01 work]# cp csr.json ca-csr.json					#複製一份作為CA的證書籤名請求文件    2 [root@k8smaster01 work]# cat > ca-csr.json <<EOF    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 }   19 EOF

欄位解釋:

  • CN: Common Name,kube-apiserver 從證書中提取該欄位作為請求的用戶名(User Name);瀏覽器使用該欄位驗證網站是否合法;
  • C:country;
  • ST:state;
  • L:city;
  • O: Organization,kube-apiserver 從證書中提取該欄位作為請求用戶所屬的組(Group);
  • OU:organization unit。

  1 [root@k8smaster01 ~]# cd /opt/k8s/work    2 [root@k8smaster01 work]# 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目錄下。

更多TLS證書創建方式參考《附008.Kubernetes TLS證書介紹及創建》。

1.3 分發證書

  1 [root@k8smaster01 ~]# cd /opt/k8s/work    2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh    3 [root@k8smaster01 work]# for all_ip in ${ALL_IPS[@]}    4   do    5     echo ">>> ${all_ip}"    6     ssh root@${all_ip} "mkdir -p /etc/kubernetes/cert"    7     scp ca*.pem ca-config.json root@${all_ip}:/etc/kubernetes/cert    8   done