跳转至

SOP — 收敛部署工程的 SELinux 开关(disable_selinux: true → false)

变更主题:修改 k8s_136_cluster_deploy/config/deploy.yaml 的基线开关,使重跑工程不再关闭 SELinux 执行时间:2026-09-29 20:54(CST)|操作对象:工程配置文件(非运行中系统)

目录

  1. 背景 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. 目标

  1. k8s_136_cluster_deploy/config/deploy.yaml 中 baseline.disable_selinux 为 false;
  2. YAML 可被工程正常解析,除该字段外无任何其他改动;
  3. 明确边界:本次不改变集群当前运行状态,只约束该工程未来重跑时的行为。

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 同步,请勿在站点侧修改)