Jelajahi Sumber

"username": "robot$alien_cloud"

dujian 2 minggu lalu
induk
melakukan
710500b5f6

+ 73 - 73
docs/jenkins/produ/README-ACK-GRAY-RELEASE.md

@@ -1,12 +1,12 @@
-# alien-ack-cluster 使用说明与灰度发
+# alien-ack-cluster 使用说明与灰度发��?
 
-集群:**alien-ack-cluster**(ACK 托管版,Kubernetes **v1.26.2**)。节点池 **default-nodepool** 当前 **3 节点**(截图中状态为 **Unknown** 时须先修复,否则 Pod 无法调度)
+集群��?*alien-ack-cluster**(ACK 托管版,Kubernetes **v1.26.2**)。节点池 **default-nodepool** 当前 **3 节点**(截图中状态为 **Unknown** 时须先修复,否则 Pod 无法调度)��?
 
-Harbor:**39.106.135.88**(与 Jenkins 构建机同区域/VPC 为佳,避免跨公网拉镜像超时)。
+Harbor��?*39.106.135.88**(与 Jenkins 构建机同区域/VPC 为佳,避免跨公网拉镜像超时)��?
 
 ---
 
-## 一、上线前检查清
+## 一、上线前检查清��?
 
 ### 1. 节点状态为 Ready
 
@@ -14,60 +14,60 @@ Harbor:**39.106.135.88**(与 Jenkins 构建机同区域/VPC 为佳,避免
 
 ```bash
 kubectl get nodes -o wide
-kubectl describe node <节点名>
+kubectl describe node <节点��?
 ```
 
-常见原因
+常见原因��?
 
 | 现象 | 处理 |
 |------|------|
-| NotReady + 超时 | 节点安全组未放行 **6443**、**10250**;节点与 API Server 网络不通 |
-| Kubelet 未启动 | SSH 到 ECS,`systemctl status kubelet` |
+| NotReady + 超时 | 节点安全组未放行 **6443**��?*10250**;节点与 API Server 网络不��?|
+| Kubelet 未启��?| SSH ��?ECS,`systemctl status kubelet` |
 | 磁盘/内存压力 | `df -h`、`free -h`,清理镜像或扩容 |
-| 容器运行时 | 节点为 **containerd 1.6.20**,勿混用 docker 与 containerd 配置 |
+| 容器运行��?| 节点��?**containerd 1.6.20**,勿混用 docker ��?containerd 配置 |
 
-修复后应显示 **Ready**,且 `kubectl get pods -n kube-system` 中 CoreDNS、kube-proxy 正常(控制台「集群巡检」曾提示 CoreDNS 异常时优先处理)。
+修复后应显示 **Ready**,且 `kubectl get pods -n kube-system` ��?CoreDNS、kube-proxy 正常(控制台「集群巡检」曾提示 CoreDNS 异常时优先处理)��?
 
 ### 2. 本地 kubectl 接入 ACK
 
-1. 控制台 → **alien-ack-cluster** → **连接信息** → 复制 **公网/内网 kubeconfig**(内网 Jenkins 用内网地址)。  
-2. 保存为文件,例如 `~/.kube/config-ack-alien` 
-3. Jenkins 凭据类型 **Secret file**,ID 如 `ack-kubeconfig-alien`。  
-4. 流水线中:`withCredentials([file(credentialsId: 'ack-kubeconfig-alien', variable: 'KUBECONFIG')]) { sh 'kubectl get ns' }`
+1. 控制��?��?**alien-ack-cluster** ��?**连接信息** ��?复制 **公网/内网 kubeconfig**(内��?Jenkins 用内网地址)��? 
+2. 保存为文件,例如 `~/.kube/config-ack-alien`��? 
+3. Jenkins 凭据类型 **Secret file**,ID ��?`ack-kubeconfig-alien`��? 
+4. 流水线中:`withCredentials([file(credentialsId: 'ack-kubeconfig-alien', variable: 'KUBECONFIG')]) { sh 'kubectl get ns' }`��?
 
-### 3. Harbor 与 ACK 拉镜像
+### 3. Harbor ��?ACK 拉镜��?
 
-1. Harbor 项目 `alien` 设为 **私有**,创建 **机器人账号**(push + pull)。  
-2. ACK 命名空间创建 **imagePullSecret**(见 `k8s/examples/secret-harbor.example.yaml`) 
-3. 各 Deployment `spec.template.spec.imagePullSecrets` 引用该 Secret。  
-4. 在 **每台节点** 或仅依赖 K8S Secret:推荐只用 `imagePullSecrets`,无需节点 docker login。  
-5. Jenkins 机构建用的基础镜像 `my-openjdk8-ffmpeg:v1` 推送到 Harbor,例如:  
-   `docker tag my-openjdk8-ffmpeg:v1 39.106.135.88/alien/base/openjdk8-ffmpeg:v1`  
-   `docker push 39.106.135.88/alien/base/openjdk8-ffmpeg:v1`
+1. Harbor 项目 `alien` 设为 **私有**,创��?**机器人账��?*(push + pull)��? 
+2. ACK 命名空间创建 **imagePullSecret**(见 `k8s/examples/secret-harbor.example.yaml`)��? 
+3. ��?Deployment `spec.template.spec.imagePullSecrets` 引用��?Secret��? 
+4. ��?**每台节点** 或仅依赖 K8S Secret:推荐只��?`imagePullSecrets`,无需节点 docker login��? 
+5. ��?Jenkins 机构建用的基础镜像 `my-openjdk8-ffmpeg:v1` 推送到 Harbor,例如:  
+   `docker tag my-openjdk8-ffmpeg:v1 39.106.135.88/alien_cloud/base/openjdk8-ffmpeg:v1`  
+   `docker push 39.106.135.88/alien_cloud/base/openjdk8-ffmpeg:v1`
 
 ---
 
-## 二、推K8S 资源模型
+## 二、推��?K8S 资源模型
 
 ```text
 Namespace: alien-produ
-├── Deployment/gateway          (stable, 副本N)
-├── Deployment/gateway-canary   (灰度, 副本数 1~2,仅 canary 策略时更新)
-├── Service/gateway             stable Pod
-├── Service/gateway-canary      canary Pod
-├── Ingress/alien-gateway       → 主路由 + Nginx 灰度注解
-└── ConfigMap/Secret              → bootstrap、Jasypt(勿把明文密码提交 Git)
+├── Deployment/gateway          (stable, 副本��?N)
+├── Deployment/gateway-canary   (灰度, 副本��?1~2,仅 canary 策略时更��?
+├── Service/gateway             ��?stable Pod
+├── Service/gateway-canary      ��?canary Pod
+├── Ingress/alien-gateway       ��?主路��?+ Nginx 灰度注解
+└── ConfigMap/Secret              ��?bootstrap、Jasypt(勿把明文密码提��?Git��?
 ```
 
-Java 微服务端口与现网 compose 一致(gateway **8000**,store **50014**,…),见各 `deployment-*.yaml`。
+Java 微服务端口与现网 compose 一致(gateway **8000**,store **50014**,…),见��?`deployment-*.yaml`��?
 
-**配置中心**:ACK 上 Nacos 若仍用 39.106.135.88 上的实例,须在 Pod 环境变量或 `bootstrap-prod.yml` 中写 **可达的 K8S Service 地址或 SLB**,不能写 Docker 容器名 `nacos`(除非 Nacos 也迁进同一集群)。
+**配置中心**:ACK ��?Nacos 若仍��?39.106.135.88 上的实例,须��?Pod 环境变量��?`bootstrap-prod.yml` 中写 **可达��?K8S Service 地址��?SLB**,不能写 Docker 容器��?`nacos`(除��?Nacos 也迁进同一集群)��?
 
 ---
 
-## 三、灰度发布(推荐:Nginx Ingress 金丝雀
+## 三、灰度发布(推荐:Nginx Ingress 金丝雀��?
 
-ACK 控制台 → **应用** → **Ingress** 需已安装 **Nginx Ingress Controller**(应用市场「Nginx Ingress Controller」或「ALB Ingress」;下文以 **Nginx Ingress 注解** 为例,与仓库示例一致)。
+ACK 控制��?��?**应用** ��?**Ingress** 需已安��?**Nginx Ingress Controller**(应用市场「Nginx Ingress Controller」或「ALB Ingress」;下文��?**Nginx Ingress 注解** 为例,与仓库示例一致)��?
 
 ### 原理
 
@@ -80,22 +80,22 @@ flowchart LR
   SvcCanary --> DepCanary[Deployment gateway-canary]
 ```
 
-- **stable**:当前线上版本,副本数较多 
-- **canary**:新版本,副本数少 
-- **Ingress** 通过注解 `canary` + `canary-weight` 按百分比分流 
+- **stable**:当前线上版本,副本数较多��? 
+- **canary**:新版本,副本数少��? 
+- **Ingress** 通过注解 `canary` + `canary-weight` 按百分比分流��? 
 
-### 操作步骤(与 Jenkins 参数联动
+### 操作步骤(与 Jenkins 参数联动��?
 
 1. **首次**:`kubectl apply -f k8s/examples/namespace.yaml`  
-2. **首次**:`kubectl apply -f k8s/examples/deployment-gateway.yaml`(及 stable Service 
+2. **首次**:`kubectl apply -f k8s/examples/deployment-gateway.yaml`(及 stable Service��? 
 3. **首次**:`kubectl apply -f k8s/examples/deployment-gateway-canary.yaml` + `service-gateway-canary.yaml`  
-4. **首次**:`kubectl apply -f k8s/examples/ingress-gateway-canary.example.yaml`(改 host、TLS 
-5. Jenkins 构建新镜像 `39.106.135.88/alien/gateway:build-42`  
-6. Job 选 **DEPLOY_STRATEGY=canary**,**CANARY_WEIGHT=10**:  
-   - 仅更`gateway-canary` Deployment 镜像  
-   - Ingress 注解 `canary-weight` 设为 `10`  
-7. 观察监控与错误率后,逐步提高 `20` → `50` → `100`  
-8. **全量**:将 **stable** Deployment 镜像改为新版本,**canary-weight 置 0** 或删除 canary Deployment,避免长期双轨  
+4. **首次**:`kubectl apply -f k8s/examples/ingress-gateway-canary.example.yaml`(改 host、TLS��? 
+5. Jenkins 构建新镜��?`39.106.135.88/alien_cloud/gateway:build-42`  
+6. Job ��?**DEPLOY_STRATEGY=canary**��?*CANARY_WEIGHT=10**��? 
+   - 仅更��?`gateway-canary` Deployment 镜像  
+   - ��?Ingress 注解 `canary-weight` 设为 `10`  
+7. 观察监控与错误率后,逐步提高 `20` ��?`50` ��?`100`  
+8. **全量**:将 **stable** Deployment 镜像改为新版本,**canary-weight ��?0** 或删��?canary Deployment,避免长期双��? 
 
 示例注解(完整见 `ingress-gateway-canary.example.yaml`):
 
@@ -106,59 +106,59 @@ metadata:
     nginx.ingress.kubernetes.io/canary-weight: "10"
 ```
 
-### 与 RollingUpdate 的区别
+### ��?RollingUpdate 的区��?
 
-| 方式 | K8S 内置 RollingUpdate | Ingress 灰度(本方案|
+| 方式 | K8S 内置 RollingUpdate | Ingress 灰度(本方案��?|
 |------|------------------------|-------------------------|
-| 流量 | 逐 Pod 替换,旧版 Pod 逐渐减少 | 新旧版本 **同时** 接流量,可调比例 |
-| 回滚 | `kubectl rollout undo` | 将 `canary-weight` 设为 `0` 或回滚 canary Deployment |
+| 流量 | ��?Pod 替换,旧��?Pod 逐渐减少 | 新旧版本 **同时** 接流量,可调比例 |
+| 回滚 | `kubectl rollout undo` | ��?`canary-weight` 设为 `0` 或回��?canary Deployment |
 | Jenkins | `DEPLOY_STRATEGY=rolling` | `DEPLOY_STRATEGY=canary` |
 
 ---
 
-## 四、三节点节点池容量建
+## 四、三节点节点池容量建��?
 
-当前约 **25 核 / 45Gi** 集群总量(控制台资源监控)。7 个 Java 服务若各 **2 副本** + 灰度 **1 副本**,峰值 Pod 数约 **7×3=21**,需控制每 Pod **request**(示例 manifest 中 `512Mi`/`250m`),避免 Pending。
+当前��?**25 ��?/ 45Gi** 集群总量(控制台资源监控)��? ��?Java 服务若各 **2 副本** + 灰度 **1 副本**,峰��?Pod 数约 **7×3=21**,需控制��?Pod **request**(示��?manifest ��?`512Mi`/`250m`),避免 Pending��?
 
-调度建议
+调度建议��?
 
-- 无状态服务:**podAntiAffinity** 尽量 spread 到 3 台(示例 deployment 已含软反亲和)  
-- **gateway** 可 2 副本 + HPA(需 metrics-server;控制台若提示 APIService `metrics.k8s.io` 不可用,先装 metrics-server 再开 HPA)  
-- **job**、定时任务类1 副本  
+- 无状态服务:**podAntiAffinity** 尽量 spread ��?3 台(示例 deployment 已含软反亲和��? 
+- **gateway** ��?2 副本 + HPA(需 metrics-server;控制台若提��?APIService `metrics.k8s.io` 不可用,先装 metrics-server 再开 HPA��? 
+- **job**、定时任务类��?1 副本  
 
 ---
 
-## 五、从 Docker Compose 迁到 ACK 的映
+## 五、从 Docker Compose 迁到 ACK 的映��?
 
-| Compose(39.105.153.68 produ) | ACK |
+| Compose��?9.105.153.68 produ��?| ACK |
 |------------------------------|-----|
 | `gateway-produ` 容器 | Deployment `gateway` |
-| 卷挂载 jar | 镜像内打包 jar(本流水线 Dockerfile) |
+| 卷挂��?jar | 镜像内打��?jar(本流水��?Dockerfile��?|
 | `common-network-produ` | ClusterIP Service + Ingress |
-| 环境变量 Jasypt | Secret `alien-jasypt` 或 ACK 配置项 |
-| 支付证书目录 | Secret volume `alien-pay-cert-store` |
+| 环境变量 Jasypt | Secret `alien-jasypt` ��?ACK 配置��?|
+| 支付证书目录 | Secret volume `alien-pay-cert-store` ��?|
 
-迁移动作顺序建议:**gateway → store → 其余**;每迁一个服务,Ingress 切一条 path 或子域名,保留 compose 回滚路径直至稳定。
+迁移动作顺序建议��?*gateway ��?store ��?其余**;每迁一个服务,Ingress 切一��?path 或子域名,保��?compose 回滚路径直至稳定��?
 
 ---
 
-## 六、阿里云 ACK 控制台常用入
+## 六、阿里云 ACK 控制台常用入��?
 
 | 目标 | 路径 |
 |------|------|
-| 工作负载 / Deployment | 集群 → 工作负载 → 无状态 |
-| 灰度 / Ingress | 集群 → 网络 → Ingress |
-| 镜像拉取失败事件 | 工作负载 → Pod → 事件 |
-| 日志 | 工作负载 → Pod → 日志;或接入 SLS |
-| 节点池扩容 | 节点管理 → default-nodepool → 扩容 |
+| 工作负载 / Deployment | 集群 ��?工作负载 ��?无状��?|
+| 灰度 / Ingress | 集群 ��?网络 ��?Ingress |
+| 镜像拉取失败事件 | 工作负载 ��?Pod ��?事件 |
+| 日志 | 工作负载 ��?Pod ��?日志;或接入 SLS |
+| 节点池扩��?| 节点管理 ��?default-nodepool ��?扩容 |
 
 ---
 
-## 七、与 Jenkins produ 流水线联
+## 七、与 Jenkins produ 流水线联��?
 
-1. 手工 `kubectl apply` 示例 manifest 一次 
-2. 跑通 `gateway-k8s` Job(rolling,权重 100% 等价全量)。  
-3. 再跑 `canary` + `CANARY_WEIGHT=5` 验证流量分裂 
-4. 其余 6 个服务复制 gateway 的 Ingress/Deployment 命名模式。  
+1. 手工 `kubectl apply` 示例 manifest 一次��? 
+2. 跑��?`gateway-k8s` Job(rolling,权��?100% 等价全量)��? 
+3. 再跑 `canary` + `CANARY_WEIGHT=5` 验证流量分裂��? 
+4. 其余 6 个服务复��?gateway ��?Ingress/Deployment 命名模式��? 
 
-问题排查:`kubectl describe pod -n alien-produ`、`kubectl logs -n alien-produ deploy/gateway-canary`
+问题排查:`kubectl describe pod -n alien-produ`、`kubectl logs -n alien-produ deploy/gateway-canary`��?

+ 64 - 63
docs/jenkins/produ/README.md

@@ -1,42 +1,42 @@
-# 预生产分支 → Harbor → ACK 生产 K8S �水线
+# 预生产分��Harbor �ACK 生产 K8S �水�
 
-Harbor 宿主机:**39.106.135.88**(与 Jenkins �机或� VPC)。ACK 集群:**alien-ack-cluster**(�北2 北京)。
+Harbor 宿主机:**39.106.135.88**(与 Jenkins �机或� VPC)。ACK 集群�*alien-ack-cluster**(�� 北京)�
 
-本目录支� **��务�版** 与 **整体/多选�版**(Harbor + ACK);与宿主机 `docker compose` 晋��水线(`Jenkinsfile-prod-promote-from-uat.groovy`)并行存在,互�替代,直到 ACK 全�切�。
+本目录支�**��务��* �**整体/多选��*(Harbor + ACK);与宿主机 `docker compose` 晋��水线(`Jenkinsfile-prod-promote-from-uat.groovy`)并行存在,互�替代,直�ACK 全�切��
 
 ---
 
-## 常è§�问题(Harbor / 目录结构 / å�‘版粒度ï¼
+## 常�问题(Harbor / 目录结构 / �版粒度�
 
-### Harbor ���在 Web 界�手工�作?
+### Harbor ���在 Web 界�手工�作�
 
-**日常�版�需�。** �水线在 `k8s-produ-lib.groovy` 里自动完�:
+**日常�版�需��* �水线在 `k8s-produ-lib.groovy` 里自动完�:
 
-1. `docker login 39.106.135.88`(凭� `harbor-robot-alien`)
-2. `docker build` → 打 tag `39.106.135.88/alien/<�务�>:<tag>`
-3. `docker push` 到 Harbor
-4. `kubectl set image` 让 ACK 拉�一 tag
+1. `docker login 39.106.135.88`(凭�`harbor-robot-alien`�
+2. `docker build` ��tag `39.106.135.88/alien_cloud/<�务�:<tag>`
+3. `docker push` �Harbor
+4. `kubectl set image` �ACK 拉�一 tag
 
-�维**仅需一次性**在 Harbor Web(或 API)完�:`alien` 项目�机器人账��(�选)镜��留策略。之�查镜�/删旧 tag/排障时��打开 Harbor UI,**�是�版必�步骤**。
+�维**仅需一次�*�Harbor Web(或 API)完�:`alien` 项目�机器人账��(�选)镜��留策略。之�查镜�/删旧 tag/排障时��打开 Harbor UI�*�是�版必�步骤**�
 
-### `_shared/k8s-produ-lib.groovy` 是什么?能�独部署�?
+### `_shared/k8s-produ-lib.groovy` 是什么?能�独部署��
 
-| 文件 | 角色 | Jenkins Script Path 是�指�它 |
+| 文件 | 角色 | Jenkins Script Path 是�指��|
 |------|------|-------------------------------|
-| `produ/<�务>/Jenkinsfile` | **入�**(Jenkins �认这个�字) | **是**,�个 Job 指��自路径 |
-| `_shared/k8s-produ-lib.groovy` | **共享函数库**(checkout�mvn�Harbor�kubectl) | **�**,由入� `load '.../k8s-produ-lib.groovy'` 引用 |
-| `_shared/service-registry.groovy` | 七个�务列表 + whole/multi 筛选 | �,供 `whole/Jenkinsfile` 使用 |
+| `produ/<�务>/Jenkinsfile` | **入�**(Jenkins �认这个�字�| **�*,��Job 指��自路径 |
+| `_shared/k8s-produ-lib.groovy` | **共享函数�*(checkout�mvn�Harbor�kubectl�| **�*,由入� `load '.../k8s-produ-lib.groovy'` 引用 |
+| `_shared/service-registry.groovy` | 七个�务列表 + whole/multi 筛�| �,�`whole/Jenkinsfile` 使用 |
 
-�个微�务 Job �是 **�独一��水线**(例如�构建 gateway);共享库是为�� 7 份��脚本,**�代替** `Jenkinsfile`。
+�个微��Job �是 **�独一��水线**(例如�构建 gateway);共享库是为��7 份��脚本,**�代�* `Jenkinsfile`�
 
 ### 既��独�布,��整体�布?
 
-| Jenkins Job(建议å��ï¼| Script Path | 粒度 |
+| Jenkins Job(建议��| Script Path | 粒度 |
 |----------------------|-------------|------|
-| `gateway-k8s` … `dining-k8s` | `docs/jenkins/produ/<prodDir>/Jenkinsfile` | **仅该æœ�务**(Maven `-pl alien-xxx`ï¼|
-| `alien-cloud-k8s-whole` | `docs/jenkins/produ/whole/Jenkinsfile` | **whole / single / multi**(�数 `DEPLOY_MODE`,语义� prod-promote) |
+| `gateway-k8s` �`dining-k8s` | `docs/jenkins/produ/<prodDir>/Jenkinsfile` | **仅该�务**(Maven `-pl alien-xxx`�|
+| `alien-cloud-k8s-whole` | `docs/jenkins/produ/whole/Jenkinsfile` | **whole / single / multi**(��`DEPLOY_MODE`,语义� prod-promote�|
 
-整体 Job 一次 `mvn package` 打全仓库,å†�按选中æœ�务ä¾�次 build/push/deployï¼›å�•æœ�务 Job å�ªæ‰“对应模å�—,适å�ˆçƒ­ä¿®å¤�å�•个æœ�务ã€
+整体 Job 一�`mvn package` 打全仓库,�按选中�务�次 build/push/deploy;��务 Job �打对应模�,适�热修��个�务�
 
 ---
 
@@ -44,20 +44,20 @@ Harbor 宿主机:**39.106.135.88**(与 Jenkins �机或� VPC)。ACK 集
 
 ### 1. 是�选「文件夹�?
 
-**是,推�选「文件夹�。**
+**是,推�选「文件夹��*
 
-| 类型 | 用é€|
+| 类型 | 用�|
 |------|------|
-| **文件夹** | 独立命å��空间,其下å�¯å»ºå¤šä¸ª **æµ�水线** 任务,例如 `gateway-k8s`ã€�`store-k8s`,å��ç§°å�¯ä¸Žå…¶ä»–视图é‡�å¤|
-| **�水线** | 真正执行构建的 Job,�个微�务一� |
-| **多分支æµ�水线** | æŒGit 分支自动建å­� Job;若预生产固定一æ�¡åˆ†æ”¯ï¼ˆå¦`uat-20260202`),用普通æµ�水线 + å�‚æ•° `GIT_BRANCH` 更简å�|
+| **文件�* | 独立命�空间,其下�建多�**�水�* 任务,例�`gateway-k8s`�`store-k8s`,�称�与其他视图��|
+| **�水�* | 真正执行构建�Job,�个微�务一�|
+| **多分支�水线** | �Git 分支自动建� Job;若预生产固定一�分支(�`uat-20260202`),用普通�水线 + �数 `GIT_BRANCH` 更简�|
 
-建议结构:
+建议结构�
 
 ```text
-alien-cloud-produ-K8S-from-uat/     â†æ–‡ä»¶å¤¹ï¼ˆä½ æˆªå›¾ä¸­çš„å��称)
-├── alien-cloud-k8s-whole/          � �水线,Script Path: docs/jenkins/produ/whole/Jenkinsfile(整体/多选)
-├── gateway-k8s/                    â†æµ�水线,Script Path: docs/jenkins/produ/gateway/Jenkinsfile
+alien-cloud-produ-K8S-from-uat/     �文件夹(你截图中的�称)
+├── alien-cloud-k8s-whole/          ��水线,Script Path: docs/jenkins/produ/whole/Jenkinsfile(整�多选)
+├── gateway-k8s/                    ��水线,Script Path: docs/jenkins/produ/gateway/Jenkinsfile
 ├── store-k8s/
 ├── second-k8s/
 ├── store-platform-k8s/
@@ -66,36 +66,36 @@ alien-cloud-produ-K8S-from-uat/     � 文件夹(你截图中的�称)
 └── dining-k8s/
 ```
 
-**��**在文件夹里�选「文件夹�类型去套微�务——微�务一级用 **�水线** ��。
+**��**在文件夹里�选「文件夹�类型去套微�务——微�务一级用 **�水�* ���
 
-### 2. 是�用 Pipeline script from SCM?
+### 2. 是��Pipeline script from SCM�
 
-**�以,且推�。**
+**�以,且推��*
 
-�个 `*-k8s` �水线 Job �置:
+�个 `*-k8s` �水�Job �置�
 
-1. **�水线** → **定义**:Pipeline script from SCM  
-2. **SCM**:Git,仓åº`http://8.152.195.41:3000/alien/alien_cloud`(与现网一致)  
-3. **分支**:`*/uat-20260202` æˆ`*/你的预生产分支`  
+1. **�水�* �**定义**:Pipeline script from SCM  
+2. **SCM**:Git,仓�`http://8.152.195.41:3000/alien/alien_cloud`(与现网一致)  
+3. **分支**:`*/uat-20260202` �`*/你的预生产分支`  
 4. **Script Path**(按�务��):
    - gateway:`docs/jenkins/produ/gateway/Jenkinsfile`
    - store:`docs/jenkins/produ/store/Jenkinsfile`
-   - … �下表  
+   - ��下� 
 
 5. **凭�**:`zhanghaomimapingzheng`(与 UAT �水线一致)  
-6. **构建触�**:�选手动;稳定�加「上游 UAT 构建�功�触�  
+6. **构建触�**:�选手动;稳定�加「上�UAT 构建�功�触� 
 
-与 `Jenkinsfile-prod-promote-from-uat.groovy` 的关系:
+�`Jenkinsfile-prod-promote-from-uat.groovy` 的关系:
 
-| 维度 | prod-promote-from-uat | produ K8S �水线 |
+| 维度 | prod-promote-from-uat | produ K8S �水�|
 |------|----------------------|------------------|
-| 制� | UAT 目录 jar → 生产机 compose | Maven jar → 镜� → Harbor → ACK |
-| �版粒度 | � Job 内 whole/single/multi | **whole Job** + **��务一个 Job** |
-| �度 | 无 | 支� Ingress ���度(� README-ACK-GRAY-RELEASE.md) |
+| 制� | UAT 目录 jar �生产�compose | Maven jar �镜� �Harbor �ACK |
+| �版粒度 | �Job �whole/single/multi | **whole Job** + **��务一�Job** |
+| �度 | �| 支� Ingress ���度(� README-ACK-GRAY-RELEASE.md�|
 
 ---
 
-## 二�微�务与 Script Path 对照
+## 二�微�务�Script Path 对照
 
 | prodDir | 模� | Jenkins Script Path | ACK Deployment(默认) |
 |---------|------|---------------------|-------------------------|
@@ -106,52 +106,53 @@ alien-cloud-produ-K8S-from-uat/     � 文件夹(你截图中的�称)
 | lawyer | alien-lawyer | `docs/jenkins/produ/lawyer/Jenkinsfile` | `lawyer` |
 | job | alien-job | `docs/jenkins/produ/job/Jenkinsfile` | `job` |
 | dining | alien-dining | `docs/jenkins/produ/dining/Jenkinsfile` | `dining` |
-| **(整体)** | 全部七个 | `docs/jenkins/produ/whole/Jenkinsfile` | æŒ`DEPLOY_MODE` |
+| **(整体)** | 全部七个 | `docs/jenkins/produ/whole/Jenkinsfile` | �`DEPLOY_MODE` |
 
 **未纳入本目录**(属其他仓库或镜����,需�建 Job):
 
-- Python:`py_gateway_produ`ã€�`py_contract_produ`ã€�`py_esign_produ`(镜åƒ`alien_gateway:local` 等)  
+- Python:`py_gateway_produ`�`py_contract_produ`�`py_esign_produ`(镜�`alien_gateway:local` 等)  
 - `xxl-job-admin-produ`�Harbor 自身组件  
 
 ---
 
 ## 三�Jenkins 侧必�项(首次)
 
-在 Jenkins **全局**或文件夹 **凭�** 中准备:
+�Jenkins **全局**或文件夹 **凭�** 中准备:
 
-| 凭æ�® ID(示例,按实际改 Jenkinsfile 内常é‡�) | 类型 | 用é€|
+| 凭� ID(示例,按实际改 Jenkinsfile 内常�) | 类型 | 用�|
 |---------------------------------------------|------|------|
 | `zhanghaomimapingzheng` | Username/password | Git 拉� |
 | `harbor-robot-alien` | Username/password | `docker login 39.106.135.88` |
-| `ack-kubeconfig-alien` | Secret file | `KUBECONFIG`,内容�自 ACK「连接信��下载 |
+| `ack-kubeconfig-alien` | Secret file | `KUBECONFIG`,内容��ACK「连接信��下�|
 
-Jenkins 节点需具备:
+Jenkins 节点需具备�
 
 - `mvn`�`docker`(能访问 Harbor 443/80)�`kubectl`  
-- 若 Jenkins 在容器内:挂载 `docker.sock`,并将 `kubectl` 与 kubeconfig 挂入或装在镜�内  
+- �Jenkins 在容器内:挂�`docker.sock`,并�`kubectl` �kubeconfig 挂入或装在镜�内  
 
-Harbor 上建议建项目 **`alien`**,镜��:`39.106.135.88/alien/<prodDir>:<tag>`。
+Harbor 上建议建项目 **`alien_cloud`**,镜��:`39.106.135.88/alien_cloud/<prodDir>:<tag>`� 
+**新建项目与机器人账�步骤**�**[README-HARBOR-SETUP.md](./README-HARBOR-SETUP.md)**�
 
-基础镜åƒ� `my-openjdk8-ffmpeg:v1` 需 **å…ˆ push 到 Harbor**(如 `39.106.135.88/alien/base/openjdk8-ffmpeg:v1`),并在 Job å�‚æ•° `BASE_IMAGE` 中填写,å�¦åˆ™ ACK 节点拉ä¸�到ã€
+基础镜� `my-openjdk8-ffmpeg:v1` 需 **�push �Harbor**(如 `39.106.135.88/alien_cloud/base/openjdk8-ffmpeg:v1`),并在 Job �数 `BASE_IMAGE` 中填写,�则 ACK 节点拉�到�
 
 ---
 
-## 四�ACK 与�度
+## 四�ACK 与��
 
-详述��目录 **[README-ACK-GRAY-RELEASE.md](./README-ACK-GRAY-RELEASE.md)**(集群接入�命�空间�Ingress �度�节点 Unknown 排查)。
+详述��目录 **[README-ACK-GRAY-RELEASE.md](./README-ACK-GRAY-RELEASE.md)**(集群接入�命�空间�Ingress �度�节�Unknown 排查)�
 
-K8S 清å�•示例:`k8s/examples/`ã€
+K8S 清�示例:`k8s/examples/`�
 
 ---
 
 ## 五��水线�数速览
 
-��务 Jenkinsfile 共用库 `docs/jenkins/produ/_shared/k8s-produ-lib.groovy`,主��数:
+���Jenkinsfile 共用�`docs/jenkins/produ/_shared/k8s-produ-lib.groovy`,主��数:
 
 - `GIT_BRANCH`:预生产分支  
-- `IMAGE_TAG`:默认 `build-${BUILD_NUMBER}`,�填 `uat-20260202-123`  
-- `DEPLOY_STRATEGY`:`rolling`(直接替�)或 `canary`(Ingress ��)  
-- `CANARY_WEIGHT`:ç�°åº¦æµ�é‡�百分比(仅 canaryï¼ 
-- `K8S_NAMESPACE`:默认 `alien-produ`  
+- `IMAGE_TAG`:默�`build-${BUILD_NUMBER}`,��`uat-20260202-123`  
+- `DEPLOY_STRATEGY`:`rolling`(直接替�)�`canary`(Ingress ��� 
+- `CANARY_WEIGHT`:�度��百分比(仅 canary� 
+- `K8S_NAMESPACE`:默�`alien-produ`  
 
-首次部署å‰�在 ACK 应用 `k8s/examples/namespace.yaml` 与å�„æœ�务 `deployment-*.yaml`(或让æµ�水线 `kubectl apply` 首次全é‡� apply)ã€
+首次部署�在 ACK 应用 `k8s/examples/namespace.yaml` 与��务 `deployment-*.yaml`(或让�水线 `kubectl apply` 首次全� apply)�

+ 5 - 5
docs/jenkins/produ/_shared/k8s-produ-lib.groovy

@@ -1,10 +1,10 @@
 /**
- * ACK + Harbor å�‘版共享函数库(ä¸�是 Jenkins å…¥å�£æ–‡ä»¶ï¼‰ã€
+ * ACK + Harbor �版共享函数库(�是 Jenkins 入�文件)�
  *
- * - ��务:produ/<prodDir>/Jenkinsfile 在顶层 pipeline 内 load 本文件�调用� stage 函数。
- * - 整体/多选:produ/whole/Jenkinsfile load 本文件 + service-registry.groovy。
+ * - ��务:produ/<prodDir>/Jenkinsfile 在顶�pipeline �load 本文件�调用�stage 函数�
+ * - 整体/多选:produ/whole/Jenkinsfile load 本文�+ service-registry.groovy�
  *
- * Harbor:æµ�水线å†docker login / build / push,日常å�‘版无需打开 Harbor Webã€
+ * Harbor:�水线�docker login / build / push,日常�版无需打开 Harbor Web�
  */
 
 def checkoutBranch(def script, String branch, String gitUrl, String credentialsId) {
@@ -28,7 +28,7 @@ def mavenPackageModule(def script, String module) {
     """
 }
 
-/** 整体�版:根 POM 一次打包全部模�(比 7 次�模� mvn 更快) */
+/** 整体�版:根 POM 一次打包全部模�(�7 次�模� mvn 更快�*/
 def mavenPackageAll(def script) {
     script.sh """
         set -e

+ 4 - 4
docs/jenkins/produ/_shared/service-registry.groovy

@@ -1,6 +1,6 @@
 /**
- * 七个 Java 微�务注册表。��务 Jenkinsfile 与 whole/Jenkinsfile 共用。
- * 新增�务时:在此列表增加一项,并�制 produ/<prodDir>/Jenkinsfile。
+ * 七个 Java 微�务注册表。��务 Jenkinsfile �whole/Jenkinsfile 共用�
+ * 新增�务时:在此列表增加一项,并��produ/<prodDir>/Jenkinsfile�
  */
 
 def getServiceRegistry() {
@@ -27,7 +27,7 @@ def filterServices(List registry, Map params) {
     if (mode == 'single') {
         def one = registry.find { it.prodDir == params.SINGLE_SERVICE }
         if (one == null) {
-            throw new IllegalArgumentException("未找到 SINGLE_SERVICE=${params.SINGLE_SERVICE}")
+            throw new IllegalArgumentException("未找�SINGLE_SERVICE=${params.SINGLE_SERVICE}")
         }
         return [one]
     }
@@ -41,7 +41,7 @@ def filterServices(List registry, Map params) {
             }
         }
         if (selected.isEmpty()) {
-            throw new IllegalArgumentException('multi 模�:请至少勾选一项 MULTI_*')
+            throw new IllegalArgumentException('multi 模�:请至少勾选一�MULTI_*')
         }
         return selected
     }

+ 2 - 2
docs/jenkins/produ/dining/Jenkinsfile

@@ -22,8 +22,8 @@ pipeline {
         choice(name: 'DEPLOY_STRATEGY', choices: ['rolling', 'canary'])
         string(name: 'CANARY_WEIGHT', defaultValue: '10', trim: true)
         string(name: 'HARBOR_REGISTRY', defaultValue: '39.106.135.88', trim: true)
-        string(name: 'HARBOR_PROJECT', defaultValue: 'alien', trim: true)
-        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien/base/openjdk8-ffmpeg:v1', trim: true)
+        string(name: 'HARBOR_PROJECT', defaultValue: 'alien_cloud', trim: true)
+        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien_cloud/base/openjdk8-ffmpeg:v1', trim: true)
         string(name: 'K8S_NAMESPACE', defaultValue: 'alien-produ', trim: true)
         booleanParam(name: 'SKIP_MAVEN', defaultValue: false)
         booleanParam(name: 'DRY_RUN', defaultValue: false)

+ 4 - 4
docs/jenkins/produ/docker/Dockerfile.java-service

@@ -1,7 +1,7 @@
-# �模� Java 微�务镜�(Jenkins 构建上下文 = alien-<module>/ 目录)
+# �模�Java 微�务镜�(Jenkins 构建上下�= alien-<module>/ 目录�
 # build-arg: BASE_IMAGE, JAR_FILE, SERVER_PORT, WITH_LIB=true|false
 
-ARG BASE_IMAGE=39.106.135.88/alien/base/openjdk8-ffmpeg:v1
+ARG BASE_IMAGE=39.106.135.88/alien_cloud/base/openjdk8-ffmpeg:v1
 FROM ${BASE_IMAGE}
 
 ARG JAR_FILE=alien-gateway-1.0.0.jar
@@ -11,13 +11,13 @@ ARG WITH_LIB=false
 WORKDIR /app
 
 COPY ${JAR_FILE} /app/app.jar
-# 瘦 jar 时 target/lib 存在;WITH_LIB=false 时 COPY 空目录�能失败,构建脚本��目录存在
+# �jar �target/lib 存在;WITH_LIB=false �COPY 空目录�能失败,构建脚本��目录存在
 COPY lib /app/lib
 
 ENV SERVER_PORT=${SERVER_PORT}
 EXPOSE ${SERVER_PORT}
 
-# 与 docker-compose-prod 一致:prod profile;有 lib 时加 loader.path
+# �docker-compose-prod 一致:prod profile;有 lib 时加 loader.path
 RUN if [ "${WITH_LIB}" = "true" ]; then \
       echo 'exec java -Dspring.profiles.active=prod -Dfile.encoding=UTF-8 -Xms800m -Xmx800m -Dloader.path=/app/lib -jar /app/app.jar --server.port='"${SERVER_PORT}" > /app/entrypoint.sh; \
     else \

+ 2 - 2
docs/jenkins/produ/gateway/Jenkinsfile

@@ -22,8 +22,8 @@ pipeline {
         choice(name: 'DEPLOY_STRATEGY', choices: ['rolling', 'canary'])
         string(name: 'CANARY_WEIGHT', defaultValue: '10', trim: true)
         string(name: 'HARBOR_REGISTRY', defaultValue: '39.106.135.88', trim: true)
-        string(name: 'HARBOR_PROJECT', defaultValue: 'alien', trim: true)
-        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien/base/openjdk8-ffmpeg:v1', trim: true)
+        string(name: 'HARBOR_PROJECT', defaultValue: 'alien_cloud', trim: true)
+        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien_cloud/base/openjdk8-ffmpeg:v1', trim: true)
         string(name: 'K8S_NAMESPACE', defaultValue: 'alien-produ', trim: true)
         booleanParam(name: 'SKIP_MAVEN', defaultValue: false)
         booleanParam(name: 'DRY_RUN', defaultValue: false)

+ 2 - 2
docs/jenkins/produ/job/Jenkinsfile

@@ -22,8 +22,8 @@ pipeline {
         choice(name: 'DEPLOY_STRATEGY', choices: ['rolling', 'canary'])
         string(name: 'CANARY_WEIGHT', defaultValue: '10', trim: true)
         string(name: 'HARBOR_REGISTRY', defaultValue: '39.106.135.88', trim: true)
-        string(name: 'HARBOR_PROJECT', defaultValue: 'alien', trim: true)
-        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien/base/openjdk8-ffmpeg:v1', trim: true)
+        string(name: 'HARBOR_PROJECT', defaultValue: 'alien_cloud', trim: true)
+        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien_cloud/base/openjdk8-ffmpeg:v1', trim: true)
         string(name: 'K8S_NAMESPACE', defaultValue: 'alien-produ', trim: true)
         booleanParam(name: 'SKIP_MAVEN', defaultValue: false)
         booleanParam(name: 'DRY_RUN', defaultValue: false)

+ 1 - 1
docs/jenkins/produ/k8s/examples/deployment-gateway-canary.yaml

@@ -22,7 +22,7 @@ spec:
         - name: harbor-registry
       containers:
         - name: app
-          image: 39.106.135.88/alien/gateway:build-1
+          image: 39.106.135.88/alien_cloud/gateway:build-1
           imagePullPolicy: Always
           ports:
             - containerPort: 8000

+ 1 - 1
docs/jenkins/produ/k8s/examples/deployment-gateway.yaml

@@ -31,7 +31,7 @@ spec:
                 topologyKey: kubernetes.io/hostname
       containers:
         - name: app
-          image: 39.106.135.88/alien/gateway:build-1
+          image: 39.106.135.88/alien_cloud/gateway:build-1
           imagePullPolicy: Always
           ports:
             - containerPort: 8000

+ 3 - 3
docs/jenkins/produ/k8s/examples/ingress-gateway-canary.example.yaml

@@ -1,5 +1,5 @@
-# 主 Ingress:backend 指� stable Service gateway
-# ç�°åº¦ï¼šå�¦å»º Ingress 或使用å�Œ host 下 canary 注解指å�‘ gateway-canary(二选一,此处为「独ç«canary Ingressã€�示例)
+# �Ingress:backend 指� stable Service gateway
+# �度:��Ingress 或使用� host �canary 注解指� gateway-canary(二选一,此处为「独�canary Ingress�示例)
 ---
 apiVersion: networking.k8s.io/v1
 kind: Ingress
@@ -30,7 +30,7 @@ metadata:
     kubernetes.io/ingress.class: nginx
     nginx.ingress.kubernetes.io/canary: "true"
     nginx.ingress.kubernetes.io/canary-weight: "0"
-    # 与主 Ingress 相� host,Nginx 按��分�到本 Ingress 的 backend
+    # 与主 Ingress 相� host,Nginx 按��分�到�Ingress �backend
 spec:
   rules:
     - host: api-produ.example.com

+ 1 - 1
docs/jenkins/produ/k8s/examples/secret-harbor.example.yaml

@@ -1,4 +1,4 @@
-# �制为 secret-harbor.yaml,填入 Harbor 机器人账�� apply(勿�交明文到 Git)
+# �制�secret-harbor.yaml,填�Harbor 机器人账�� apply(勿�交明文�Git�
 apiVersion: v1
 kind: Secret
 metadata:

+ 2 - 2
docs/jenkins/produ/lawyer/Jenkinsfile

@@ -22,8 +22,8 @@ pipeline {
         choice(name: 'DEPLOY_STRATEGY', choices: ['rolling', 'canary'])
         string(name: 'CANARY_WEIGHT', defaultValue: '10', trim: true)
         string(name: 'HARBOR_REGISTRY', defaultValue: '39.106.135.88', trim: true)
-        string(name: 'HARBOR_PROJECT', defaultValue: 'alien', trim: true)
-        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien/base/openjdk8-ffmpeg:v1', trim: true)
+        string(name: 'HARBOR_PROJECT', defaultValue: 'alien_cloud', trim: true)
+        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien_cloud/base/openjdk8-ffmpeg:v1', trim: true)
         string(name: 'K8S_NAMESPACE', defaultValue: 'alien-produ', trim: true)
         booleanParam(name: 'SKIP_MAVEN', defaultValue: false)
         booleanParam(name: 'DRY_RUN', defaultValue: false)

+ 2 - 2
docs/jenkins/produ/second/Jenkinsfile

@@ -22,8 +22,8 @@ pipeline {
         choice(name: 'DEPLOY_STRATEGY', choices: ['rolling', 'canary'])
         string(name: 'CANARY_WEIGHT', defaultValue: '10', trim: true)
         string(name: 'HARBOR_REGISTRY', defaultValue: '39.106.135.88', trim: true)
-        string(name: 'HARBOR_PROJECT', defaultValue: 'alien', trim: true)
-        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien/base/openjdk8-ffmpeg:v1', trim: true)
+        string(name: 'HARBOR_PROJECT', defaultValue: 'alien_cloud', trim: true)
+        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien_cloud/base/openjdk8-ffmpeg:v1', trim: true)
         string(name: 'K8S_NAMESPACE', defaultValue: 'alien-produ', trim: true)
         booleanParam(name: 'SKIP_MAVEN', defaultValue: false)
         booleanParam(name: 'DRY_RUN', defaultValue: false)

+ 2 - 2
docs/jenkins/produ/store-platform/Jenkinsfile

@@ -22,8 +22,8 @@ pipeline {
         choice(name: 'DEPLOY_STRATEGY', choices: ['rolling', 'canary'])
         string(name: 'CANARY_WEIGHT', defaultValue: '10', trim: true)
         string(name: 'HARBOR_REGISTRY', defaultValue: '39.106.135.88', trim: true)
-        string(name: 'HARBOR_PROJECT', defaultValue: 'alien', trim: true)
-        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien/base/openjdk8-ffmpeg:v1', trim: true)
+        string(name: 'HARBOR_PROJECT', defaultValue: 'alien_cloud', trim: true)
+        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien_cloud/base/openjdk8-ffmpeg:v1', trim: true)
         string(name: 'K8S_NAMESPACE', defaultValue: 'alien-produ', trim: true)
         booleanParam(name: 'SKIP_MAVEN', defaultValue: false)
         booleanParam(name: 'DRY_RUN', defaultValue: false)

+ 2 - 2
docs/jenkins/produ/store/Jenkinsfile

@@ -22,8 +22,8 @@ pipeline {
         choice(name: 'DEPLOY_STRATEGY', choices: ['rolling', 'canary'])
         string(name: 'CANARY_WEIGHT', defaultValue: '10', trim: true)
         string(name: 'HARBOR_REGISTRY', defaultValue: '39.106.135.88', trim: true)
-        string(name: 'HARBOR_PROJECT', defaultValue: 'alien', trim: true)
-        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien/base/openjdk8-ffmpeg:v1', trim: true)
+        string(name: 'HARBOR_PROJECT', defaultValue: 'alien_cloud', trim: true)
+        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien_cloud/base/openjdk8-ffmpeg:v1', trim: true)
         string(name: 'K8S_NAMESPACE', defaultValue: 'alien-produ', trim: true)
         booleanParam(name: 'SKIP_MAVEN', defaultValue: false)
         booleanParam(name: 'DRY_RUN', defaultValue: false)

+ 2 - 2
docs/jenkins/produ/whole/Jenkinsfile

@@ -36,8 +36,8 @@ pipeline {
         choice(name: 'DEPLOY_STRATEGY', choices: ['rolling', 'canary'])
         string(name: 'CANARY_WEIGHT', defaultValue: '10', trim: true)
         string(name: 'HARBOR_REGISTRY', defaultValue: '39.106.135.88', trim: true)
-        string(name: 'HARBOR_PROJECT', defaultValue: 'alien', trim: true)
-        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien/base/openjdk8-ffmpeg:v1', trim: true)
+        string(name: 'HARBOR_PROJECT', defaultValue: 'alien_cloud', trim: true)
+        string(name: 'BASE_IMAGE', defaultValue: '39.106.135.88/alien_cloud/base/openjdk8-ffmpeg:v1', trim: true)
         string(name: 'K8S_NAMESPACE', defaultValue: 'alien-produ', trim: true)
         booleanParam(name: 'SKIP_MAVEN', defaultValue: false)
         booleanParam(name: 'DRY_RUN', defaultValue: false)