# proxyDone **Repository Path**: innocenceman/proxy-done ## Basic Information - **Project Name**: proxyDone - **Description**: 干死proxy配置 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-06-23 - **Last Updated**: 2026-07-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # proxy-done 批量为 Kubernetes 节点配置容器引擎(docker / containerd)HTTP 代理,并验证能否经代理访问华为云 SWR、LTS 等公网服务、成功拉取 SWR 镜像。 面向 **omni-env / buildkit 部署前** 的节点就绪检查:节点 CRI 能拉到部署镜像后,再执行 install。 ## 脚本 | 文件 | 作用 | | --- | --- | | `set_proxy.sh` | 单节点:配置 proxy / registry、连通性检查、镜像拉取验证 | | `run_proxy_all.sh` | 批量 SSH 执行 `set_proxy.sh`;节点列表来自 `nodes.txt` 或 kubeconfig | ## 运行模式 | 命令 | SSH 节点 | 改配置 | 典型用途 | | --- | --- | --- | --- | | `--list-only` | 否(只查 kubectl) | 否 | 核对节点数、解析 `KUBE_IP`、生成 `nodes.txt` | | `--probe` | 是 | 否 | **探测分类**:网络是否通、是否需 apply、是否已就绪 | | `--check` | 是 | 否 | **完整验收**:LTS + 华为云 API + SWR 拉镜 | | `--apply` | 是 | **是** | 写入 proxy/registry 并验收(会重启容器引擎) | | `--rollback` | 是 | 是(恢复) | 删除 proxy drop-in,从 `.bak` 恢复 runtime 配置 | | 无参数(dry-run) | 是 | 否 | 预览将写入的配置内容 | ### `--list-only` 和 `--probe` 的区别 - **`--list-only`**:在 kubectl 层只读,不登录节点。适合**第一次接集群**、确认 kubeconfig 和节点名单。 - **`--probe`**:SSH 到每台节点做代理/SWR 探测并**分类**。适合名单已可靠、想知道「每台该怎么处理」。 若已有正确的 `nodes.txt` 且 SSH/凭证已配好,**可跳过 `--list-only`,直接 `--probe`**。 ### `--check` 和 `--probe` 的区别 - **`--probe`**:轻量探测,输出 `ready` / `needs_apply` / `fix_network` 等 action,便于决定谁该 apply。 - **`--check`**:完整 gate,LTS、API、SWR 拉镜有一项失败即 FAIL,用于**部署前最终确认**。 未 `--apply` 的节点跑 `--check` 时,Step 6 会报 **`swr_pull_needs_apply`**(不会误报 401)。 ## 推荐流程 口诀:**probe → apply → check → install** ```bash ./run_proxy_all.sh --init vi proxy.conf # CREDS / PROXY_URL / SSH_PASS / KUBECONFIG # (可选)首次接集群:核对名单,不 SSH 节点 ./run_proxy_all.sh --list-only --list-output=nodes.txt # 1. 探测分类(不改配置) ./run_proxy_all.sh --probe nodes.txt # 2. 写入配置:先 canary(1~3 台),再 needs_apply 列表,最后全量 cp nodes-canary.txt.example nodes-canary.txt # 填入少量 IP ./run_proxy_all.sh --apply nodes-canary.txt ./run_proxy_all.sh --apply logs/YYYYMMDD_HHMMSS/needs_apply.txt # 3. 全集群验收 ./run_proxy_all.sh --check nodes.txt # 结论 ✅ 后再部署 omni-env / buildkit # 回滚 ./run_proxy_all.sh --rollback nodes.txt ``` ## 快速开始 ### 1. 生成并编辑配置 ```bash ./run_proxy_all.sh --init vi proxy.conf ``` 至少填写: ```bash CREDS='SWR用户名:SWR密码' # 如 cn-southwest-2@USER:TOKEN PROXY_URL='http://user:pass@host:8080/' SSH_PASS='节点SSH密码' # 密钥免密可留空 KUBECONFIG='/path/to/kubeconfig' ``` `proxy.conf` 含敏感信息,权限应为 `600`,**勿提交到仓库**。 节点列表:使用 kubeconfig 自动拉取,或手工维护 `nodes.txt`(每行一个 IP,`#` 开头为注释)。 ### 2. `--probe` 输出说明 ```bash ./run_proxy_all.sh --probe nodes.txt ``` | action | 含义 | 建议 | | --- | --- | --- | | `ready` | 已配代理且能拉测试镜 | 直接 `--check` 或部署 | | `needs_apply` | 代理链路通,CRI 未配置 | `--apply` | | `fix_network` | 节点→代理 TCP 不通 | 查路由/安全组/ACL | | `fix_proxy_https` | TCP 通,经代理访问 SWR HTTPS 失败 | 查 PROXY_URL / 代理转发 | | `fix_creds` | 已 apply 但拉镜失败 | 查 CREDS / registry auth | 日志目录 `logs/YYYYMMDD_HHMMSS/` 下还会生成: | 文件 | 含义 | | --- | --- | | `probe-summary.tsv` | 探测明细 | | `probe-prefix.tsv` | 按网段汇总(默认 `7.244.x`、`8.2.x` 等) | | `ready.txt` / `needs_apply.txt` / `fix_network.txt` 等 | 按 action 分类的 IP 列表 | | `summary.tsv` / `failed.txt` | check/apply 模式的汇总与失败列表 | 汇总输出会给出 **是否可部署 omni-env / buildkit** 及建议的下一步命令。 ## `--apply` 会改什么 只有 `--apply`(或单节点 `MODIFY_CONFIG=1`)会真正修改节点: - `/etc/systemd/system/{docker,containerd}.service.d/proxy.conf` — HTTP/HTTPS 代理 - `/etc/containerd/config.toml` — SWR TLS(`insecure_skip_verify`)+ **registry auth**(`CREDS` 明文落盘) - `/etc/docker/daemon.json` — docker 场景 执行前会尽量创建 `.bak` 备份;`--rollback` 可批量恢复。 ## 默认验收项(`--check` / `--apply`) | 步骤 | 项 | 说明 | | --- | --- | --- | | 0 | 代理 TCP + SWR `/v2/` | 节点→代理 TCP;经代理 curl SWR(`-k`,401 视为通) | | 4 | 引擎就绪 | containerd / docker active | | 5 | LTS | `https://lts.${REGION}.myhuaweicloud.com`(经代理) | | 5 | 华为云 API | 默认 `APIGW_CHECK_URL` = IAM 区域端点(经代理) | | 6 | SWR 拉镜 | 测试镜像 pull | 可在 `proxy.conf` 中将 `CHECK_LTS` / `CHECK_APIGW` 设为 `0` 跳过对应项(默认均为 `1`)。 **APIGW 说明**:默认探测 `https://iam.${REGION}.myhuaweicloud.com/`,验证经代理访问华为云 HTTPS API。部分企业代理对 `apigw.huawei.com` 返回 504,如需改回: ```bash APIGW_CHECK_URL='https://apigw.huawei.com/' ``` **`PROXY_URL` 编码**:`proxy.conf` 里密码 URL 编码写 `%2A` / `%21` 即可;写入 systemd 时脚本自动把 `%` 翻倍为 `%%`。 ## 常用配置 | 配置项 | 说明 | 默认 | | --- | --- | --- | | `REGION` | 华为云区域 | `cn-southwest-2` | | `ENGINE` | `auto` / `docker` / `containerd` | `auto` | | `PROXY_URL` | HTTP 代理,必填 | — | | `CREDS` | SWR 拉镜凭证 `用户名:密码` | — | | `KUBE_IP` | API Server IP;有 KUBECONFIG 可自动解析 | — | | `NO_PROXY_EXTRA` | 追加免代理 CIDR/域名(`.swr-pro.myhuaweicloud.com` 等已内置) | 空 | | `PARALLEL` | 并发 SSH 数(密码模式建议 ≤30) | `20` | | `BATCH_SIZE` / `BATCH_PAUSE` / `ABORT_FAIL_PCT` | 分批滚动与熔断 | `0` / `10` / `0` | | `CHECK_LTS` / `CHECK_APIGW` | 验收开关 | `1` / `1` | | `APIGW_CHECK_URL` | API 连通性探测 URL | IAM 区域端点 | | `CURL_CONNECT_TIMEOUT` / `CURL_MAX_TIME` | curl 经代理超时(秒) | `15` / `30` | | `PROBE_PREFIX_OCTETS` | probe 网段统计取 IP 前几段(2 → `7.244.x`) | `2` | ## 大规模分批 上千节点建议在 `proxy.conf` 开启: ```bash BATCH_SIZE='50' BATCH_PAUSE='30' ABORT_FAIL_PCT='20' # 仅 --apply 时,单批失败率超阈值则中止后续批次 ``` ## 失败重跑 ```bash ./run_proxy_all.sh --check logs/YYYYMMDD_HHMMSS/failed.txt ./run_proxy_all.sh --apply logs/YYYYMMDD_HHMMSS/failed.txt ./run_proxy_all.sh --apply logs/YYYYMMDD_HHMMSS/needs_apply.txt ./run_proxy_all.sh --rollback logs/YYYYMMDD_HHMMSS/failed.txt ``` ## 单节点 ```bash export PROXY_URL='http://user:pass@proxy:8080/' export KUBE_IP='10.0.0.1' export CREDS='user:pass' export ENGINE='containerd' ./set_proxy.sh # dry-run 预览 export MODIFY_CONFIG=1 && ./set_proxy.sh # 正式写入 ./set_proxy.sh --check # 仅验收 ./set_proxy.sh --probe # 仅探测 ./set_proxy.sh --rollback # 恢复 ``` ## 职责边界 | 本工具管 | 本工具不管 | | --- | --- | | 节点 CRI 经代理拉**公网 SWR** 部署镜像 | Pod 内运行时出网(pip/curl 等) | | containerd/docker systemd 代理 + NO_PROXY | omni-env 内置 proxy-gateway | | `*.swr-pro.myhuaweicloud.com` 在 NO_PROXY 中直连 | 沙箱创建时的 pod_spec / env 代理 | ## 常见问题 **PROXY_URL 未配置** — 在 `proxy.conf` 设置;密码特殊字符需 URL 编码(`*`→`%2A`,`!`→`%21`)。 **KUBE_IP 未配置** — 填 `KUBECONFIG` 自动解析,或手工 `KUBE_IP='x.x.x.x'`。 **代理未生效** — 节点上检查 `systemctl cat containerd` 是否加载 `proxy.conf`,进程环境是否有 `HTTPS_PROXY`。 **镜像拉取失败** — 查 CREDS、`REGION`、节点→代理网络;`--probe` 看 action 是 `fix_network` 还是 `fix_creds`。 **8.2 网段全失败、`fix_network`** — 多为节点到代理 IP 网络不通,需网络侧打通,脚本无法绕过。 ## 环境要求 **执行机**:bash、ssh、sshpass(密码模式)、kubectl(kubeconfig 模式) **目标节点**:docker 或 containerd、crictl(containerd 拉镜验证)、SSH 可登录、root 写 `/etc/systemd` 等