Kubernetes 集群都有一个集群根证书颁发机构(CA) — 验证 API server 证书 — 验证 kubelet 客户端证书
CA 证书包被散发到集群中的每个节点 -- 作为一个 secret 附加散发到默认 service account
让 Pod 中运行的应用程序信赖集群根 CA 通常须要一些额定的应用程序配置:CA 证书包 -- TLS 客户端或服务器信赖的 CA 证书列表
=====install 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
=====create CA=====
mkdir /root/ssl
cd /root/ssl
cfssl print-defaults config > config.json
cfssl print-defaults csr > csr.json
# 依据 config.json 文件的格局创立如下的 ca-config.json 文件
# 过期工夫设置成了 87600h
cat > ca-config.json <<EOF
{
"signing": {
"default": {"expiry": "87600h"},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
EOF
创立 ca-csr.json 文件
vi ca-csr.json
<code>
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
],
"ca": {"expiry": "87600h"}
}
</code>
生成 CA 证书和私钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
ls -lt ca*
-rw-r--r--. 1 root root 1001 4 月 15 12:00 ca.csr
-rw-------. 1 root root 1675 4 月 15 12:00 ca-key.pem
-rw-r--r--. 1 root root 1359 4 月 15 12:00 ca.pem
创立 kubernetes 证书
vi kubernetes-csr.json
<code>
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"192.168.1.193",
"192.168.1.194",
"192.168.1.195",
"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"
}
]
}
</code>
如果 hosts 字段不为空则须要指定受权应用该证书的 IP 或域名列表,因为该证书后续被 etcd 集群和 kubernetes master 集群应用,所以下面别离指定了 etcd 集群、kubernetes master 集群的主机 IP 和 kubernetes 服务的服务 IP(个别是 kube-apiserver 指定的 service-cluster-ip-range 网段的第一个 IP,如 10.254.0.1)cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
ll kubernetes*
-rw-r--r--. 1 root root 1261 4 月 15 15:24 kubernetes.csr
-rw-r--r--. 1 root root 560 4 月 15 15:24 kubernetes-csr.json
-rw-------. 1 root root 1679 4 月 15 15:24 kubernetes-key.pem
-rw-r--r--. 1 root root 1627 4 月 15 15:24 kubernetes.pem
创立 admin-csr.json 证书
这个 admin 证书,是未来生成管理员用的 kube config 配置文件用的,当初咱们个别倡议应用 RBAC 来对 kubernetes 进行角色权限管制,kubernetes 将证书中的 CN 字段 作为 User,O 字段作为 Group(具体参考 Kubernetes 中的用户与身份认证受权中 X509 Client Certs 一段)。vi admin-csr.json
<code>
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
</code>
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
ll admin*
-rw-r--r--. 1 root root 1009 4 月 15 17:23 admin.csr
-rw-r--r--. 1 root root 229 4 月 15 17:10 admin-csr.json
-rw-------. 1 root root 1679 4 月 15 17:23 admin-key.pem
-rw-r--r--. 1 root root 1399 4 月 15 17:23 admin.pem
创立 kube-proxy 证书
vi kube-proxy-csr.json
<code>
{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
</code>
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
======== 校验证书 =========
应用 openssl 命令
openssl x509 -noout -text -in kubernetes.pem
应用 cfssl-certinfo 命令
cfssl-certinfo -cert kubernetes.pem
散发证书
mkdir -p /etc/kubernetes/ssl
cp *.pem /etc/kubernetes/ssl
散发证书给节点
mkdir -p /etc/kubernetes/ssl
scp *.pem root@192.168.1.194:/etc/kubernetes/ssl/
scp *.pem root@192.168.1.195:/etc/kubernetes/ssl/