1. 项目背景与核心价值
在Kubernetes集群的运维实践中,软件包的高效分发是个常被忽视的关键环节。当你有几十个节点需要同时安装或更新相同软件时,传统的逐个节点下载方式不仅耗时,还会对公网带宽造成压力。三年前我在某次生产环境紧急升级中就吃过这个亏——当时所有节点同时从海外镜像站拉取800MB的Docker安装包,直接导致公司出口带宽被打满。
本地YUM仓库正是解决这类问题的银弹方案。通过将常用软件包集中缓存在内网FTP服务器上,配合阿里云镜像源的定期同步,我们既能享受官方源的稳定性,又能获得内网传输的速度优势。实测下来,节点安装软件的速度能从原来的5分钟缩短到20秒以内,且完全不受外网波动影响。
Rocky Linux作为CentOS的替代品,其8.6版本在企业级场景中表现尤为稳定。本次搭建方案特别针对K8s集群环境优化,包含以下核心优势:
- 通过vsftpd实现企业级FTP服务,支持TLS加密传输
- 智能混合源配置:优先使用本地缓存,缺失包自动回源阿里云
- 针对K8s节点定制的软件包集合(kubeadm、docker-ce等)
- 完整的SELinux策略配置,杜绝权限问题
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 系统环境要求
选择一台配置适中的服务器作为仓库主机,建议:
- 操作系统:Rocky Linux 8.6 Minimal安装(无GUI)
- 硬件配置:4核CPU/8GB内存/100GB存储(视软件包规模可调整)
- 网络要求:千兆内网连接,固定IP地址
重要提示:生产环境务必使用独立磁盘挂载到/var/ftp目录,避免系统盘被日志文件写满。我曾遇到过因未做隔离导致仓库服务器崩溃的案例。
2.2 基础服务安装
首先更新系统并安装必要工具:
bash复制dnf update -y && dnf install -y \
vim wget curl net-tools \
epel-release createrepo
配置主机名解析(假设主机IP为192.168.1.100):
bash复制echo "192.168.1.100 ftp.yum.local" >> /etc/hosts
hostnamectl set-hostname ftp.yum.local
2.3 防火墙与SELinux策略
Rocky Linux默认启用的安全模块需要特别处理:
bash复制# 放行FTP服务
firewall-cmd --permanent --add-service=ftp
firewall-cmd --reload
# SELinux策略调整
setsebool -P ftpd_full_access on
semanage fcontext -a -t public_content_t "/var/ftp(/.*)?"
restorecon -Rv /var/ftp
3. FTP服务深度配置
3.1 vsftpd企业级部署
安装并配置vsftpd服务:
bash复制dnf install -y vsftpd
编辑配置文件/etc/vsftpd/vsftpd.conf,关键参数如下:
ini复制anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
# 性能优化参数
max_clients=200
max_per_ip=50
pasv_min_port=50000
pasv_max_port=51000
3.2 存储目录结构设计
创建符合YUM仓库标准的目录结构:
bash复制mkdir -p /var/ftp/rocky/{8,8.6}/{BaseOS,AppStream,Extras}/
mkdir -p /var/ftp/centos/{7,8}/{os,updates,extras}/
mkdir -p /var/ftp/epel/{7,8}/
mkdir -p /var/ftp/custom/{k8s,docker}/
设置权限确保FTP用户可读:
bash复制chown -R ftp:ftp /var/ftp
find /var/ftp -type d -exec chmod 755 {} \;
find /var/ftp -type f -exec chmod 644 {} \;
3.3 TLS加密传输配置
生成SSL证书实现安全传输:
bash复制openssl req -x509 -nodes -days 3650 \
-newkey rsa:2048 \
-keyout /etc/vsftpd/vsftpd.pem \
-out /etc/vsftpd/vsftpd.pem
在vsftpd.conf末尾追加:
ini复制rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.pem
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH
4. YUM仓库构建实战
4.1 阿里云镜像源同步
配置repo文件/etc/yum.repos.d/aliyun.repo:
ini复制[aliyun-baseos]
name=Aliyun BaseOS - $basearch
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-rockyofficial
[aliyun-appstream]
name=Aliyun AppStream - $basearch
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-rockyofficial
执行同步脚本:
bash复制reposync -n \
--repoid=aliyun-baseos \
--repoid=aliyun-appstream \
--download-path=/var/ftp/rocky/8.6/
4.2 创建仓库元数据
为每个目录生成repodata:
bash复制createrepo /var/ftp/rocky/8.6/BaseOS/
createrepo /var/ftp/rocky/8.6/AppStream/
createrepo /var/ftp/custom/k8s/
添加定时任务保持同步:
bash复制cat > /etc/cron.daily/yum_sync <<'EOF'
#!/bin/bash
reposync -n -p /var/ftp/rocky/8.6/ --repoid=aliyun-baseos --repoid=aliyun-appstream
createrepo --update /var/ftp/rocky/8.6/BaseOS/
createrepo --update /var/ftp/rocky/8.6/AppStream/
EOF
chmod +x /etc/cron.daily/yum_sync
5. K8s集群节点配置
5.1 基础repo文件配置
在所有节点创建/etc/yum.repos.d/local.repo:
ini复制[local-baseos]
name=Local BaseOS
baseurl=ftp://ftp.yum.local/rocky/8.6/BaseOS/
enabled=1
gpgcheck=0
priority=1
[local-appstream]
name=Local AppStream
baseurl=ftp://ftp.yum.local/rocky/8.6/AppStream/
enabled=1
gpgcheck=0
priority=1
[aliyun-backup]
name=Aliyun Backup
baseurl=https://mirrors.aliyun.com/rockylinux/8.6/BaseOS/$basearch/os/
https://mirrors.aliyun.com/rockylinux/8.6/AppStream/$basearch/os/
enabled=1
gpgcheck=1
priority=2
gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-rockyofficial
5.2 K8s专用软件包准备
在仓库服务器上添加K8s相关源:
bash复制cat > /etc/yum.repos.d/kubernetes.repo <<'EOF'
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
同步K8s相关包到本地:
bash复制reposync -n -p /var/ftp/custom/k8s/ --repoid=kubernetes
createrepo /var/ftp/custom/k8s/
6. 高级维护与排错指南
6.1 仓库健康检查
定期验证仓库完整性:
bash复制# 检查元数据有效性
repoclosure --repoid=local-baseos --repoid=local-appstream
# 检查包依赖关系
repoquery --repoid=local-baseos --requires docker-ce
6.2 常见故障处理
问题1:客户端报错"Could not resolve host"
- 检查/etc/hosts或DNS解析
- 验证防火墙规则:
firewall-cmd --list-all
问题2:SELinux阻止文件访问
- 查看审计日志:
ausearch -m avc -ts recent - 临时解决方案:
setsebool -P allow_ftpd_full_access on
问题3:同步时出现GPG校验失败
- 重新导入密钥:
rpm --import https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-rockyofficial - 或临时禁用校验:
reposync --nogpgcheck
6.3 性能优化技巧
- 使用
rsync替代reposync进行增量同步:
bash复制rsync -avz --delete \
mirrors.aliyun.com::rockylinux/8.6/AppStream/ \
/var/ftp/rocky/8.6/AppStream/
- 启用YUM缓存加速查询:
bash复制echo "keepcache=1" >> /etc/yum.conf
- 使用
nginx做前端缓存减轻FTP压力:
nginx复制location /rocky/ {
alias /var/ftp/rocky/;
autoindex on;
access_log off;
}
