Kubernetes集群节点配置Docker客户端证书与环境准备(生产级实践详解)

本文将详细介绍如何在生产环境下,基于kubeadm部署Kubernetes集群,并为各节点配置Docker客户端证书,实现安全拉取Harbor私有仓库镜像。内容涵盖环境准备、证书分发、集群初始化等关键步骤,适合企业级K8S集群落地实践。


一、背景说明

在生产环境中,Kubernetes集群通常需要从私有镜像仓库(如Harbor)拉取镜像。为了保证传输安全,Harbor一般通过HTTPS和自签CA证书进行加密认证。此时,K8S集群各节点(包括master和worker)必须正确配置Docker客户端证书,否则会出现x509: certificate signed by unknown authority等认证错误,导致镜像无法拉取。


二、K8S集群节点配置Docker客户端证书

1. 所有节点安装Docker环境

tar xf oldboyedu-autoinstall-docker-docker-compose.tar.gz 
./install-docker.sh i

2. 配置主机名解析(/etc/hosts)

确保所有节点能通过主机名互相访问:

cat >> /etc/hosts << EOF
10.0.0.250 harbor.oldboyedu.com 
10.0.0.231 master231
10.0.0.232 worker232
10.0.0.233 worker233
EOF

3. Harbor服务端生成Docker客户端证书

在Harbor服务器上,假设证书目录为/oldboyedu/softwares/harbor/certs

# 生成docker客户端证书(格式转换)
openssl x509 -inform PEM -in harbor-server/harbor.oldboyedu.com.crt -out docker-client/harbor.oldboyedu.com.cert

# 拷贝私钥和CA证书
cp harbor-server/harbor.oldboyedu.com.key docker-client/
cp ca/ca.crt docker-client/

最终docker-client目录下应有如下文件:

  • ca.crt
  • harbor.oldboyedu.com.cert
  • harbor.oldboyedu.com.key

4. 分发证书到所有K8S节点

在每个K8S节点上,创建对应目录(注意:目录名必须与Harbor域名一致!):

mkdir -pv /etc/docker/certs.d/harbor.oldboyedu.com/

然后从Harbor服务器将证书文件拷贝到每个节点:

scp docker-client/* 10.0.0.231:/etc/docker/certs.d/harbor.oldboyedu.com/
scp docker-client/* 10.0.0.232:/etc/docker/certs.d/harbor.oldboyedu.com/
scp docker-client/* 10.0.0.233:/etc/docker/certs.d/harbor.oldboyedu.com/

5. 验证Docker客户端证书配置

在每个节点执行:

docker login -u admin -p 1 harbor.oldboyedu.com

正常输出:

Login Succeeded

如遇如下报错:

Error response from daemon: Get "https://harbor.oldboyedu.com/v2/": x509: certificate signed by unknown authority

说明证书未正确分发或目录结构有误,请检查/etc/docker/certs.d/harbor.oldboyedu.com/下的证书文件。

生产建议:

  1. 证书分发后,重启docker服务(systemctl restart docker)以确保生效。
  2. 证书目录和Harbor域名必须完全一致,否则docker不会加载证书。
  3. 建议统一用脚本批量分发证书,避免遗漏。

三、K8S各节点环境准备(生产级Checklist)

1. 操作系统准备

  • 推荐使用CentOS 7/8、Ubuntu 18.04/20.04等主流Linux发行版。
  • 关闭防火墙(或开放必要端口)、SELinux/AppArmor。

2. 关闭Swap分区

K8S要求禁用swap,否则kubelet无法启动:

swapoff -a && sysctl -w vm.swappiness=0
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

3. 保证MAC地址和product_uuid唯一

ifconfig  ens33  | grep ether | awk '{print $2}'
cat /sys/class/dmi/id/product_uuid

注意:
虚拟机克隆后要修改MAC和UUID,否则节点注册会冲突。

4. 检查网络互通

ping master231 -c 3
ping worker232 -c 3
ping baidu.com -c 3

5. 允许iptables检查桥接流量

cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system

6. 检查端口占用

参考K8S官方端口文档,确保常用端口未被占用。

7. 设置Docker Cgroup Driver为systemd

docker info | grep "Cgroup Driver:"

如不是systemd,需修改/etc/docker/daemon.json

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

然后重启docker。

8. 安装kubeadm、kubelet、kubectl

8.1 配置K8S软件源

apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update

8.2 安装指定版本

apt-get -y install kubelet=1.23.17-00 kubeadm=1.23.17-00 kubectl=1.23.17-00

8.3 检查版本

kubeadm version
kubectl version
kubelet --version

建议:
所有节点版本保持一致,避免版本漂移导致集群异常。

9. 关机拍快照

强烈建议:
在正式初始化集群前,为所有节点做一次快照,便于回滚。


四、K8S Master节点初始化(kubeadm方式)

1. (可选)提前导入K8S镜像

如网络受限,建议提前下载并导入K8S核心镜像:

docker load -i oldboyedu-master-1.23.17.tar.gz

2. 初始化Master节点

kubeadm init \
  --kubernetes-version=v1.23.17 \
  --image-repository registry.aliyuncs.com/google_containers \
  --pod-network-cidr=10.100.0.0/16 \
  --service-cidr=10.200.0.0/16 \
  --service-dns-domain=oldboyedu.com

参数说明:

  • --kubernetes-version:指定K8S版本
  • --image-repository:指定镜像仓库(国内建议用阿里云)
  • --pod-network-cidr:Pod网络段(与后续CNI插件一致)
  • --service-cidr:Service网络段
  • --service-dns-domain:Service域名后缀

3. 配置kubectl认证文件

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

4. 查看集群状态

kubectl get cs
kubectl get nodes

正常输出:

NAME        STATUS     ROLES                  AGE    VERSION
master231   NotReady   control-plane,master   2m     v1.23.17

注意:
初始化后节点状态为NotReady,需安装网络插件(如Calico/Flannel)后才会变为Ready

5. 保存join命令

初始化输出会生成kubeadm join命令,务必保存好(token有效期24小时),用于worker节点加入集群。


五、常见问题与生产建议

1. Docker证书相关问题

  • 目录名必须与Harbor域名完全一致
  • 证书分发后需重启docker
  • 建议用Ansible/SaltStack等自动化工具批量分发

2. 节点初始化失败

  • 检查MAC/UUID唯一性
  • 检查swap是否关闭
  • 检查cgroup driver是否为systemd
  • 检查端口未被占用

3. 版本兼容性

  • kubelet版本不能高于apiserver
  • 建议所有组件版本一致

六、参考链接


七、结语

本文详细梳理了Kubernetes集群在生产环境下的节点环境准备、Docker客户端证书配置、集群初始化等关键步骤。每一步都经过实际环境反复验证,确保可落地、可复现。希望对你的企业级K8S集群部署有所帮助!

如有疑问或建议,欢迎留言交流!


如果觉得有用,欢迎点赞、收藏、关注!


作者:你的昵称
博客地址:https://你的博客地址
转载请注明出处!


posted on 2025-04-17 16:20  Leo-Yide  阅读(49)  评论(0)    收藏  举报