kubernetes部署之創建TLS證書(2)
研究過kubernetes的同事們都知道,kubernetes如果需要啟用TLS認證,那麽制作證書是必不可少的一步。然而,很多人在制作證書上遇到了很多的麻煩。今天主要記錄一次我在部署kubernetes的過程中,是如何制作證書的。在整個過程中,將詳細列出各組件的啟動參數,給出配置文件,以及詳解它們的含義和可能遇到的問題。
一、部署前準備
1.1 主機環境
環境參考ETCD集群部署,這裏會增加一個VIP(192.168.15.200),用戶實現kubernetes master高可用;
1.2 安裝cfssl工具
cd /usr/src/ wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 chmod +x cfssl_linux-amd64 mv cfssl_linux-amd64 /usr/local/bin/cfssl wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 chmod +x cfssljson_linux-amd64 mv cfssljson_linux-amd64 /usr/local/bin/cfssljson wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl-certinfo_linux-amd64 mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
二、生成證書
2.1 創建CA證書
mkdir /root/ssl
cd /root/ssl
cat >> ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
EOF
提示:
ca-config.json
:可以定義多個 profiles,分別指定不同的過期時間、使用場景等參數,後續在簽名證書時使用某個profile;
signing
:表示該證書可用於簽名其它證書,生成的ca.pem證書中CA=TRUE
;
server auth
:表示client可以用該CA對server提供的證書進行驗證;
client auth
:表示server可以用該CA對client提供的證書進行驗證;
創建CA證書簽名請求配置:
cat >> ca-csr.json << EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "system"
}
]
}
EOF
提示:
CN
即Common Name,kube-apiserver從證書中提取該字段作為請求的用戶名;
O
即Organization,kube-apiserver從證書中提取該字段作為請求用戶所屬的組;
用cfssl生成CA證書以及頒發證書:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
2.2 創建apiserver證書
cat >> apiserver-csr.json << EOF
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"192.168.15.131",
"192.168.15.132",
"192.168.15.133",
"192.168.15.200",
"10.96.0.1",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "system"
}
]
}
EOF
提示:註意上面配置hosts字段中制定授權使用該證書的IP和域名列表,因為現在要生成的證書需要被Kubernetes Master集群各個節點使用,所以這裏指定了各個節點的IP和hostname。同時還要指定集群內部kube-apiserver的多個域名和IP地址10.96.0.1
(後邊kube-apiserver-service-cluster-ip-range=10.96.0.0/12
參數的指定網段的第一個IP)。最後一點,如果你用到了VIP這裏也是需要添加該IP地址的。
生成kube-apiserver的證書和私鑰:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=frognew apiserver-csr.json | cfssljson -bare apiserver
2.3 創建kubernetes-admin證書以及私鑰
cat >> admin-csr.json << EOF
{
"CN": "kubernetes-admin",
"hosts": [
"192.168.15.131",
"192.168.15.132",
"192.168.15.133",
"192.168.15.200"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "system:masters",
"OU": "system"
}
]
}
EOF
提示:kube-apiserver將提取CN
作為客戶端的用戶名,這裏是kubernetes-admin
,將提取O
作為用戶所屬的組,這裏是system:master
。 kube-apiserver預定義了一些 RBAC使用的ClusterRoleBindings,例如 cluster-admin將組system:masters與 ClusterRole cluster-admin綁定,而cluster-admin擁有訪問kube-apiserver的所有權限,因此kubernetes-admin
這個用戶將作為集群的超級管理員。(具體參考kubernetes 認證相關文檔)
生成kubernetes-admin
的證書和私鑰:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=frognew admin-csr.json | cfssljson -bare admin
2.4 創建kubernetes-controller-manager證書和私鑰
cat >> controller-manager-csr.json << EOF
{
"CN": "system:kube-controller-manager",
"hosts": [
"192.168.15.131",
"192.168.15.132",
"192.168.15.133",
"192.168.15.200"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "system:kube-controller-manager",
"OU": "system"
}
]
}
EOF
提示:kube-apiserver將提取CN
作為客戶端的用戶名,這裏是system:kube-controller-manager
。 kube-apiserver預定義的 RBAC使用的ClusterRoleBindings system:kube-controller-manager
將用戶system:kube-controller-manager
與ClusterRole system:kube-controller-manager
綁定。
生成kubernetes-controller-manager證書及私鑰:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=frognew controller-manager-csr.json | cfssljson -bare controller-manager
2.5 創建kubernetes-scheduler證書及私鑰
cat >> scheduler-csr.json << EOF
{
"CN": "system:kube-scheduler",
"hosts": [
"192.168.15.131",
"192.168.15.132",
"192.168.15.133",
"192.168.15.200"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "system:kube-scheduler",
"OU": "system"
}
]
}
EOF
提示:kube-scheduler將提取CN
作為客戶端的用戶名,這裏是system:kube-scheduler
。 kube-apiserver預定義的RBAC使用的ClusterRoleBindings system:kube-scheduler
將用戶system:kube-scheduler
與ClusterRole system:kube-scheduler
綁定。
生成kubernetes-scheduler證書及私鑰:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=frognew scheduler-csr.json | cfssljson -bare scheduler
至此,所有相關證書制作完成!
kubernetes部署之創建TLS證書(2)