
# CCI 2.0负载调试与故障排查
#### 应用场景
在CCI的Serverless环境中，由于用户不再管理和运维底层基础设施，当工作负载（Workload）出现启动失败或健康检查不通过时，传统的"登录节点查看 Docker 日志"的方式不再适用。
本文档主要解决以下两类常见问题：
- **负载启动失败（CrashLoopBackOff）**：容器启动后立即退出，或者运行一段时间后异常退出，导致无法进入终端调试。
- **健康检查失败**：配置探针后，实例无法进入Ready 状态或反复重启。
 
#### 限制与约束
在进行调试前，请确保您的网络环境和监控配置满足以下条件，以便顺利拉取镜像并查看日志：
- **网络配置** ：命名空间已配置 [SNAT 网关](https://support.huaweicloud.com/usermanual-cci2/cci_01_0065.html)（用于访问公网）和[VPC 终端节点](https://support.huaweicloud.com/usermanual-cci2/cci_01_0005.html)（VPCEP，用于内网访问 SWR 镜像仓库）。
- **日志配置** ：已开通云日志服务（LTS），并创建了[日志组](https://support.huaweicloud.com/usermanual-lts/lts_04_0003.html)与[日志流](https://support.huaweicloud.com/usermanual-lts/lts_04_0004.html)。建议在创建负载时[开启日志采集](https://support.huaweicloud.com/usermanual-cci2/cci_01_0037.html)，以便保留容器退出前的标准输出日志。
 
#### 场景一：负载启动失败（Crash）的调试
- **问题分析**
  
  | **现象分类** | **典型表现**                                           |
  |:---|:---|
  | 启动即崩溃    | Pod 状态反复变为 CrashLoopBackOff，LTS 中可能采集不到日志（容器退出太快）。 |
  | 运行后崩溃    | Pod 运行数秒或数分钟后退出，LTS 中通常有日志记录。                      |
     
  
- **解决方案**
  使用"挂起（Sleep）"模式调试。当日志不足以定位问题（例如缺少依赖、环境变量错误、配置项缺失）时，可以通过修改启动命令，强制容器保持运行状态，从而进入容器内部进行"现场调试"。
  1. 修改启动命令。
     1. 在控制台选择目标负载，单击"YAML 编辑"。
     
     2. 找到容器配置，修改 command（启动命令），使其进入无限循环或长时间睡眠状态。 YAML 修改示例：
        ```
        spec:
          containers:
          - name: container-0
            # 原始镜像
            image: swr.cn-north-4.myhuaweicloud.com/test-namespace/app:v1
            # 修改为挂起命令，保持容器存活
            command:
              - /bin/sh
              - '-c'
              - 'while true; do echo hello; sleep 10; done'
        ```
        
     
     3. 单击"确定"提交更新。此时容器将成功启动并处于"运行中"状态。
      
  
  2. 进入容器调试。
     1. 在负载列表的操作列，单击"查看终端"。
     
     2. 选择 /bin/sh 或 /bin/bash 进入终端。
     
     3. **手动执行原始命令排查故障** ：在终端中输入该容器镜像原始的启动命令，手动触发业务逻辑以观察报错。
        - *示例场景*：假设负载原有的启动命令是ping www.example.co。
        
        - 执行：
          ```
          ping www.example.co
          ```
          
        
        - **结果**：终端直接报错 ping: unknown host www.example.co。
         
     
     4. **定位修复**：发现是域名拼写错误（.co 应为 .com）。您可以在容器内修改配置文件或环境变量进行验证。
      
  
  3. 恢复生产配置。 验证修复方案有效后，回到控制台更新负载，将启动命令（Command）和参数（Args）恢复为正确的业务配置。
     
   
 
#### 场景二：健康检查探针失败的调试
配置存活探针（Liveness Probe）或就绪探针（Readiness Probe）失败会导致容器被系统终止重启或流量无法接入。
- **常见配置误区**
  - HTTP 探针监听地址：若应用监听的是 127.0.0.1，而探针默认通过 Pod IP 访问，可能导致检测失败。建议应用监听 0.0.0.0。
  
  - Exec 探针超时：在 CCI 环境中，如果 Exec 脚本执行时间超过 timeoutSeconds，探针会被视为失败（Unknown）。
  
  - 端口不匹配：探针检测的端口必须与容器内应用实际监听的端口一致。
   
- **解决方案：手动模拟探测**
  建议遵循"**移除探针 -\> 手动验证 -\> 重新配置**"的流程。
  1. **移除探针**：更新负载，暂时删除健康检查配置，确保容器能正常启动并保持运行。
  
  2. **进入容器** ：通过控制台**远程登录**进入容器。
  
  3. **手动执行探测命令** ：
     - **验证 HTTP 请求** ：
       ```
       # 模拟 Kubernetes 发起的 HTTP Get 请求
       curl -I http://127.0.0.1:<端口>/<路径>
       ```
       若返回 404 或 Connection refused，说明应用配置有误。
       
     
     - **验证 Exec 命令** ：
       ```
       # 手动执行探针脚本
       /bin/sh -c "ls /tmp"
       ```
       检查命令是否返回 0，以及执行耗时是否过长。
       
      
  
  4. **回填配置**：确认手动执行成功后，将参数回填到 YAML 或控制台配置中。
   
- **参考配置示例**
  以下是一个包含完整健康检查配置的 Deployment YAML 片段，供参考：
  ```
  apiVersion: cci/v2
  kind: Deployment
  metadata:
    name: health-check-demo
  spec:
    template:
      spec:
        containers:
          - name: app
            image: nginx:latest
            # 存活探针：检测文件是否存在
            livenessProbe:
              exec:
                command: ["/bin/sh", "-c", "ls /tmp"]
              initialDelaySeconds: 5
              timeoutSeconds: 2
              periodSeconds: 10
            # 就绪探针：检测 HTTP 服务是否可用
            readinessProbe:
              httpGet:
                path: /
                port: 80
                scheme: HTTP
              initialDelaySeconds: 2
              timeoutSeconds: 1
  ```
  
 
