如果沒有特殊指明,所有操作均在 zhaoyixin-k8s-01 節點上執行。
為確保安全,kubernetes
系統的各組件需要使用 x509
證書對通信進行加密和認證。
CA (Certificate Authority) 是自簽名的根證書,用來簽名后續創建的其它證書。
CA 證書是集群所有節點共享的,只需要創建一次,后續用它簽名其它所有證書。
安裝 cfssl 工具集
使用 CloudFlare 的 PKI 工具集 cfssl 創建所有證書。
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,過期時間、服務端認證、客戶端認證、加密等):
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);- kube-apiserver 將提取的
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 相同),以達到區分的目的。
生成 CA 證書和私鑰
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