若是沒有特殊指明,全部操做均在 zhaoyixin-k8s-01 節點上執行。node
爲確保安全,kubernetes
系統的各組件須要使用 x509
證書對通訊進行加密和認證。linux
CA (Certificate Authority) 是自簽名的根證書,用來簽名後續建立的其它證書。git
CA 證書是集羣全部節點共享的,只須要建立一次,後續用它簽名其它全部證書。github
使用 CloudFlare 的 PKI 工具集 cfssl 建立全部證書。json
sudo mkdir -p /opt/k8s/cert && cd /opt/k8s/work wget https://github.com/cloudflare/cfssl/releases/download/v1.4.1/cfssl_1.4.1_linux_amd64 mv cfssl_1.4.1_linux_amd64 /opt/k8s/bin/cfssl wget https://github.com/cloudflare/cfssl/releases/download/v1.4.1/cfssljson_1.4.1_linux_amd64 mv cfssljson_1.4.1_linux_amd64 /opt/k8s/bin/cfssljson wget https://github.com/cloudflare/cfssl/releases/download/v1.4.1/cfssl-certinfo_1.4.1_linux_amd64 mv cfssl-certinfo_1.4.1_linux_amd64 /opt/k8s/bin/cfssl-certinfo chmod +x /opt/k8s/bin/* export PATH=/opt/k8s/bin:$PATH
CA 配置文件用於配置根證書的使用場景 (profile) 和具體參數 (usage,過時時間、服務端認證、客戶端認證、加密等):api
cd /opt/k8s/work cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "876000h" } } } } EOF
signing
:表示該證書可用於簽名其它證書(生成的ca.pem
證書中CA=TRUE
);server auth
:表示 client 能夠用該證書對 server 提供的證書進行驗證;client auth
:表示 server 能夠用該證書對 client 提供的證書進行驗證;expiry:876000h
:證書有效期設置爲 100 年。cd /opt/k8s/work cat > ca-csr.json <<EOF { "CN": "kubernetes-ca", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "zhaoyixin" } ], "ca": { "expiry": "876000h" } } EOF
CN
:Common Name。kube-apiserver 從證書中提取該字段做爲請求的用戶名(User Name),瀏覽器使用該字段驗證網站是否合法;O
:Organization。kube-apiserver 中證書中提取該字段做爲請求用戶所屬的組(Group);User
和 Group
做爲 RBAC
受權的用戶標識。注意:
1.不一樣證書 csr 文件的 CN、C、ST、L、O、OU 組合必須不一樣,不然可能出現PEER'S CERTIFICATE HAS AN INVALID SIGNATURE
錯誤;
2. 後續建立證書的 csr 文件時,CN 都不相同(C、ST、L、O、OU 相同),以達到區分的目的。瀏覽器
cd /opt/k8s/work cfssl gencert -initca ca-csr.json | cfssljson -bare ca ls ca*
分發證書文件安全
cd /opt/k8s/work source /opt/k8s/bin/environment.sh for node_ip in ${NODE_IPS[@]} do echo ">>> ${node_ip}" ssh root@${node_ip} "mkdir -p /etc/kubernetes/cert" scp ca*.pem ca-config.json root@${node_ip}:/etc/kubernetes/cert done