这个系列记录二进制部署多 Master 高可用 K8s 集群的完整过程,从证书、组件到网络插件都手工搭一遍,不用 kubeadm。本篇是第一部分:环境约定、cfssl 工具安装、CA 根证书的创建和分发。节点角色按常见的三 master 加若干 worker 规划,这里只记录实际执行的命令。
环境约定
- K8s 版本 1.25+,本系列的流程同样适用 1.25、1.26、1.27。
- 容器运行时用 Containerd,网络插件用 Calico。
- 系统为 CentOS 7.6。
- 开始前确认 k8s-master1 与其余集群节点已经打通主机名免密和 IP 免密登入,后面分发证书要靠 ssh/scp。
- 所有命令和文件先在
k8s-master1上生成,再分发到其他节点。
安装 cfssl 工具集
集群各组件之间要用 x509 证书加密和通信做认证,CA 是自签名的根证书,集群所有节点共享,只需要创建一次,后面所有证书都由它签名。证书统一用 CloudFlare 的 PKI 工具集 cfssl(https://github.com/cloudflare/cfssl)来生成,先下载三个二进制:
[root@k8s-master1 ~]# mkdir -p /opt/k8s/cert && cd /opt/k8s
[root@k8s-master1 k8s]# wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl_1.6.1_linux_amd64
[root@k8s-master1 k8s]# mv cfssl_1.6.1_linux_amd64 /opt/k8s/bin/cfssl
[root@k8s-master1 k8s]# wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssljson_1.6.1_linux_amd64
[root@k8s-master1 k8s]# mv cfssljson_1.6.1_linux_amd64 /opt/k8s/bin/cfssljson
[root@k8s-master1 k8s]# wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl-certinfo_1.6.1_linux_amd64
[root@k8s-master1 k8s]# mv cfssl-certinfo_1.6.1_linux_amd64 /opt/k8s/bin/cfssl-certinfo
[root@k8s-master1 k8s]# chmod +x /opt/k8s/bin/*
[root@k8s-master1 k8s]# export PATH=/opt/k8s/bin:$PATH
创建 CA 根证书
签名配置文件
[root@k8s-master1 k8s]# cd /opt/k8s/work
[root@k8s-master1 work]# cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "876000h"
}
}
}
}
EOF
字段含义:signing 表示该证书可用于签名其他证书(生成的 ca.pem 里 CA=TRUE);server auth 表示客户端可以用它验证服务端证书;client auth 反过来;"expiry": "876000h" 把有效期设成了 100 年。
证书签名请求(CSR)
CSR 文件里写的是域名、公司、单位、组织这类信息:
[root@k8s-master1 work]# cat > ca-csr.json <<EOF
{
"CN": "kubernetes-ca",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "ShangHai",
"L": "ShangHai",
"O": "k8s",
"OU": "dqz"
}
],
"ca": {
"expiry": "876000h"
}
}
EOF
生成证书和私钥
CA 证书用来签发后续的客户端/服务端证书:
[root@k8s-master1 work]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
[root@k8s-master1 work]# ls ca*
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem
分发证书到所有节点
worker 节点要用和 master 相同的 CA 证书做身份验证和加密通信,所以 CA 必须部署到每个节点,并定期更新。逐节点建目录再拷文件:
[root@k8s-master1 work]# for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "mkdir -p /etc/kubernetes/cert"
scp ca*.pem ca-config.json root@${node_ip}:/etc/kubernetes/cert
done
注意事项
免密登录没打通的话,分发这一步会逐台卡在密码交互上,建议先确认 ssh root@节点IP hostname 能直接通。cfssl 的 PATH 是用 export 临时生效的,想长期可用要把 export PATH=/opt/k8s/bin:$PATH 写进 /etc/profile。证书目录后续组件配置都按 /etc/kubernetes/cert 引用,改名会连锁出错,最好一步到位。下一篇继续做 etcd 集群的证书和二进制部署。
















暂无评论内容