警告
本文最后更新于 2021-06-28 20:09,文中内容可能已过时。
一、下载安装cfssl工具
1
2
3
4
5
| wget -O /usr/local/bin/cfssl https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssl_1.6.0_linux_amd64
wget -O /usr/local/bin/cfssljson https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssljson_1.6.0_linux_amd64
wget -O /usr/local/bin/cfssl-certinfo https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssl-certinfo_1.6.0_linux_amd64
chmod +x /usr/local/bin/cfssl*
|
二、配置工作目录
1
2
| mkdir /etc/kubernetes/pki/{ca,etcd} -p
cd /etc/kubernetes/pki/ca
|
三、配置CA机构
1.生成自签CA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| # 创建自签证书请求配置文件
cat > ca-csr.json <<EOF
{
"ca": {
"expiry": "438000h"
},
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Shanghai",
"L": "Shanghai",
"O": "k8s",
"OU": "System"
}
]
}
EOF
# 生成ca的证书签名请求文件、ca私钥、ca证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
|
ca.expiry:
: ca证书的过期时间,默认5年,我改成了50年
CN
: Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
O
: Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group)
C
: 国家
ST
: 省份
L
: 城市
2.准备CA用于签发的配置文件
后面使用的证书都会使用我们之前生成的CA来颁发,下面是颁发证书时的默认配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| cat > ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
|
default.expiry
: 全局配置,颁发的证书默认有效期10年
profiles
中可以定义多个配置,这里定义了一个kubernetes,在使用的时候可以指定profile。例如: -config=ca-config.json -profile=kubernetes
四、签发etcd证书
1.创建证书请求配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| cd /etc/kubernetes/pki/etcd/
cat > etcd-csr.json <<EOF
{
"CN": "etcd",
"hosts": [
"127.0.0.1",
"172.17.20.201",
"172.17.20.202",
"172.17.20.203"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Shanghai",
"L": "Shanghai",
"O": "k8s",
"OU": "System"
}
]
}
EOF
|
这里的hosts也可以改成域名、会灵活一些,更换IP也不影响证书使用
2.签发证书
1
| cfssl gencert -ca /etc/kubernetes/pki/ca/ca.pem -ca-key /etc/kubernetes/pki/ca/ca-key.pem -config /etc/kubernetes/pki/ca/ca-config.json --profile kubernetes ./etcd-csr.json | cfssljson -bare etcd
|
五.签发apiserver证书
apiserver服务端证书,用于证明自己是apiserver身份的。(通过hosts确认)
1.创建证书请求配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| cd /etc/kubernetes/pki/
cat > apiserver-csr.json <<EOF
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"172.17.20.201",
"172.17.20.202",
"172.17.20.203",
"172.17.20.200",
"10.1.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": "Shanghai",
"L": "Shanghai",
"O": "k8s",
"OU": "System"
}
]
}
EOF
|
hosts需要填写master节点地址和vip,集群内部通信会用内部地址,所以也需要写上service ip以及内部域名。
2.签发证书
1
| cfssl gencert -ca /etc/kubernetes/pki/ca/ca.pem -ca-key /etc/kubernetes/pki/ca/ca-key.pem -config /etc/kubernetes/pki/ca/ca-config.json --profile kubernetes ./apiserver-csr.json | cfssljson -bare apiserver
|
五.签发controller-manager证书
controller-manager作为apiserver的客户端,这里配置的是客户端证书,包含了客户端的信息。(CN代表用户)
1.创建证书请求配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| cd /etc/kubernetes/pki/
cat > kube-controller-manager.json <<EOF
{
"CN": "system:kube-controller-manager",
"key": {
"algo": "rsa",
"size": 2048
},
"hosts": [
"127.0.0.1",
"172.17.20.201",
"172.17.20.202",
"172.17.20.203"
],
"names": [
{
"C": "CN",
"ST": "Shanghai",
"L": "Shanghai",
"O": "k8s",
"OU": "System"
}
]
}
EOF
|
k8s有一个内置的ClusterRoleBinding
名为system:kube-controller-manager
。
这个clusterrolebinding将system:kube-controller-manager
这个clusterrole与用户system:kube-controller-manager
绑定
k8s通过证书中的CN获取用户名,所以指定CN为system:kube-controller-manager
作为用户名,并且证书是由CA签名过的,所以CN指定的用户名是可信的。
如果部署完后你想查看,可以通过如下命令:k get ClusterRolebinding system:kube-controller-manager -o yaml
官方说明:Go
controller-manager的高可用通过选举实现,只有一个实例在真正工作,所以这里的证书扩展中没有vip,我们的vip是给apiserver使用的。
2.签发证书
1
| cfssl gencert -ca /etc/kubernetes/pki/ca/ca.pem -ca-key /etc/kubernetes/pki/ca/ca-key.pem -config /etc/kubernetes/pki/ca/ca-config.json --profile kubernetes ./kube-controller-manager.json | cfssljson -bare kube-controller-manager
|
六.签发scheduler证书
scheduler作为apiserver的客户端,这里配置的是客户端证书,包含了客户端的信息。(CN代表用户)
1.创建证书请求配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| cd /etc/kubernetes/pki/
cat > kube-scheduler.json <<EOF
{
"CN": "system:kube-scheduler",
"key": {
"algo": "rsa",
"size": 2048
},
"hosts": [
"127.0.0.1",
"172.17.20.201",
"172.17.20.202",
"172.17.20.203"
],
"names": [
{
"C": "CN",
"ST": "Shanghai",
"L": "Shanghai",
"O": "k8s",
"OU": "System"
}
]
}
EOF
|
2.签发证书
1
| cfssl gencert -ca /etc/kubernetes/pki/ca/ca.pem -ca-key /etc/kubernetes/pki/ca/ca-key.pem -config /etc/kubernetes/pki/ca/ca-config.json --profile kubernetes ./kube-scheduler.json | cfssljson -bare kube-scheduler
|
七.签发kubectl(admin)证书
这里配置的是集群管理员(客户端)证书,kubectl作为客户端,需要指定一个配置文件(kubeconfig),生成配置文件需要用到此证书。
1.创建证书请求配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| cd /etc/kubernetes/pki/
cat > admin.json <<EOF
{
"CN": "admin",
"key": {
"algo": "rsa",
"size": 2048
},
"hosts": [],
"names": [
{
"C": "CN",
"ST": "Shanghai",
"L": "Shanghai",
"O": "system:masters",
"OU": "System"
}
]
}
EOF
|
可以看下第五部分的简介,只不过这里绑定的不是User(用户),而是Group(组),使用O指定组。如果部署完后你想查看,可以通过如下命令:k get ClusterRolebinding cluster-admin -o yaml
所以这里的CN可以随便写
2.签发证书
1
| cfssl gencert -ca /etc/kubernetes/pki/ca/ca.pem -ca-key /etc/kubernetes/pki/ca/ca-key.pem -config /etc/kubernetes/pki/ca/ca-config.json --profile kubernetes ./admin.json | cfssljson -bare admin
|
八.签发kube-proxy证书
1.创建证书请求配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| cd /etc/kubernetes/pki/
cat > kube-proxy.json <<EOF
{
"CN": "system:kube-proxy",
"key": {
"algo": "rsa",
"size": 2048
},
"hosts": [],
"names": [
{
"C": "CN",
"ST": "Shanghai",
"L": "Shanghai",
"O": "k8s",
"OU": "System"
}
]
}
EOF
|
一个名为system:node-proxier
的ClusterRoleBinding,将ClusterRole system:node-proxier
与User(用户)system:kube-proxy
绑定
kube-proxy是node节点组件,IP并不是固定的,所以这里没有写hosts
2.签发证书
1
| cfssl gencert -ca /etc/kubernetes/pki/ca/ca.pem -ca-key /etc/kubernetes/pki/ca/ca-key.pem -config /etc/kubernetes/pki/ca/ca-config.json --profile kubernetes ./kube-proxy.json | cfssljson -bare kube-proxy
|
九、关于kubelet证书
官方文档
当集群开启了 TLS 认证后,每个节点的 kubelet 组件都要使用由 apiserver 使用的 CA 签发的有效证书才能与 apiserver 通讯;此时如果节点多起来,为每个节点单独签署证书将是一件非常繁琐的事情;
TLS bootstrapping 功能就是让 node节点上的kubelet组件先使用一个预定的低权限用户连接到 apiserver,然后向 apiserver 申请证书,kubelet 的证书由 apiserver 动态签署;
十、配置flannel证书
1.创建证书请求配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| cd /etc/kubernetes/pki/
cat > flannel-csr.json <<EOF
{
"CN": "flannel",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Shanghai",
"L": "Shanghai",
"O": "k8s",
"OU": "System"
}
]
}
EOF
|
2.签发证书
1
| cfssl gencert -ca /etc/kubernetes/pki/ca/ca.pem -ca-key /etc/kubernetes/pki/ca/ca-key.pem -config /etc/kubernetes/pki/ca/ca-config.json --profile kubernetes ./flannel-csr.json | cfssljson -bare flannel
|
此证书用于访问etcd使用