RHEL9 搭建 Harbor 私有仓库与 Ansible 自动化部署 Kubernetes 运行环境完整实践
本文基于 RHEL 9 操作系统,完整覆盖从内网 Docker 本地 YUM 仓库搭建、Harbor 私有镜像仓库部署,到使用 Ansible 批量自动化完成 Kubernetes 集群节点运行环境准备的全流程,适用于内网离线场景下的容器平台标准化部署。
一、构建 Harbor 私有镜像仓库
1.1 搭建内网 Docker 本地 YUM 仓库
在内网环境中,通过 HTTP 服务搭建统一的 Docker 软件源,可为所有集群节点提供离线安装能力,避免重复从公网下载安装包。
步骤1:配置公网 Docker 阿里云源
首先在仓库服务器上配置阿里云 Docker CE 官方源,用于后续下载完整的 RPM 安装包。
Bash
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

步骤2:安装 HTTP 服务与仓库生成工具
使用 httpd 提供 HTTP 文件访问能力,createrepo 生成 YUM 仓库元数据。
Bash
dnf install httpd createrepo -y

步骤3:创建仓库目录并配置 HTTP 服务
创建 Docker 安装包存放目录,修改 httpd 监听端口为 4444(避免与后续 Harbor 端口冲突),并启动服务设置开机自启。
Bash
mkdir /var/www/html/docker/ -p
vim /etc/httpd/conf/httpd.conf
# 修改 Listen 4444
systemctl enable --now httpd
步骤4:下载 Docker 安装包并生成仓库
使用 --downloadonly 模式下载 Docker CE 全量依赖包,移动到 HTTP 服务目录后,通过 createrepo 生成仓库元数据。
Bash
dnf install docker-ce --downloadonly --destdir /mnt/ -y
mv /mnt/*.rpm /var/www/html/docker/
createrepo -v /var/www/html/docker/
步骤5:客户端配置本地 Docker 源验证
在需要安装 Docker 的节点上,配置指向本地仓库的 yum 源,验证仓库可用性。
Bash
cat > /etc/yum.repos.d/docker.repo <<EOF
[docker]
name = docker
baseurl = http://172.25.254.200:4444/docker
gpgcheck = 0
EOF

1.2 Harbor 节点安装 Docker
Harbor 基于 Docker 运行,首先在 Harbor 服务器上完成 Docker 安装与基础配置。
步骤1:安装 Docker CE
通过本地 YUM 源安装 Docker CE 及相关组件。
Bash
dnf install docker-ce -y

步骤2:配置 Docker 服务参数
修改 Docker 系统服务文件,启用 iptables 支持,确保容器网络规则正常生效。
Bash
vim /lib/systemd/system/docker.service
# 在 ExecStart 行末尾添加 --iptables=true

步骤3:重载配置并启动 Docker
重载 systemd 配置,启动 Docker 服务并设置开机自启。
Bash
systemctl daemon-reload
systemctl enable --now docker
1.3 生成 SSL 自签证书
为 Harbor 配置 HTTPS 访问,使用 OpenSSL 生成自签证书并配置 SAN 域名。
步骤1:创建证书存放目录
Bash
mkdir /data/certs -p
步骤2:生成自签证书
执行 OpenSSL 命令生成 4096 位 RSA 证书,配置有效期与备用域名。
Bash
openssl req -newkey rsa:4096 \
-nodes -sha256 -keyout /data/certs/timingle.org.key \
-addext "subjectAltName = DNS:reg.timingle.org" \
-x509 -days 365 -out /data/certs/timingle.org.crt

步骤3:填写证书信息
按照提示依次填写国家、省份、城市、组织、部门、通用名与邮箱,其中通用名需与 Harbor 访问域名一致。

1.4 编辑 Harbor 配置文件
Harbor 采用离线包部署,解压后修改核心配置文件即可完成定制化部署。
步骤1:解压 Harbor 离线安装包
将离线安装包解压到 /opt 目录,并进入对应目录。
Bash
tar zxf harbor-offline-installer-v2.5.4.tgz -C /opt/
cd /opt/harbor/
步骤2:复制并修改配置文件
复制模板配置文件为 harbor.yml,修改主机名、HTTPS 证书路径与管理员初始密码。
Bash
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
核心配置项:
-
hostname: 设置为reg.timingle.org -
https.port: 保持 443 -
certificate: 指向证书文件路径 -
private_key: 指向私钥文件路径 -
harbor_admin_password: 设置管理员密码

1.5 启动 Harbor 并验证访问
步骤1:执行安装脚本
执行安装脚本并启用 ChartMuseum 组件,支持 Helm Chart 存储。
Bash
./install.sh --with-chartmuseum

步骤2:配置 systemd 管理 Harbor
编写 systemd 服务文件,实现 Harbor 开机自启与标准化管理。
Bash
vim /lib/systemd/system/harbor.service
服务配置内容:
Plaintext
[Unit]
Description=harbor with Docker Compose
Documentation=https://reg.timingle.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
步骤3:启用服务并验证容器状态
启用 Harbor 服务,通过 docker compose ps 查看所有组件运行状态。
Bash
systemctl enable --now harbor
docker compose ps

1.6 配置 Docker 信任 Harbor 仓库
步骤1:创建证书目录并复制证书
在 Docker 客户端创建对应域名的证书目录,将 Harbor CA 证书复制到该路径。
Bash
mkdir /etc/docker/certs.d/reg.timingle.org/ -p
cp /data/certs/timingle.org.crt /etc/docker/certs.d/reg.timingle.org/ca.crt
步骤2:配置 hosts 域名解析
添加 Harbor 域名与 IP 的映射关系,确保域名正常访问。
Bash
vim /etc/hosts
# 添加 172.25.254.200 harbor reg.timingle.org

步骤3:验证登录 Harbor
重启 Docker 与 Harbor 服务后,执行 docker login 验证仓库登录。
Bash
systemctl restart docker
docker compose up -d
docker login reg.timingle.org -u admin
出现 Login Succeeded 即表示配置成功。

二、Ansible 自动化部署 Kubernetes 运行环境
2.1 集群环境规划
本次部署包含 1 台 Harbor 仓库节点、1 台 K8s 控制节点、2 台 K8s 工作节点,具体规划如下:
| 主机名 | IP 地址 | 配置 | 角色 |
|---|---|---|---|
| harbor.timingle.org | 172.25.254.200 | CPU 1核、内存 1G | Harbor 镜像仓库 |
| master-node | 172.25.254.100 | CPU 4核、内存 >4G | K8s 集群控制节点 |
| node1 | 172.25.254.10 | CPU 2核、内存 2G | K8s 集群工作节点 |
| node2 | 172.25.254.20 | CPU 2核、内存 2G | K8s 集群工作节点 |
2.2 所有节点基础系统配置
Kubernetes 运行有明确的系统要求,所有节点需提前完成基础配置。
2.2.1 永久关闭 Swap 分区
Kubelet 不支持 Swap 分区,需在所有节点永久关闭。
Bash
# 立即禁用Swap
systemctl disable --now swap.target
# 屏蔽Swap服务防止自动启动
systemctl mask swap.target
# 注释fstab中Swap挂载项
sed '/swap/s/^/#/g' -i /etc/fstab
重启主机后,通过 swapon -s 验证,无任何输出即表示关闭成功。

2.2.2 配置 Docker 镜像加速器
所有节点配置 Harbor 作为镜像加速器,提升镜像拉取速度。
Bash
cat >/etc/docker/daemon.json <<EOF
{
"registry-mirrors":["https://reg.timingle.org"]
}
EOF
systemctl restart docker
通过 docker info 可查看 Registry Mirrors 配置生效。
2.2.3 配置主机名解析
所有节点添加集群内所有主机的 hosts 解析,确保节点间通过主机名正常通信。
Bash
vim /etc/hosts
添加内容:
Plaintext
172.25.254.100 master
172.25.254.10 node1
172.25.254.20 node2
172.25.254.200 reg.timingle.org
2.2.4 配置 Kubernetes 安装源
所有节点配置阿里云 Kubernetes v1.35 软件源。
Bash
vim /etc/yum.repos.d/kubernetes.repo
源配置内容:
Plaintext
[kubernetes]
name = kubernetes
baseurl = https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm/
gpgcheck = 0
通过 dnf list kubelet 验证源配置正常。
2.3 Ansible 自动化环境搭建
使用 Ansible 实现批量节点的自动化配置,在 Harbor 节点上部署 Ansible 控制端。
2.3.1 安装 Ansible
配置 EPEL 源后安装 Ansible 核心组件。
Bash
vim /etc/yum.repos.d/epel.repo
EPEL 源配置:
Plaintext
[epel]
name = epel
baseurl = https://mirrors.aliyun.com/epel/9/Everything/x86_64/
gpgcheck = 0
执行安装:
Bash
dnf install ansible-core.x86_64 ansible.noarch -y
2.3.2 创建运维用户与工作目录
创建专用运维用户 devops,并配置 Ansible 工作目录。
Bash
useradd devops
echo lee | passwd --stdin devops
su - devops
mkdir ansible
cd ansible/

2.3.3 配置 Ansible 清单与主配置
创建主机清单文件 inventory 与主配置文件 ansible.cfg。
inventory 主机清单:
Plaintext
[servers]
172.25.254.100
172.25.254.20
172.25.254.10
ansible.cfg 主配置:
Plaintext
[defaults]
inventory = /home/devops/ansible/inventory
remote_user = root
ask_pass = false
host_key_checking = false
2.3.4 配置 SSH 免密登录
生成 ED25519 类型密钥对,并将公钥分发到所有受控节点。
Bash
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
for ip in 172.25.254.10 172.25.254.20 172.25.254.100
do
ssh-copy-id root@$ip
done

2.3.5 验证 Ansible 连通性
使用 ping 模块验证所有节点的 Ansible 连通性,全部返回 SUCCESS 即表示环境正常。
Bash
ansible all -m ping

2.4 Ansible 批量配置节点用户环境
步骤1:批量创建 devops 用户
Bash
ansible all -m user -a "name=devops state=present"

步骤2:配置用户密码与 sudo 免密
批量设置用户密码,并配置 sudo 无密码权限。
Bash
ansible all -m shell -a 'echo "lee" | passwd --stdin devops'
ansible all -m lineinfile -a 'path=/etc/sudoers line="devops ALL=(ALL) NOPASSWD: ALL" insertafter=EOF'

步骤3:分发 SSH 公钥到 devops 用户
将控制端公钥批量添加到所有节点 devops 用户的授权列表。
Bash
ansible all -m authorized_key -a "user=devops key='{{ lookup('file','~/.ssh/id_ed25519.pub') }}'" -u root

步骤4:验证远程执行权限
验证远程命令执行身份,确认权限正常。
Bash
ansible all -m shell -a 'whoami'

2.5 Ansible Playbook 批量部署运行环境
通过 Ansible Playbook 一次性完成 Docker、cri-dockerd、Kubernetes 组件的全量部署。
2.5.1 准备 cri-dockerd 部署文件
Kubernetes v1.24+ 移除了 Docker 内置支持,需通过 cri-dockerd 作为 CRI 接口。解压安装包并修改服务配置,指定 pause 镜像地址为私有仓库地址。
Bash
tar zxf cri-dockerd-0.4.4.amd64.tgz
cd cri-dockerd/
vim cri-docker.service
服务核心配置:
Plaintext
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.timingle.org/k8s/pause:3.10.1
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always


2.5.2 Playbook 完整结构
Playbook 分为两大 Play:Docker 运行环境部署、Kubernetes 组件部署。
第一部分:Docker 环境部署
-
配置本地 Docker YUM 源
-
安装 Docker CE
-
修改 Docker 服务参数
-
配置镜像加速与仓库证书
-
加载内核模块与系统参数
-
部署 cri-dockerd 二进制与服务
-
重启相关服务并设置开机自启
第二部分:Kubernetes 组件部署
-
配置 Kubernetes 安装源
-
控制节点安装 kubeadm、kubelet、kubectl
-
工作节点安装 kubeadm、kubelet
-
配置命令自动补全
-
启动 kubelet 服务




2.5.3 执行 Playbook 部署
运行 Playbook 完成全量自动化部署。
Bash
ansible-playbook kubernetes-devops.yml

2.6 部署结果验证
步骤1:验证 kubectl 与 kubeadm 命令
在控制节点验证命令可用性与自动补全功能。
Bash
source ~/.bashrc
kubectl
kubeadm


步骤2:验证 kubelet 服务状态
查看 kubelet 服务状态,服务已启用并处于自动重启状态(集群初始化后将正常运行)。
Bash
systemctl status kubelet.service

三、总结
本文完整实现了从内网软件源、私有镜像仓库到 Kubernetes 运行环境的全链路自动化部署:
-
基于 httpd + createrepo 搭建内网 Docker YUM 源,满足离线部署需求
-
部署 Harbor v2.5.4 私有镜像仓库并配置 HTTPS,提供安全的镜像存储能力
-
通过 Ansible 批量完成 K8s 节点的系统配置、Docker 环境、cri-dockerd 与 K8s 组件部署,大幅提升多节点部署效率
后续可基于该环境执行 kubeadm init 完成集群初始化,接入工作节点形成完整 Kubernetes 集群。