跳转至

K8S集群Python环境pyenv统一纳管SOP

文档位置:k8s_pyenv统一纳管_20260904/SOP_运维操作手册.md 操作对象:6台K8s主机(master-01/02/03, node-01/02/03),均为CentOS7 执行日期:2026-09-04 执行人:root(通过跳板机 rian 192.168.0.11 免密登录)


1. 背景与目标

1.1 背景

部分主机 SSH 登录出现:

/root/.bashrc: line 16: pyenv: command not found

巡检发现6台K8s主机Python环境状态不一致:

主机 IP 当前状态 现象
k8s-master-01 192.168.0.2 pyenv正常(3.9.6) .bashrc pyenv配置重复4次
k8s-master-02 192.168.0.3 完全未安装 仅系统Python 2.7.5,无Python3
k8s-master-03 192.168.0.4 完全未安装 仅系统Python 2.7.5,无Python3
k8s-node-01 192.168.0.5 pyenv已装但配置错 PYENV_ROOT错指向/mnt/nfs + global=2.7.13 → 登录报错
k8s-node-02 192.168.0.6 pyenv已装但global错 global=2.7.13 → python3不可用
k8s-node-03 192.168.0.7 pyenv已装但global错 global=2.7.13 → python3不可用

1.2 目标

  • 6台主机 全部通过 pyenv 统一纳管 Python 版本
  • 每台都具备:Python 3.9.6(pyenv纳管)+ Python 2.7.x(优先 system 自带)
  • pyenv global = 3.9.6 system → 默认 python/python3 指向 3.9.6,python2 可回退
  • SSH 登录无 pyenv: command not found 报错
  • .bashrc pyenv 配置块 幂等统一,重复执行不重复追加

2. 前置条件

序号 检查项 标准 验证命令
1 rian → 6台主机免密SSH yes ssh root@<ip> hostname 无密码提示
2 操作系统 全部 CentOS 7.x cat /etc/os-release
3 root权限 脚本要求root执行 whoami == root
4 可达公网 / 香港跳板机 优先国内镜像,失败走代理 curl -I https://gitee.com 或 能连 129.226.138.204:22
5 磁盘空间 /root 分区 ≥ 2GB(编译Python占用大) df -h /root
6 备份 SOP执行前对 .bashrc + 已有~/.pyenv 做快照备份 见第4章回滚

2.1 香港跳板机信息(海外下载限速时启用)

  • 公网IP:129.226.138.204(VM-4-4-centos,public_bastion_host)
  • SSH账号:root / 同集群统一密码
  • 用法:在 rian 本机执行 ssh -D 1080 -N -f root@129.226.138.204,对远程主机传 SOCKS5_PROXY=192.168.0.11:1080

3. 分步操作

所有脚本在 rian 本机(192.168.0.11)运行,通过 SSH 分发到6台主机。

3.1 Step 1:归档目录与准备

cd /home/rian/Documents/trae_for_om/pyenv_ins/k8s_pyenv统一纳管_20260904
chmod +x python_env_optimized.sh batch_deploy_pyenv.sh

3.2 Step 2:批量备份(必须先执行)

每台主机备份:

# .bashrc 备份
ssh root@<ip> "cp -a ~/.bashrc ~/.bashrc.bak.pyenv.$(date +%Y%m%d)"
# 若存在旧~/.pyenv,备份一份以防万一
ssh root@<ip> "if [ -d ~/.pyenv ]; then tar -czf ~/.pyenv.bak.pyenv.$(date +%Y%m%d).tar.gz -C ~ .pyenv; fi"

(批量脚本 batch_deploy_pyenv.sh backup 已封装)

3.3 Step 3:按主机分组执行

依据巡检差异,将主机分为三类:

A组:全新安装(master-02 / master-03)

# 分发脚本 + 执行 -i 全量安装(含依赖、pyenv、两个Python版本、bashrc配置)
scp python_env_optimized.sh root@192.168.0.3:/tmp/
ssh root@192.168.0.3 "bash /tmp/python_env_optimized.sh -i 2>&1 | tee /tmp/pyenv_install.log"
# master-03 同上

⚠️ 安装耗时约 5~15 分钟/台,视网络与CPU速度。若国内镜像失败,追加环境变量重跑: bash ssh root@192.168.0.3 "SOCKS5_PROXY=192.168.0.11:1080 bash /tmp/python_env_optimized.sh -i 2>&1" (需确保rian本机已 ssh -D 1080 ... 建立香港隧道)

B组:已装但配置错误(node-01 / node-02 / node-03)

三者已装有2.7.13 + 3.9.6,但global错误且bashrc有脏配置。执行修复模式更快速安全。

scp python_env_optimized.sh root@192.168.0.5:/tmp/
ssh root@192.168.0.5 "bash /tmp/python_env_optimized.sh -f 2>&1 | tee /tmp/pyenv_fix.log"
# node-02 / node-03 同上

修复模式只动 .bashrc + pyenv global,不重新编译Python,秒级完成。

C组:正常但有重复配置(master-01)

scp python_env_optimized.sh root@192.168.0.2:/tmp/
ssh root@192.168.0.2 "bash /tmp/python_env_optimized.sh -f 2>&1 | tee /tmp/pyenv_fix.log"

3.4 Step 4:逐台验证(见第5章)

3.5 Step 5:验证后清理临时文件

for ip in 192.168.0.{2,3,4,5,6,7}; do
  ssh root@$ip "rm -f /tmp/python_env_optimized.sh /tmp/pyenv_*.log"
done

4. 回滚步骤

4.1 回滚触发条件

  • 安装过程中关键步骤失败且重试无效
  • 验证阶段 SSH 登录仍报错或系统关键服务因 Python 版本变更异常

4.2 完整回滚(按最坏情况)

每台主机依次执行:

# 1. 还原 .bashrc(备份文件命名:~/.bashrc.bak.pyenv.YYYYMMDD 或 .bashrc.bak.YYYYMMDD_HHMMSS)
ls -lt ~/.bashrc.bak* | head -3
cp -a ~/.bashrc.bak.pyenv.20260904 ~/.bashrc   # 选择最新有效备份

# 2. 还原旧~/.pyenv(若新装且想撤销)
if [ -f ~/.pyenv.bak.pyenv.20260904.tar.gz ]; then
  rm -rf ~/.pyenv
  tar -xzf ~/.pyenv.bak.pyenv.20260904.tar.gz -C ~
fi

# 3. 如果只是 pyenv global 选错需要回退:
export PYENV_ROOT=~/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
pyenv global system     # 切回系统Python

# 4. 断开当前shell,重新SSH登录确认无报错
exit

4.3 单步原子回滚示例(仅bashrc)

ssh root@<ip> "cp -a ~/.bashrc ~/.bashrc.before_rollback && \
               cp -a \$(ls -t ~/.bashrc.bak* | head -1) ~/.bashrc"

5. 验证标准

验证项 命令 通过标准
登录无报错 ssh root@<ip> "echo OK" stderr 不应出现 pyenv: command not found
python3 可用 ssh root@<ip> "source ~/.bashrc && python3 --version" Python 3.9.6
python 默认指向py3 ssh root@<ip> "source ~/.bashrc && python --version" Python 3.9.6
python2 可用 ssh root@<ip> "source ~/.bashrc && /usr/bin/python --version" Python 2.7.5(或 pyenv 的 2.7.13)
pyenv versions 对齐 ssh root@<ip> "source ~/.bashrc && pyenv versions" 包含 3.9.6 与 system,* 指向 3.9.6
.bashrc 幂等 重跑 -c 2次后检查行数 pyenv managed 块只出现 1 次
pip 可用 ssh root@<ip> "source ~/.bashrc && pip3 --version" 能正常输出,无报错

6. 风险说明与规避

风险点 影响 概率 规避/处置
CentOS7 openssl-devel 版本过低导致 Python3 编译失败 Python3 编译不通过 中 脚本自动识别并安装 openssl11-devel,并注入 CPPFLAGS/LDFLAGS 指向 openssl11 路径
GitHub/pyenv源码 或 Python源码 海外下载慢/断 安装超时失败 高 ① 国内 Gitee 镜像优先 ② NPMMirror Python 源优先 ③ 失败自动启用香港跳板机 SOCKS5 代理重试
新global覆盖老业务Python版本 老脚本突然用 py3 执行出错 中 巡检确认原系统 Python2 仍在 /usr/bin/python;pyenv global 为 3.9.6 system,老脚本显式调用 /usr/bin/python 不受影响;关键业务建议提前用 pyenv local system 锁定
.bashrc 重复追加导致 PATH 膨胀 登录提示慢/不美观 低 优化脚本用 MANAGED BLOCK 标记 + 旧语句grep剔除,幂等执行无重复
编译依赖安装触发系统yum依赖升级 影响其他包 低 仅 -y 安装python构建依赖,不做 yum update;如担心可加 --setopt=strict=0 或事先yum版本锁

7. 交付物清单(本目录下)

文件名 用途
SOP_运维操作手册.md 本文件
python_env_optimized.sh 优化后的单机 pyenv 安装/修复脚本(远程分发执行)
batch_deploy_pyenv.sh 批量部署入口:备份 → 分组执行 → 验证 → 报告
check_logs/*.log 巡检原始日志
deploy_logs/*.log 本次部署执行日志(备份+执行+验证)

来源:/home/rain/Documents/trae_for_om/pyenv_ins/k8s_pyenv统一纳管_20260904/SOP_运维操作手册.md | 最后更新:2026-09-04 22:05(由 build/sync.py 同步,请勿在站点侧修改)