kubernete tls证书和秘钥
传输k8s各组件之间的通信可以使用http方式,但是为了安全起见,生产环境需要使用https方式通信,所以我们需要生成tls证书进行加密传输。
构建环境
再次介绍下我们本次搭建的环境:
节点名称 | ip | 配置 |
---|---|---|
wecloud-test-k8s-1(master) | 192.168.99.183 | 4核,4G,50G磁盘 |
wecloud-test-k8s-2(node1) | 192.168.99.189 | 4核,4G,50G磁盘 |
wecloud-test-k8s-3(node2) | 192.168.99.185 | 4核,4G,50G磁盘 |
wecloud-test-k8s-4(node3) | 192.168.99.196 | 4核,4G,50G磁盘 |
生成tls证书的工具:cfssl
生成的 CA 证书和秘钥文件如下:
ca-key.pem
ca.pem
kubernetes-key.pem
kubernetes.pem
kube-proxy.pem
kube-proxy-key.pem
admin.pem
admin-key.pem
使用证书的组件如下:
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
证书的创建过程是在192.168.99.183(master)节点上进行的,生成好证书只需要把证书分发给其他节点,这样就可以进行加密通信了。
安装tls和秘钥
安装cfssl
直接在官网下载cfssl相关二进制包:
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
增加可执行权限后,将可执行二进制文件拷贝到全局变量可以识别的目录/usr/local/bin:
[root@wecloud-test-k8s-1 ~]# chmod +x cfssl-certinfo_linux-amd64
[root@wecloud-test-k8s-1 ~]# chmod +x cfssljson_linux-amd64
[root@wecloud-test-k8s-1 ~]# chmod +x cfssl_linux-amd64
[root@wecloud-test-k8s-1 ~]# mv cfssl_linux-amd64 /usr/local/bin/cfssl
[root@wecloud-test-k8s-1 ~]# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
[root@wecloud-test-k8s-1 ~]# mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
创建CA文件
创建 CA 配置文件
[root@wecloud-test-k8s-1 ~]# mkdir /root/ssl
[root@wecloud-test-k8s-1 ~]# cd /root/ssl/
[root@wecloud-test-k8s-1 ssl]# cfssl print-defaults config > config.json
[root@wecloud-test-k8s-1 ssl]# cfssl print-defaults csr > csr.json
生成配置文件模板
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
EOF
expiry: 其中expiry是过期时间,可以指定多个;
signing: 表示该证书可以签名其他证书;
server auth: 表示客户端可以用该证书对服务端进行验证;
client auth: 表示服务端可以用该证书对客户端进行验证;
创建CA证书签名请求
创建ca-csr.json文件:
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "ZheJiang",
"L": "HangZhou",
"O": "k8s",
"OU": "System"
}
]
}
- “CN”:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
- “O”:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
生成 CA 证书和私钥
[root@wecloud-test-k8s-1 ssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
2018/04/01 17:16:31 [INFO] generating a new CA key and certificate from CSR
2018/04/01 17:16:31 [INFO] generate received request
2018/04/01 17:16:31 [INFO] received CSR
2018/04/01 17:16:31 [INFO] generating key: rsa-2048
2018/04/01 17:16:31 [INFO] encoded CSR
2018/04/01 17:16:31 [INFO] signed certificate with serial number 249255656321361266442489392967889104825701924957
[root@wecloud-test-k8s-1 ssl]# ls
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem config.json csr.json
ca-key.pem 和 ca.pem分别为生成的私钥和证书。
创建kubernetes证书
创建 kubernetes 证书签名请求文件 kubernetes-csr.json:
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"192.168.99.183",
"192.168.99.189",
"192.168.99.185",
"192.168.99.196",
"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": "ZheJiang",
"L": "HangZhou",
"O": "k8s",
"OU": "System"
}
]
}
hosts 字段不为空则需要指定授权使用该证书的 IP 或域名列表,把我们整个集群需要的节点都添加进去。
生成kubernetes证书和私钥
[root@wecloud-test-k8s-1 ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
查看生成结果:
[root@wecloud-test-k8s-1 ssl]# ls
ca-config.json ca-csr.json ca.