SOP — 收敛部署工程的 SELinux 开关(disable_selinux: true → false)¶
变更主题:修改
k8s_136_cluster_deploy/config/deploy.yaml的基线开关,使重跑工程不再关闭 SELinux 执行时间:2026-09-29 20:54(CST)|操作对象:工程配置文件(非运行中系统)
目录¶
- 背景 2. 目标 3. 前置条件 4. 影响范围 5. 分步操作 6. 验证 7. 回滚 8. 风险说明
附录 A:证据(源码位置)|附录 B:与 haproxy 后端保留的关联|附录 C:交付物清单
1. 背景¶
2026-09-29 宿主机重启后,K8s 控制面入口 VIP:16443 因 SELinux(Enforcing)拒绝 haproxy
绑定 16443 与连接后端 6443 而中断(修复见 k8s-restart-16443-selinux-20260929/SOP.md)。
顺查部署工程源码时发现一条与之冲突的既有设定:config/deploy.yaml 的基线开关
disable_selinux: true,对应 deployer.py 基线阶段的处置逻辑为:
if self.disable_selinux:
if "Enforcing" in current.stdout:
self._change(node, "setenforce 0", "[高亮][高危] 临时置 SELinux 为 permissive")
if "SELINUX=disabled" not in exist.stdout:
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
这既解释了历史现象,也构成未来风险:
- 历史:2026-09-16 部署时执行过
setenforce 0(运行时 permissive),haproxy 才得以绑定 16443 并持续运行——正是"重启前一直正常、重启后立即故障"的原因。 - 风险:若保持
true,今后每次重跑该工程都会setenforce 0并把/etc/selinux/config持久化为disabled,等于绕过问题而非解决;与本次"在 Enforcing 下补齐端口标签与布尔"的 修复方向相悖。
另需注意状态不一致:工程会把该文件写成 SELINUX=disabled,而当前节点实际为
SELINUX=enforcing(说明中途被人工改回)。本次变更即把配置与现状对齐。
2. 目标¶
k8s_136_cluster_deploy/config/deploy.yaml中baseline.disable_selinux为false;- YAML 可被工程正常解析,除该字段外无任何其他改动;
- 明确边界:本次不改变集群当前运行状态,只约束该工程未来重跑时的行为。
3. 前置条件¶
| 项 | 要求 |
|---|---|
| 对象 | k8s_136_cluster_deploy/config/deploy.yaml(本地工程文件) |
| 工具 | 工程 venv(.venv/bin/python,含 PyYAML)用于解析校验 |
| 备份 | 变更前必须先备份原文件到本主题 backup/(见附录 C) |
| 依赖 | 无。不触碰任何主机、不重启任何服务 |
4. 影响范围¶
- 对象:仅工程配置文件的 1 个布尔字段。
- 主机/服务:无。不需要停服,无窗口要求。
- 生效时机:下次(若)重跑
k8s_136_cluster_deploy部署工程时。 - 业务影响:无即时影响。变更后重跑工程时 SELinux 将保持
Enforcing, 依赖的策略前提由k8s-restart-16443-selinux-20260929/SOP.md中的端口标签与布尔提供。
5. 分步操作¶
步骤 1:备份原文件¶
cd <项目根>
TS=$(date +%Y%m%d-%H%M%S)
mkdir -p k8s-deploy-yaml-selinux-20260929/backup/config
cp -a k8s_136_cluster_deploy/config/deploy.yaml \
k8s-deploy-yaml-selinux-20260929/backup/config/deploy.yaml.bak.$TS
# 实测生成:deploy.yaml.bak.20260929-205409(3207 字节)
坑:该文件含 keepalived_auth_pass、haproxy_stats_password 等口令明文(工程部署时需读取),
备份仅存放于本主题 backup/,不得复制到其他交付文档或对外材料。
步骤 2:修改开关¶
把 baseline.disable_selinux 由 true 改为 false(同一 YAML 中 baseline: 段下第一项):
cd <项目根>
sed -i 's/^ disable_selinux: true$/ disable_selinux: false/' \
k8s_136_cluster_deploy/config/deploy.yaml
grep -n "disable_selinux" k8s_136_cluster_deploy/config/deploy.yaml
# 预期:27: disable_selinux: false
失败判断:grep 仍显示 true → 缩进或行内容与预期不符,停止并用步骤 7 回滚后核对原文。
步骤 3:解析校验与差异确认¶
坑:YAML 对缩进敏感,改动后必须实际解析一次,不能只看 diff。
cd <项目根>
k8s_136_cluster_deploy/.venv/bin/python -c "
import yaml
d = yaml.safe_load(open('k8s_136_cluster_deploy/config/deploy.yaml'))
print('disable_selinux =', d['baseline']['disable_selinux'])
print('masters =', [n['hostname'] for n in d['nodes'] if n['role']=='master'])
"
# 预期:disable_selinux = False;masters = ['k8s-master-01', 'k8s-master-02', 'k8s-master-03']
diff k8s-deploy-yaml-selinux-20260929/backup/config/deploy.yaml.bak.20260929-205409 \
k8s_136_cluster_deploy/config/deploy.yaml
# 预期:仅 1 处差异(27 行 true → false)
6. 验证¶
实测结果:
YAML 解析: OK
disable_selinux = False
masters = ['k8s-master-01', 'k8s-master-02', 'k8s-master-03']
nodes 总数 = 6
--- 与备份的差异 ---
27c27
< disable_selinux: true
---
> disable_selinux: false
判定:解析通过、目标字段为 False、差异仅 1 行 → 变更正确且无副作用。
未做的验证(有意为之):未实际重跑部署工程。重跑会改动运行中的集群(重装组件、 重写 haproxy/keepalived 配置、重启服务),不属于本次变更窗口;本变更只改工程定义,风险面明确。
7. 回滚¶
cd <项目根>
cp -a k8s-deploy-yaml-selinux-20260929/backup/config/deploy.yaml.bak.20260929-205409 \
k8s_136_cluster_deploy/config/deploy.yaml
grep -n "disable_selinux" k8s_136_cluster_deploy/config/deploy.yaml # 预期:恢复为 true
回滚后验证:disable_selinux 回到 true,且文件与备份 md5 一致:
md5sum k8s_136_cluster_deploy/config/deploy.yaml 应与备份文件一致。
备份存放位置:k8s-deploy-yaml-selinux-20260929/backup/config/deploy.yaml.bak.20260929-205409,
台账见同目录 backup/README.md。
8. 风险说明¶
| 风险 | 说明 | 缓解 |
|---|---|---|
| 若确有需要关闭 SELinux 的场景 | 该开关失效后,重跑工程不再自动关 SELinux;如确需关闭须手工处理 | 属"显式优于隐式":安全相关动作不应由部署工程默认执行 |
| 与运行现状的历史不一致未完全澄清 | 工程曾写入 SELINUX=disabled,当前实际为 enforcing,中间改动者未知 |
本次只对齐配置与现状;如后续发现其他被关停的安全组件,另行评估 |
| 工程重跑仍有其他覆盖行为 | 重跑会按 nodes 中全部 master 重写 haproxy 后端列表(见附录 B),与本次变更无关但同批发现 |
已在 k8s-followup-20260929/SOP.md 与集群 RUNBOOK 中标注 |
| 本次未经重跑验证 | 变更仅涉配置定义,未在真实重跑中验证效果 | 风险面是"未来重跑行为",验证成本高于收益;下次重跑时留意基线阶段日志中不再出现 setenforce 0 |
附录 A:证据(源码位置)¶
| 内容 | 位置 |
|---|---|
| 开关默认值与解析 | k8s_136_cluster_deploy/deployer.py:155(baseline.get("disable_selinux", True)) |
| SELinux 处置逻辑 | k8s_136_cluster_deploy/deployer.py:784-799(setenforce 0 + 写 SELINUX=disabled) |
| 配置文件字段 | k8s_136_cluster_deploy/config/deploy.yaml:27 |
| 备份纳入的路径 | k8s_136_cluster_deploy/deployer.py:54(etc/selinux/config 在备份清单内) |
附录 B:与 haproxy 后端保留的关联(同批发现)¶
同一次源码复查确认:deployer.py 的 _render_haproxy_cfg() 按 config 中全部 role=master 节点
渲染 haproxy 后端(本项目为 3 台),写入函数 _write() 的语义是「哈希一致跳过,不一致先备份再覆盖」。
因此重跑部署工程会把已关闭的 master-02/03 两条后端写回,k8s-followup-20260929/SOP.md
中的手工清理属临时性;缩容/扩回工具 control_plane_scale.py 不写该文件,不受影响。
用户决策(2026-09-29):保持手工清理现状,不做工程侧收敛,重跑后如需再执行一次清理即可。
附录 C:交付物清单¶
| 文件 | 内容 |
|---|---|
SOP.md |
本文件 |
backup/config/deploy.yaml.bak.20260929-205409 |
变更前的工程配置备份(含口令明文,仅本地留存) |
backup/README.md |
备份台账 |
来源:
/home/rain/Documents/k8s_ins/k8s-deploy-yaml-selinux-20260929/SOP.md| 最后更新:2026-09-29 20:54(由build/sync.py同步,请勿在站点侧修改)