根據(jù)不同服務(wù)使用的證書的不同單獨(dú)配置即可。
其它幾個(gè)類證書文件
token.csv
該文件為一個(gè)用戶的描述文件,基本格式為 Token,用戶名,UID,用戶組;這個(gè)文件在 apiserver 啟動(dòng)時(shí)被 apiserver 加載,
然后就相當(dāng)于在集群內(nèi)創(chuàng)建了一個(gè)這個(gè)用戶;接下來(lái)就可以用 RBAC 給他授權(quán)
bootstrap.kubeconfig
該文件中內(nèi)置了 token.csv 中用戶的 Token,以及 apiserver CA 證書;kubelet 首次啟動(dòng)會(huì)加載此文件,
使用 apiserver CA 證書建立與 apiserver 的 TLS 通訊,使用其中的用戶 Token 作為身份標(biāo)識(shí)像 apiserver 發(fā)起 CSR 請(qǐng)求
生成證書過(guò)程簡(jiǎn)介
安裝cfssl
CFSSL是CloudFlare開(kāi)源的一款PKI/TLS工具。CFSSL 包含一個(gè)命令行工具和一個(gè)用于 簽名,驗(yàn)證并且捆綁TLS證書的 HTTP API 服務(wù).
使用Go語(yǔ)言編寫。
CFSSL包括:
一組用于生成自定義 TLS PKI 的工具;
cfssl程序,是CFSSL的命令行工具;
multirootca程序是可以使用多個(gè)簽名密鑰的證書頒發(fā)機(jī)構(gòu)服務(wù)器;
mkbundle程序用于構(gòu)建證書池;
cfssljson程序,從cfssl和multirootca程序獲取JSON輸出,并將證書,密鑰,CSR和bundle寫入磁盤;
PKI借助數(shù)字證書和公鑰加密技術(shù)提供可信任的網(wǎng)絡(luò)身份。通常,證書就是一個(gè)包含如下身份信息的文件:
證書所有組織的信息
公鑰
證書頒發(fā)組織的信息
證書頒發(fā)組織授予的權(quán)限,如證書有效期、適用的主機(jī)名、用途等
使用證書頒發(fā)組織私鑰創(chuàng)建的數(shù)字簽名
下載
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
證書生成過(guò)程演示
制作server ca證書
cat << EOF | tee ca-config.json
{
signing: {
default: {
expiry: 87600h
},
profiles: {
server: {
expiry: 87600h,
usages: [
signing,
key encipherment,
server auth,
client auth
]
}
}
}
}
EOF
字段說(shuō)明:
expiry : 87600h 10 年
ca-config.json:可以定義多個(gè) profiles,分別指定不同的過(guò)期時(shí)間、使用場(chǎng)景等參數(shù);后續(xù)在簽名證書時(shí)使用某個(gè) profile;
signing:表示該證書可用于簽名其它證書;生成的 ca.pem 證書中 CA=TRUE;
server auth:表示client可以用該 CA 對(duì)server提供的證書進(jìn)行驗(yàn)證;
client auth:表示server可以用該CA對(duì)client提供的證書進(jìn)行驗(yàn)證;
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
字段說(shuō)明:
CN:Common Name,kube-apiserver 從證書中提取該字段作為請(qǐng)求的用戶名 (User Name);瀏覽器使用該字段驗(yàn)證網(wǎng)站是否合法;
O:Organization,kube-apiserver 從證書中提取該字段作為請(qǐng)求用戶所屬的組 (Group);
生成CA證書和私鑰
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
驗(yàn)證ca 證書
k8s-ssl]# ls
ca-config.json
ca-csr.json
ca.csr
ca-key.pem
ca.pem
制作server證書
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
字段說(shuō)明:
如果hosts字段不為空則需要指定授權(quán)使用該證書的IP或域名列表,該證書后續(xù)被 etcd 集群和 kubernetes master 集群使用,
上面分別指定了 etcd 集群:
172.20.101.157,
172.20.101.165,
172.20.101.164,
kubernetes master 集群的主機(jī) IP:
172.20.101.157,
172.20.101.165,
172.20.101.164,
kubernetes node 節(jié)點(diǎn) IP:
172.20.101.160,
172.20.101.166,
172.20.101.167,
service-cluster-ip-range 網(wǎng)段和第一個(gè)IP,
10.254.0.1,
也可以寫物理節(jié)點(diǎn)的主機(jī)名。
另外集群配置高可用使用vip的IP地址也填上。
生成 kubernetes 證書和私鑰
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server
驗(yàn)證
ll server*
server.csr
server-csr.json
server-key.pem
server.pem
制作kube-proxy證書
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
字段說(shuō)明:
CN 指定該證書的Use為system:kube-proxy;
kube-apiserver 預(yù)定義的 RoleBinding system:node-proxier 將User system:kube-proxy 與 Role system:node-proxier 綁定,該 Role 授予了調(diào)用 kube-apiserver Proxy 相關(guān) API 的權(quán)限;
創(chuàng)建 kube-proxy 證書
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server kube-proxy-csr.json | cfssljson -bare kube-proxy
驗(yàn)證
kube-*
kube-proxy.csr
kube-proxy-csr.json
kube-proxy-key.pem
kube-proxy.pem
創(chuàng)建 admin 證書
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
字段說(shuō)明:
O 指定該證書的 Group 為 system:masters,kubelet 使用該證書訪問(wèn) kube-apiserver 時(shí) ,由于證書被 CA 簽名,所以認(rèn)證通過(guò),
同時(shí)由于證書用戶組為經(jīng)過(guò)預(yù)授權(quán)的 system:masters,所以被授予訪問(wèn)所有 API 的權(quán)限;
生成 admin ca
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server admin-csr.json | cfssljson -bare admin
驗(yàn)證
ll admin*
admin.csr
admin-csr.json
admin-key.pem
admin.pem
清理 csr srl
find . -name *.csr -o -name *.srl|xargs rm -f
驗(yàn)證證書:
使用 opsnssl 命令驗(yàn)證key內(nèi)容
openssl x509 -noout -text -in server.pem
cfssl-certinfo -cert server.pem
后面的pem可以換成已生成key文件,然后核對(duì)key內(nèi)容。
集群核對(duì)key信息
集群搭建完成,通過(guò)命令: kubectl get clusterrolebinding cluster-admin -o yaml ,查看 clusterrolebinding cluster-admin 的 subjects 的 kind 是 Group,name 是 system:masters。 roleRef 對(duì)象是 ClusterRole cluster-admin。
即:system:masters Group 的 user 或者 serviceAccount 都擁有 cluster-admin 的角色。 因此在使用 kubectl 命令時(shí)候,
才擁有整個(gè)集群的管理權(quán)限??梢允褂?kubectl get clusterrolebinding cluster-admin -o yaml 來(lái)查看。
參考文檔:
https://blog.51cto.com/lookingdream/2176846
https://jimmysong.io/kubernetes-handbook/practice/create-tls-and-secret-key.html
更多關(guān)于云服務(wù)器,域名注冊(cè),虛擬主機(jī)的問(wèn)題,請(qǐng)?jiān)L問(wèn)三五互聯(lián)官網(wǎng):m.shinetop.cn