RHEL9 搭建 Harbor 私有仓库与 Ansible 自动化部署 Kubernetes 运行环境完整实践

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 运行环境的全链路自动化部署:

  1. 基于 httpd + createrepo 搭建内网 Docker YUM 源,满足离线部署需求

  2. 部署 Harbor v2.5.4 私有镜像仓库并配置 HTTPS,提供安全的镜像存储能力

  3. 通过 Ansible 批量完成 K8s 节点的系统配置、Docker 环境、cri-dockerd 与 K8s 组件部署,大幅提升多节点部署效率

后续可基于该环境执行 kubeadm init 完成集群初始化,接入工作节点形成完整 Kubernetes 集群。

相关推荐
HiDev_1 小时前
【非标自动化】2、认识元器件(模拟量模块)
运维·自动化
网安蟹佬霸2 小时前
SSRF服务端请求伪造攻防实战:从内网穿透到云元数据利用
sql·web安全·网络安全·自动化·网安
HiDev_2 小时前
【非标自动化】2、认识元器件(数字量输入输出模块)
运维·自动化
白猫不黑3 小时前
AI Agent自动化渗透测试实战:从原理到红队实践
运维·人工智能·web安全·网络安全·信息安全·渗透测试·自动化
wzq11_6663 小时前
Ansible自动部署Redis——六步自动安装Redis数据库
ansible
奇特認12 小时前
kubernetes 环境部署
云原生·容器·kubernetes
ltl12 小时前
etcd 深度解剖:Watch、MVCC 与 Kubernetes 里的角色
kubernetes
mohesashou12 小时前
红帽linux的K8S部署
linux·kubernetes·ansible