苍狗T头像
关注
K8s 集群实战:基于 Harbor 私有仓库 + cri‑dockerd 完整部署封面图

K8s 集群实战:基于 Harbor 私有仓库 + cri‑dockerd 完整部署

#环境说明:RHEL9,Kubernetes v1.35;1.24 + 不再支持 dockershim,使用 cri‑dockerd 适配 Docker;1 台 Harbor 仓库、1 台 Master、2 台 Worker。

一、整体架构与前置原理

1.1 集群节点规划

主机名IP角色配置
harbor.timinglee.org172.25.254.254Harbor 私有镜像仓库1 核 1G
master‑node172.25.254.100K8s 控制平面 master4 核 4G 以上
node1172.25.254.10Worker 工作节点2 核 2G
node2172.25.254.20Worker 工作节点2 核 2G

1.2 核心组件原理

  1. Harbor 私有镜像仓库 Harbor 是企业级镜像仓库,基于 docker‑registry 二次开发,提供 web 界面、权限管理、helm chart 管理。自建私有仓库实现内网拉取镜像,规避公网限流。必须 HTTPS,所有节点信任证书,否则镜像拉取证书报错

  2. cri‑dockerd k8s1.24 移除 dockershim。kubelet 调用 CRI 接口,Docker 本身不实现 CRI。cri‑dockerd 作为垫片,把 kubelet 的 CRI 请求转为 Docker API。 调用链路:kubelet → cri‑dockerd → docker daemon → containerd → runc → 容器

所有节点都要装,kubeadm 操作需要指定--cri-socket=unix:///var/run/cri-dockerd.sock

  1. kubeadm 官方集群部署工具,只负责证书、控制平面组件、节点加入。apiserver/etcd/controller‑manager/scheduler 以静态 Pod运行,由本机 kubelet 直接管理。

  2. Flannel CNI 网络插件 k8s 本身不实现网络,依赖 CNI 插件。不安装网络插件节点状态为NotReady。Flannel 使用 VXLAN,每个节点分配 Pod 子网,实现 Pod 跨主机通信。本文 Pod 网段:10.244.0.0/16.

二、部署 Harbor 私有镜像仓库(harbor 节点 172.25.254.254)

2.1 构建本地 Docker 内网 YUM 源

# 创建docker源文件
cat > /etc/yum.repos.d/docker.repo <<EOF
[docker]
name = docker
baseurl = https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/
gpgcheck = 0
EOF

# 安装httpd与createrepo
dnf install httpd createrepo -y

# 创建网站目录
mkdir -p /var/www/html/docker/

# 修改httpd监听4444端口
vim /etc/httpd/conf/httpd.conf
Listen 4444

# 启动httpd
systemctl enable --now httpd

# 下载docker-ce全部rpm包到/mnt
dnf install docker-ce --downloadonly --destdir /mnt/ -y

# 移动rpm包到网站目录
mv /mnt/*.rpm /var/www/html/docker/

# 创建yum仓库元数据
createrepo -v /var/www/html/docker/

# 修改repo,指向内网http源
cat > /etc/yum.repos.d/docker.repo <<EOF
[docker]
name = docker
baseurl = http://172.25.254.254:4444/docker
gpgcheck = 0
EOF

2.2 Harbor 节点安装 Docker + 内核调优

# 安装docker-ce
dnf install docker-ce -y

# 加载br_netfilter内核模块
echo br_netfilter > /etc/modules-load.d/docker_mod.conf
modprobe -a br_netfilter

# k8s网络内核参数
vim /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1

systemctl restart systemd-modules-load.service
sysctl --system

# docker配置加速器
vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
  "iptables": true
}

systemctl daemon-reload
systemctl enable --now docker

2.3 生成 Harbor 自签名证书

mkdir -p /data/certs

openssl req -newkey rsa:4096 \
-nodes -sha256 -keyout /data/certs/timinglee.org.key \
-addext "subjectAltName = DNS:reg.timinglee.org" \
-x509 -days 365 -out /data/certs/timinglee.org.crt

交互:

Country Name: CN
State or Province Name: Shannxi
Locality Name: Xi'an
Organization Name: kubernetes
Organizational Unit Name: harbor
Common Name: reg.timinglee.org
Email Address: [email protected]

2.4 部署 Harbor 离线包

提前准备好离线包:harbor-offline-installer-v2.5.4.tgz放到 /opt 解压

tar zxf harbor-offline-installer-v2.5.4.tgz -C /opt/
cd /opt/harbor
cp harbor.yml.tmpl harbor.yml

vim harbor.yml
hostname: reg.timinglee.org
certificate: /data/certs/timinglee.org.crt
private_key: /data/certs/timinglee.org.key
harbor_admin_password: lee

执行安装(开启 chartmuseum):

./install.sh --with-chartmuseum

配置 systemd 管理 harbor

vim /lib/systemd/system/harbor.service
[Unit]
Description=harbor with Docker Compose
Documentation=https://reg.timinglee.com/compose/
After=docker.service network-online.target
Requires=docker.service
[Service]
Type=oneshot
WorkingDirectory=/opt/harbor
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

systemctl daemon-reload
systemctl enable --now harbor
docker compose ps

2.5 Harbor 本地验证

mkdir -p /etc/docker/certs.d/reg.timinglee.org/
cp /data/certs/timinglee.org.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt

vim /etc/hosts
172.25.254.254     harbor reg.timinglee.org

systemctl restart docker

# 登录harbor
docker login reg.timinglee.org -u admin
# 密码:lee

三、所有 K8s 节点统一初始化(master node1 node2 全部执行)

3.1 关闭 swap 分区

vim /etc/fstab
#注释swap那一行
#/dev/mapper/rhel-swap   none                    swap    defaults        0 0

reboot
#重启后校验,无输出代表swap关闭
swapon -s

3.2 Harbor 节点分发证书到三台 k8s 机器(在 harbor 执行)

for i in 100 10 20
do
scp /data/certs/timinglee.org.crt [email protected].$i:/etc/docker/certs.d/reg.timinglee.org/ca.crt
done

3.3 所有节点 docker 配置私有仓库镜像加速

cat >/etc/docker/daemon.json <<EOF
{
  "registry-mirrors":["https://reg.timinglee.org"]
}
EOF
systemctl restart docker
#查看镜像加速器是否生效
docker info

3.4 /etc/hosts 主机解析(所有节点)

vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.100     master
172.25.254.10      node1
172.25.254.20      node2
172.25.254.254     reg.timinglee.org

3.5 配置 kubernetes yum 源(所有节点)

vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name = kubernetes
baseurl = https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm/
gpgcheck = 0

#校验源
dnf list kubelet

四、所有节点部署 cri‑dockerd(二进制方式,master node1 node2)

提前下载:cri-dockerd-0.4.4.amd64.tgz

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.4.4/cri-dockerd-0.4.4.amd64.tgz
tar zxf cri-dockerd-0.4.4.amd64.tgz
cd cri-dockerd

#复制二进制程序
install -o root -g root -m 0755 cri-dockerd  /usr/local/bin/cri-dockerd

#复制systemd单元文件
cp cri-docker.service cri-docker.socket /lib/systemd/system/

#修改service启动参数
vim /lib/systemd/system/cri-docker.service
[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=reg.timinglee.org/k8s/pause:3.10.1 --container-runtime-endpoint fd://
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

启动服务

systemctl daemon-reload
systemctl enable --now cri-docker.service
#验证socket文件是否生成
ll /var/run/cri-dockerd.sock

五、安装 k8s 组件

5.1 Master 节点(172.25.254.100)

dnf install kubelet kubeadm kubectl -y
systemctl enable --now kubelet.service

#配置命令补全
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo "source <(kubeadm completion bash)" >> ~/.bashrc
source ~/.bashrc

5.2 Worker 节点 node1 node2

dnf install kubelet kubeadm  -y
systemctl enable --now kubelet.service

六、master 初始化 k8s 集群

6.1 关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

6.2 kubeadm init 初始化集群

kubeadm init --pod-network-cidr=10.244.0.0/16 \
--image-repository reg.timinglee.org/k8s \
--kubernetes-version v1.35.7 \
--cri-socket=unix:///var/run/cri-dockerd.sock

初始化成功后输出kubeadm join命令,保存下来,用于 node 节点加入集群

6.3 配置 kubectl 环境变量(master)

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

如果忘记 join 命令,重新生成:

kubeadm token create --print-join-command

6.4 worker 节点加入集群(node1 node2 执行,务必带上 cri‑socket)

kubeadm join 172.25.254.100:6443 --token xxx \
--discovery-token-ca-cert-hash sha256:xxxx \
--cri-socket unix:///var/run/cri-dockerd.sock

master 查看节点状态,此时状态是NotReady,还没部署网络插件

kubectl get nodes

七、部署 Flannel 网络插件(master 执行)

准备:kube-flannel-v0.28.9.tar.gz

tar zxf kube-flannel-v0.28.9.tar.gz
cd flannel

docker load -i kube-flannel-v0.28.9.tar

#镜像打标签推送到内网harbor
docker tag ghcr.io/flannel-io/flannel-cni-plugin:v1.9.1-flannel3 reg.timinglee.org/flannel-io/flannel-cni-plugin:v1.9.1-flannel3
docker push reg.timinglee.org/flannel-io/flannel-cni-plugin:v1.9.1-flannel3

docker tag ghcr.io/flannel-io/flannel:v0.28.9 reg.timinglee.org/flannel-io/flannel:v0.28.9
docker push reg.timinglee.org/flannel-io/flannel:v0.28.9

修改kube-flannel.yml,把镜像地址替换为私有 harbor 地址

vim kube-flannel.yml
#将所有image后的ghcr.io地址替换为reg.timinglee.org下对应的镜像

部署网络插件

kubectl apply -f kube-flannel.yml

等待片刻查看节点状态,全部变为 Ready

kubectl get nodes
kubectl get pods -n kube-flannel
kubectl get pods -n kube-system

八、常见踩坑总结

  1. cri‑dockerd socket 路径写错:kubeadm 无法连接 CRI,确认/var/run/cri‑dockerd.sock存在。
  2. Harbor 证书没有分发所有节点:docker 拉取镜像报 x509 证书错误。
  3. swap 没有彻底关闭:kubelet 反复重启,kubeadm 预检查失败。
  4. pod‑network‑cidr与 flannel 配置网段不一致:节点 NotReady,coredns 无法启动。
  5. master 未配置KUBECONFIG环境变量:kubectl 报连接 apiserver 拒绝。
  6. 网桥内核参数未配置:Service、Pod 跨节点访问异常。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2402_85204741/article/details/164004067

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--