您好,登錄后才能下訂單哦!
kubernetes 集群安裝配置過程中,會使用各種證書,目的是為了加強集群安全性,但是會坑很多入門新手.
前期如果手動部署集群, 想了解集群組件配合工作原理,各種不通,報很多奇葩的錯,很多是證書配置錯誤導致的。
推薦報錯時多看master節點和調試服務節點的日志. 基本都能發現有用的錯誤日志,k8s打印的錯誤日志,指引的錯誤方向還是靠譜的.
為了少踩坑,個人簡單梳理了一下集群配置過程中使用的證書信息,詳細如下:
etcd: 使用 ca.pem、server-key.pem、server.pem;
kube-apiserver: 使用 ca.pem、server-key.pem、server.pem;
kubelet: 使用 ca.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
證書生成操作都可以在master節點主機上執行,證書只需要創建一次即可。然后將證書copy到新添加節點,
根據不同服務使用的證書的不同單獨配置即可。
該文件為一個用戶的描述文件,基本格式為 Token,用戶名,UID,用戶組;這個文件在 apiserver 啟動時被 apiserver 加載,
然后就相當于在集群內創建了一個這個用戶;接下來就可以用 RBAC 給他授權
該文件中內置了 token.csv 中用戶的 Token,以及 apiserver CA 證書;kubelet 首次啟動會加載此文件,
使用 apiserver CA 證書建立與 apiserver 的 TLS 通訊,使用其中的用戶 Token 作為身份標識像 apiserver 發起 CSR 請求
CFSSL是CloudFlare開源的一款PKI/TLS工具。CFSSL 包含一個命令行工具和一個用于 簽名,驗證并且捆綁TLS證書的 HTTP API 服務.
使用Go語言編寫。
一組用于生成自定義 TLS PKI 的工具;
cfssl程序,是CFSSL的命令行工具;
multirootca程序是可以使用多個簽名密鑰的證書頒發機構服務器;
mkbundle程序用于構建證書池;
cfssljson程序,從cfssl和multirootca程序獲取JSON輸出,并將證書,密鑰,CSR和bundle寫入磁盤;
PKI借助數字證書和公鑰加密技術提供可信任的網絡身份。通常,證書就是一個包含如下身份信息的文件:
證書所有組織的信息
公鑰
證書頒發組織的信息
證書頒發組織授予的權限,如證書有效期、適用的主機名、用途等
使用證書頒發組織私鑰創建的數字簽名
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
cat << EOF | tee ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"server": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
字段說明:
expiry : 87600h 10 年
ca-config.json:可以定義多個 profiles,分別指定不同的過期時間、使用場景等參數;后續在簽名證書時使用某個 profile;
signing:表示該證書可用于簽名其它證書;生成的 ca.pem 證書中 CA=TRUE;
server auth:表示client可以用該 CA 對server提供的證書進行驗證;
client auth:表示server可以用該CA對client提供的證書進行驗證;
cat << EOF | tee ca-csr.json
{
"CN": "server",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
字段說明:
"CN":Common Name,kube-apiserver 從證書中提取該字段作為請求的用戶名 (User Name);瀏覽器使用該字段驗證網站是否合法;
"O":Organization,kube-apiserver 從證書中提取該字段作為請求用戶所屬的組 (Group);
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
k8s-ssl]# ls
ca-config.json
ca-csr.json
ca.csr
ca-key.pem
ca.pem
cat << EOF | tee server-csr.json
{
"CN": "server",
"hosts": [
"10.254.0.1",
"127.0.0.1",
"172.20.101.157",
"172.20.101.165",
"172.20.101.164",
"172.20.101.160",
"172.20.101.166",
"172.20.101.167",
"server",
"server.default",
"server.default.svc",
"server.default.svc.cluster",
"server.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
字段說明:
如果hosts字段不為空則需要指定授權使用該證書的IP或域名列表,該證書后續被 etcd 集群和 kubernetes master 集群使用,
上面分別指定了 etcd 集群:
"172.20.101.157",
"172.20.101.165",
"172.20.101.164",
kubernetes master 集群的主機 IP:
"172.20.101.157",
"172.20.101.165",
"172.20.101.164",
kubernetes node 節點 IP:
"172.20.101.160",
"172.20.101.166",
"172.20.101.167",
service-cluster-ip-range 網段和第一個IP,
"10.254.0.1",
也可以寫物理節點的主機名。
另外集群配置高可用使用vip的IP地址也填上。
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server
ll server*
server.csr
server-csr.json
server-key.pem
server.pem
cat << EOF | tee kube-proxy-csr.json
{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
字段說明:
CN 指定該證書的Use為system:kube-proxy;
kube-apiserver 預定義的 RoleBinding system:node-proxier 將User system:kube-proxy 與 Role system:node-proxier 綁定,該 Role 授予了調用 kube-apiserver Proxy 相關 API 的權限;
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server kube-proxy-csr.json | cfssljson -bare kube-proxy
kube-*
kube-proxy.csr
kube-proxy-csr.json
kube-proxy-key.pem
kube-proxy.pem
cat >admin-csr.json<<EOF
{
"CN": "admin",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
EOF
字段說明:
O 指定該證書的 Group 為 system:masters,kubelet 使用該證書訪問 kube-apiserver 時 ,由于證書被 CA 簽名,所以認證通過,
同時由于證書用戶組為經過預授權的 system:masters,所以被授予訪問所有 API 的權限;
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server admin-csr.json | cfssljson -bare admin
ll admin*
admin.csr
admin-csr.json
admin-key.pem
admin.pem
find . -name "*.csr" -o -name "*.srl"|xargs rm -f
openssl x509 -noout -text -in server.pem
cfssl-certinfo -cert server.pem
后面的pem可以換成已生成key文件,然后核對key內容。
集群搭建完成,通過命令: kubectl get clusterrolebinding cluster-admin -o yaml ,查看 clusterrolebinding cluster-admin 的 subjects 的 kind 是 Group,name 是 system:masters。 roleRef 對象是 ClusterRole cluster-admin。
即:system:masters Group 的 user 或者 serviceAccount 都擁有 cluster-admin 的角色。 因此在使用 kubectl 命令時候,
才擁有整個集群的管理權限。可以使用 kubectl get clusterrolebinding cluster-admin -o yaml 來查看。
https://blog.51cto.com/lookingdream/2176846
https://jimmysong.io/kubernetes-handbook/practice/create-tls-and-secret-key.html
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。