二进制部署 K8s 1.25+(三):kubectl 的证书与配置分发

这一篇是二进制部署高可用 K8s 集群系列的第三步,内容只有一件事:把所有节点上的 kubectl 命令行工具装好,并让它有权限访问 API Server。流程分五步:分发二进制、签 admin 证书、生成 kubeconfig、分发配置、验证。

下载和分发 kubectl 二进制

把下载好的二进制包上传到 Master1 节点,再拷贝到其他节点:

[root@k8s-master1 ~]# cd /opt/k8s/work
[root@k8s-master1 work]# tar -zxvf kubernetes-client-linux-amd64.tar.gz
kubernetes/
kubernetes/client/
kubernetes/client/bin/
kubernetes/client/bin/kubectl
kubernetes/client/bin/kubectl-convert


[root@k8s-master1 work]# for node_ip in ${NODE_IPS[@]}
  do
    echo ">>> ${node_ip}"
    scp kubernetes/client/bin/kubectl root@${node_ip}:/opt/k8s/bin/
    ssh root@${node_ip} "chmod +x /opt/k8s/bin/*"
  done

创建 admin 证书和私钥

先创建证书签名请求,注意 O 字段是 system:masters,这决定了 admin 拥有集群最高权限:

[root@k8s-master1 ~]# cd /opt/k8s/work
[root@k8s-master1 work]# cat > admin-csr.json <<EOF
{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "ShangHai",
      "L": "ShangHai",
      "O": "system:masters",
      "OU": "dqz"
    }
  ]
}
EOF

用前面生成的 CA 签发证书和私钥:

[root@k8s-master1 work]# cfssl gencert -ca=/opt/k8s/work/ca.pem 
  -ca-key=/opt/k8s/work/ca-key.pem 
  -config=/opt/k8s/work/ca-config.json 
  -profile=kubernetes admin-csr.json | cfssljson -bare admin

[root@k8s-master1 work]# ls admin*
admin.csr  admin-csr.json  admin-key.pem  admin.pem

创建 kubeconfig 文件

分四步:设置集群参数、客户端认证参数、上下文参数,最后把默认上下文切过去。其中 ${KUBE_APISERVER} 指向 API Server 的负载均衡地址(前面篇子里通过 HAProxy+Keepalived 提供):

[root@k8s-master1 work]# kubectl config set-cluster kubernetes 
  --certificate-authority=/opt/k8s/work/ca.pem 
  --embed-certs=true 
  --server=${KUBE_APISERVER} 
  --kubeconfig=kubectl.kubeconfig
[root@k8s-master1 work]# kubectl config set-credentials admin 
  --client-certificate=/opt/k8s/work/admin.pem 
  --client-key=/opt/k8s/work/admin-key.pem 
  --embed-certs=true 
  --kubeconfig=kubectl.kubeconfig
[root@k8s-master1 work]# kubectl config set-context kubernetes 
  --cluster=kubernetes 
  --user=admin 
  --kubeconfig=kubectl.kubeconfig
[root@k8s-master1 work]# kubectl config use-context kubernetes --kubeconfig=kubectl.kubeconfig

分发 kubeconfig 并验证

把配置发到所有 Master 和 Work 节点的 ~/.kube/config:

[root@k8s-master1 work]# for node_ip in ${NODE_IPS[@]}
  do
    echo ">>> ${node_ip}"
    ssh root@${node_ip} "mkdir -p ~/.kube"
    scp kubectl.kubeconfig root@${node_ip}:~/.kube/config
  done

每个节点执行 kubectl --help 确认命令可用。再给所有节点配上命令补全:

yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

注意事项

admin 证书没有绑定 hosts,属于高权限通用凭证,只放在自己管理的节点上;kubeconfig 分发后如果某个节点执行 kubectl 报证书错误,优先检查该节点时间同步和 ${KUBE_APISERVER} 变量是否和负载均衡 VIP 一致。

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

请登录后发表评论

    暂无评论内容