Эх сурвалжийг харах

"username": "robot$alien_cloud"

dujian 2 долоо хоног өмнө
parent
commit
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)