2.創(chuàng)建TLS證書(shū)和秘鑰
kubernetes
系統(tǒng)的各組件需要使用 TLS
證書(shū)對(duì)通信進(jìn)行加密纵势,本文檔使用 CloudFlare
的 PKI 工具集 cfssl 來(lái)生成 Certificate Authority (CA) 和其它證書(shū);
生成的 CA 證書(shū)和秘鑰文件如下:
- ca-key.pem
- ca.pem
- kubernetes-key.pem
- kubernetes.pem
- kube-proxy.pem
- kube-proxy-key.pem
- admin.pem
- admin-key.pem
使用證書(shū)的組件如下:
- etcd:使用 ca.pem尼荆、kubernetes-key.pem找默、kubernetes.pem;
- kube-apiserver:使用 ca.pem、kubernetes-key.pem艳吠、kubernetes.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
安裝 CFSSL
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
export PATH=/usr/local/bin:$PATH
創(chuàng)建 CA(Certificate Authority)
創(chuàng)建 CA 配置文件:
mkdir /root/ssl
cd /root/ssl
cfssl print-defaults config > config.json
cfssl print-defaults csr > csr.json
# 根據(jù)config.json文件的格式創(chuàng)建如下的ca-config.json文件
# 過(guò)期時(shí)間設(shè)置成了 87600h
touch ca-config.json
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
EOF
字段說(shuō)明
- ca-config.json:可以定義多個(gè) profiles,分別指定不同的過(guò)期時(shí)間纹腌、使用場(chǎng)景等參數(shù)霎终;后續(xù)在簽名證書(shū)時(shí)使用某個(gè) profile;
- signing:表示該證書(shū)可用于簽名其它證書(shū)升薯;生成的 ca.pem 證書(shū)中 CA=TRUE莱褒;
- server auth:表示client可以用該 CA 對(duì)server提供的證書(shū)進(jìn)行驗(yàn)證;
- client auth:表示server可以用該CA對(duì)client提供的證書(shū)進(jìn)行驗(yàn)證涎劈;
創(chuàng)建 CA 證書(shū)簽名請(qǐng)求:
創(chuàng)建 ca-csr.json
文件广凸,內(nèi)容如下:
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
],
"ca": {
"expiry": "87600h"
}
}
- "CN":Common Name,kube-apiserver 從證書(shū)中提取該字段作為請(qǐng)求的用戶名 (User Name)蛛枚;瀏覽器使用該字段驗(yàn)證網(wǎng)站是否合法谅海;
- "O":Organization,kube-apiserver 從證書(shū)中提取該字段作為請(qǐng)求用戶所屬的組 (Group)蹦浦;
- "C":所在國(guó)家,"ST":所在省份,"L":所在城市
生成 CA 證書(shū)和私鑰
$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca
[root@k8s bin]# ls ca*
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem
創(chuàng)建 kubernetes
證書(shū)
創(chuàng)建 kubernetes
證書(shū)簽名請(qǐng)求文件 kubernetes-csr.json
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"10.254.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"
}
]
}
- "host":指定授權(quán)使用該證書(shū)的 IP 或域名列表扭吁,由于該證書(shū)后續(xù)被
etcd
集群和kubernetes master
集群使用,所以上面分別指定了etcd
集群盲镶、kubernetes master
集群的主機(jī) IP(本次etcd與master直接使用本機(jī)ip 127.0.0.1) 和kubernetes
服務(wù)的服務(wù) IP(一般是 kube-apiserver 指定的 service-cluster-ip-range 網(wǎng)段的第一個(gè)IP侥袜,如 10.254.0.1)。
生成 kubernetes
證書(shū)和私鑰
$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
[root@k8s bin]# ls kubernetes*
kubernetes.csr kubernetes-csr.json kubernetes-key.pem kubernetes.pem
創(chuàng)建 admin
證書(shū)
創(chuàng)建 admin
證書(shū)簽名請(qǐng)求文件 admin-csr.json
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
O 指定該證書(shū)的 Group 為
system:masters
徒河,kubelet
使用該證書(shū)訪問(wèn)kube-apiserver
時(shí) 系馆,由于證書(shū)被 CA 簽名,所以認(rèn)證通過(guò)顽照,同時(shí)由于證書(shū)用戶組為經(jīng)過(guò)預(yù)授權(quán)的system:masters
由蘑,所以被授予訪問(wèn)所有 API 的權(quán)限闽寡;kube-apiserver
預(yù)定義了一些RBAC
使用的RoleBindings
,如cluster-admin
將 Groupsystem:masters
與 Rolecluster-admin
綁定尼酿,該 Role 授予了調(diào)用kube-apiserver
的所有 API的權(quán)限爷狈;
生成 admin
證書(shū)和私鑰
$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
[root@k8s bin]# ls admin*
admin.csr admin-csr.json admin-key.pem admin.pem
創(chuàng)建 kube-proxy
證書(shū)
創(chuàng)建 kube-proxy
證書(shū)簽名請(qǐng)求文件 kube-proxy-csr.json
{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
CN 指定該證書(shū)的 User 為
system:kube-proxy
;kube-apiserver
預(yù)定義的 RoleBindingsystem:node-proxier
將Usersystem:kube-proxy
與 Rolesystem:node-proxier
綁定裳擎,該 Role 授予了調(diào)用kube-apiserver
Proxy 相關(guān) API 的權(quán)限涎永;
生成 kube-proxy
證書(shū)和私鑰
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
[root@k8s bin]# ls kube-proxy*
kube-proxy.csr kube-proxy-csr.json kube-proxy-key.pem kube-proxy.pem
校驗(yàn)證書(shū)
以 Kubernetes
證書(shū)為例。
使用 openssl
命令
$ openssl x509 -noout -text -in kubernetes.pem
...
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=CN, ST=BeiJing, L=BeiJing, O=k8s, OU=System, CN=Kubernetes
Validity
Not Before: Apr 5 05:36:00 2017 GMT
Not After : Apr 5 05:36:00 2018 GMT
Subject: C=CN, ST=BeiJing, L=BeiJing, O=k8s, OU=System, CN=kubernetes
...
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Subject Key Identifier:
DD:52:04:43:10:13:A9:29:24:17:3A:0E:D7:14:DB:36:F8:6C:E0:E0
X509v3 Authority Key Identifier:
keyid:44:04:3B:60:BD:69:78:14:68:AF:A0:41:13:F6:17:07:13:63:58:CD
X509v3 Subject Alternative Name:
DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster, DNS:kubernetes.default.svc.cluster.local, IP Address:127.0.0.1
...
- 確認(rèn) Issuer 字段的內(nèi)容和 ca-csr.json 一致鹿响;
- 確認(rèn) Subject 字段的內(nèi)容和 kubernetes-csr.json 一致羡微;
- 確認(rèn) X509v3 Subject Alternative Name 字段的內(nèi)容和 kubernetes-csr.json 一致;
- 確認(rèn) X509v3 Key Usage惶我、Extended Key Usage 字段的內(nèi)容和 ca-config.json 中 kubernetes profile 一致妈倔;
分發(fā)證書(shū)
將生成的證書(shū)和秘鑰文件(后綴名為.pem)拷貝到 /etc/kubernetes/ssl 目錄下備用;
mkdir -p /etc/kubernetes/ssl
cp *.pem /etc/kubernetes/ssl
[root@k8s bin]# ls /etc/kubernetes/ssl/
admin-key.pem admin.pem ca-key.pem ca.pem kube-proxy-key.pem kube-proxy.pem kubernetes-key.pem kubernetes.pem
參考
- Generate self-signed certificates
- Client Certificates V/s Server Certificates
- TLS bootstrap 引導(dǎo)程序