二进制部署高可用 K8s 1.25+ 集群(一):初始化与 CA 证书

这个系列记录二进制部署多 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 集群的证书和二进制部署。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容