
kubeasz 实践用 Docker systemd 容器化 haproxy 与 chrony 系统服务【免费下载链接】kubeasz使用Ansible脚本安装K8S集群介绍组件交互原理方便直接不受国内网络环境影响项目地址: https://gitcode.com/GitHub_Trending/ku/kubeasz在 Kubernetes 集群的运维实践中haproxy用于 apiserver 四层负载均衡与 chrony用于集群节点时间同步是两类典型的“系统级守护服务”。本指南以 kubeasz 项目的实操文档为核心讲解如何在 systemd 系统上通过 Docker 容器承载这两个服务既保留 systemd 对进程生命周期、开机自启、故障重启的完整管理能力又获得镜像分发、版本统一、环境隔离等容器化收益。读完本文你将能独立编写 haproxy、chrony 的容器化配置与 systemd unit 文件并能与 kubeasz 仓库内置的原生部署方案chrony role、ex-lb role对照使用。为什么要把系统服务容器化kubeasz 在集群安装阶段默认使用二进制或发行版包的方式部署 haproxy实际为精简版 nginxl4lb、chrony 等服务并通过 systemd 管理。容器化是另一种被广泛采用的交付形态其优势包括统一版本与环境服务运行在固定镜像中不依赖各 Linux 发行版的软件包仓库离线环境与多发行版场景下更可控快速交付与回滚镜像即制品升级只需更换镜像 tag与 systemd 互补由docker run拉起容器Restartalways保证进程异常退出后自动恢复ExecReload可向容器内主进程发送信号实现优雅重载。下面分别以 haproxy 和 chrony 为例给出完整的“配置 systemd unit”方案。容器化 haproxy为 kube-apiserver 提供四层负载均衡在 kubeasz 的 HA 架构中多台 kube-master 各运行一个 kube-apiserver默认安全端口 6443需要前置一个四层负载均衡器将客户端流量分发到多个 apiserver。容器化场景下最直接的做法是使用 Docker Hub 官方维护的 haproxy 镜像docker.io/library/haproxy。编写 haproxy 配置haproxy 的配置通过宿主机文件挂载进容器示例如下对应原文档的完整配置global log stdout format raw local1 notice nbproc 1 defaults log global timeout connect 5s timeout client 10m timeout server 10m listen apiservers bind 0.0.0.0:6443 mode tcp option tcplog option dontlognull option dontlog-normal balance roundrobin server 192.168.1.1 192.168.1.1:6443 check inter 10s fall 2 rise 2 weight 1 server 192.168.1.2 192.168.1.2:6443 check inter 10s fall 2 rise 2 weight 1各关键配置项说明global段log stdout format raw local1 notice将日志输出到标准输出这样docker logs即可查看 haproxy 日志无需额外配置日志文件nbproc 1指定单进程运行容器内多进程会带来信号管理与资源统计上的复杂度保持 1 即可defaults段timeout connect 5s为后端连接超时timeout client/server 10m为客户端与服务端空闲超时。kube-apiserver 的长连接如kubectl exec、日志流依赖较长的空闲超时10 分钟是常见取值listen apiservers段bind 0.0.0.0:6443监听宿主机 6443 端口mode tcp声明四层TCP代理这与 apiserver 的 TLS 流量直接透传的要求一致option tcplog记录 TCP 连接日志option dontlognull/option dontlog-normal抑制空连接与正常连接日志以减少噪音balance roundrobin轮询分发server行定义后端check inter 10s fall 2 rise 2表示每 10 秒健康检查一次连续 2 次失败摘除、连续 2 次成功恢复weight 1设置权重。从源码佐证的角度看kubeasz 仓库内置的 ex-lb 方案在 l4lb.conf.j2 中实现了同样的转发逻辑upstream apiservers通过 Jinja2 模板遍历groups[kube_master]生成所有 apiserver 后端并使用max_fails2 fail_timeout3s做失败剔除。手工容器化 haproxy 时后端 server 行即对应这里的 upstream server 列表健康检查参数inter 10s fall 2 rise 2可以视为等效的探活机制。编写 systemd 服务文件将上述配置保存为/etc/haproxy/haproxy.cfg再创建 systemd 服务文件/etc/systemd/system/haproxy.service[Unit] Descriptionhaproxy Documentationhttps://github.com/docker-library/haproxy Afterdocker.service Requiresdocker.service [Service] Userroot ExecStart/bin/docker run \ --name haproxy \ --publish 6443:6443 \ --volume /etc/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg \ docker.io/library/haproxy:1.9.8-alpine ExecStop/bin/docker rm -f haproxy ExecReload/bin/docker kill -s HUP haproxy Restartalways RestartSec10 Delegateyes LimitNOFILE50000 LimitNPROC50000 [Install] WantedBymulti-user.targetunit 文件要点解析Afterdocker.service与Requiresdocker.service保证容器运行前 Docker 守护进程已就绪ExecStart中的参数--publish 6443:6443将容器 6443 端口映射到宿主机--volume /etc/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg把宿主机配置挂载为容器内默认加载路径官方镜像的默认配置文件位置ExecStop/bin/docker rm -f haproxy停止时强制删除容器避免残留同名容器导致下次启动失败ExecReload/bin/docker kill -s HUP haproxy向容器内 haproxy 主进程发送 HUP 信号触发配置热加载——修改/etc/haproxy/haproxy.cfg后执行systemctl reload haproxy即可生效无需重启服务RestartalwaysRestartSec10容器异常退出 10 秒后自动重启Delegateyes将 cgroup 管理权委托给 systemd 以便管理容器子进程LimitNOFILE50000、LimitNPROC50000提高文件描述符与进程数上限防止高并发连接下触达系统默认 ulimitWantedBymulti-user.target实现开机自启。服务启动后可执行systemctl start haproxy、systemctl status haproxy、journalctl -u haproxy等常规 systemd 命令管理日志则通过docker logs haproxy查看。容器化 chrony为集群提供时间同步时间同步是 Kubernetes 集群的硬性前置条件etcd、证书校验、日志时间戳、kubelet 驱逐判定等都对节点时钟敏感。chrony 是一个比传统 ntpd 性能更好、配置更简的 NTP 实现kubeasz 在 chrony role 中将其作为默认时间同步组件详见 chrony 安装指南。本文给出容器化部署方式一台服务器充当时间源对外与公网 NTP 同步对内提供时间服务其余节点作为客户端指向它。chrony 服务器端配置假设 chrony 服务器端 IP 为192.168.1.1配置/etc/chrony.conf如下$ cat /etc/chrony.conf # Use public servers from the pool.ntp.org project. server ntp1.aliyun.com iburst server ntp2.aliyun.com iburst pool pool.ntp.org iburst # Ignor source level stratumweight 0 # Record the rate at which the system clock gains/losses time. driftfile /var/lib/chrony/drift # Allow the system clock to be stepped in the first five updates # if its offset is larger than 1 second. makestep 1 5 # Enable kernel synchronization of the real-time clock (RTC). rtcsync # Allow NTP client access from local network. allow 0.0.0.0/0 # Serve time even if not synchronized to a time source. local stratum 10 # Select which information is logged. #log measurements statistics tracking # noclientlog配置项含义server ntp1.aliyun.com iburst/pool pool.ntp.org iburst从阿里云 NTP 与公网 NTP 池获取时间iburst让 chrony 在启动初期快速发送多个包完成首次同步stratumweight 0各时间源层级权重置零避免干扰本地时钟源选择driftfile /var/lib/chrony/drift记录本机时钟漂移速率重启后用于快速校准因此该路径需要持久化挂载makestep 1 5前 5 次时钟更新中若偏移超过 1 秒则直接步进校准而非缓慢调整对刚开机时偏差较大的机器尤为重要rtcsync启用内核 RTC 同步allow 0.0.0.0/0允许任意网段的 NTP 客户端访问本服务器生产环境建议收敛为具体网段local stratum 10即使本机尚未与上游同步也以第 10 层提供时间服务保证集群内部总有时间源可用noclientlog不记录客户端访问日志减少 IO。对照 kubeasz 的模板实现 server.conf.j2可以看到相同的参数体系ntp_servers变量默认ntp1.aliyun.com、time1.cloud.tencent.com、0.cn.pool.ntp.org见 defaults/main.yml通过 Jinja2 循环生成多行server指令allow {{ local_network }}由变量控制默认0.0.0.0/0全部放行此外还包含dumpdir、maxupdateskew 100.0、log statistics measurements tracking等日志与调优项手工容器化时可一并参考。chrony 客户端配置集群内其余节点作为客户端指向服务器端192.168.1.1$ cat /etc/chrony.conf # Use local chrony server. server 192.168.1.1 iburst # Record the rate at which the system clock gains/losses time. driftfile /var/lib/chrony/drift # Allow the system clock to be stepped in the first five updates # if its offset is larger than 1 second. makestep 1 5 # Enable kernel synchronization of the real-time clock (RTC). rtcsync # Select which information is logged. #log measurements statistics tracking客户端配置大幅精简只保留server 192.168.1.1 iburst这一条时间源其余为通用的driftfile、makestep、rtcsync项。kubeasz 的 client.conf.j2 实现思路一致通过server {{ groups[chrony][0] }} iburst自动把 inventory 中chrony组的第一个节点作为集群内部时间源这与原文档“服务器端固定 IP”的手工配置在语义上完全对应。编写 systemd 服务文件创建/etc/systemd/system/chrony.service[Unit] Descriptionchrony Documentationhttps://github.com/kubeasz/dockerfiles/chrony Afterdocker.service Requiresdocker.service [Service] Userroot ExecStart/opt/kube/bin/docker run \ --cap-add SYS_TIME \ --name chrony \ --network host \ --volume /etc/chrony.conf:/etc/chrony/chrony.conf \ --volume /var/lib/chrony:/var/lib/chrony \ easzlab/chrony:0.1.0 ExecStartPost/sbin/iptables -t raw -A PREROUTING -p udp -m udp --dport 123 -j NOTRACK ExecStartPost/sbin/iptables -t raw -A OUTPUT -p udp -m udp --sport 123 -j NOTRACK ExecStop/opt/kube/bin/docker rm -f chrony Restartalways RestartSec10 Delegateyes [Install] WantedBymulti-user.target与 haproxy 的 unit 文件相比chrony 有三个关键差异--cap-add SYS_TIMEchronyd 需要修改系统时钟而 Docker 默认丢弃SYS_TIME能力必须显式放行否则容器内无法完成时间设置--network hostNTP 使用 UDP 123 端口host 网络模式直接共享宿主机网络栈避免端口映射带来的性能损耗也便于allow网段按宿主机视角解析ExecStartPost的两条 iptables 规则在raw表分别对入向--dport 123与出向--sport 123的 NTP 流量设置NOTRACK跳过连接跟踪conntrack以降低高频率 NTP 小包对 conntrack 表的压力防止连接跟踪条目耗尽。这两条规则与 kubeasz 原生部署中 chronyd.service.j2 里的ExecStartPost完全一致属于项目沉淀下来的生产经验。容器内 chrony 的配置挂载路径为/etc/chrony/chrony.conf数据目录挂载/var/lib/chrony持久化drift文件。服务管理同样使用systemctl start|stop|restart chrony配合Restartalways保证异常退出后自动拉起。验证与故障排查容器化服务通用验证systemctl status haproxy # 检查 systemd 管理的服务状态 systemctl status chrony docker logs haproxy # 查看容器内进程日志 docker logs chrony时间同步结果验证沿用 chrony 指南 的方法服务启动后 chrony 服务器先与公网源同步客户端再与服务器同步整个集群达成同步通常需要数十分钟。用timedatectl检查初始阶段显示NTP synchronized: no同步完成后变为yes$ ansible -i clusters/${cluster_name}/hosts all -m shell -a timedatectl常见问题容器启动后时间无法校准确认 unit 中是否带--cap-add SYS_TIME客户端NTP synchronized长时间为no检查服务器端allow网段是否覆盖客户端以及宿主机防火墙是否放行 UDP 123日志中持续出现 conntrack 相关告警检查两条ExecStartPostiptables NOTRACK 规则是否生效iptables -t raw -L。与 kubeasz 原生部署方案的取舍值得说明的是kubeasz 仓库自身在集群安装时并未采用本文的容器化方式而是时间同步通过 chrony role 向kube_master、kube_node、etcd、ex_lb等全部节点分发二进制chronyd以原生 systemd 服务运行tasks/main.ymlapiserver 负载均衡使用基于 nginx 编译的精简四层负载均衡l4lbl4lb.conf.j2配合 keepalived 实现高可用部署与演练详见 ex-lb 部署文档。原生方案在启动速度、资源占用、内核特性利用如PrivateTmp、ProtectSystem等安全加固上更优而容器化方案胜在交付一致性与环境隔离。本文的 systemd unit 写法可直接移植到任意 systemd 发行版两者管理的服务语义等价——haproxy 容器对应l4lb的apiserversupstream 转发角色chrony 容器对应chronyd的服务端/客户端角色读者可根据部署环境如公有云、离线内网、混合发行版灵活选择。小结本文以 kubeasz 项目中的容器化实践为蓝本完整给出了 haproxy 与 chrony 两个系统服务的容器化方案haproxy 通过--publish端口映射 配置挂载为 kube-apiserver 提供四层负载均衡chrony 通过--cap-add SYS_TIME--network host iptables NOTRACK 规则实现集群时间同步。结合仓库中 chrony role、server.conf.j2、client.conf.j2、chronyd.service.j2 与 l4lb.conf.j2 等源码佐证读者既能照抄本文配置快速落地也能理解容器化与原生部署两种形态之间的等价映射关系从容应对不同集群环境的服务托管需求。【免费下载链接】kubeasz使用Ansible脚本安装K8S集群介绍组件交互原理方便直接不受国内网络环境影响项目地址: https://gitcode.com/GitHub_Trending/ku/kubeasz创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考