华为云CCE网络配置实战:Ingress访问失败的深度排查手册
在华为云CCE(Cloud Container Engine)的实际部署中,Ingress作为Kubernetes集群对外暴露服务的标准方式,其配置问题一直是开发者最常遇到的"拦路虎"。本文将基于真实运维场景,系统梳理从基础配置到高级排查的全链路解决方案。
1. Ingress基础架构与华为云实现差异
华为云CCE的Ingress实现并非原生Kubernetes Ingress的简单封装,而是深度融合了华为云自有网络组件。其核心架构包含三个关键层:
- ELB层:华为云使用增强型负载均衡(ELB)作为Ingress的流量入口,这与自建Kubernetes集群常用的Nginx Ingress Controller有本质区别
- 路由转发层:通过自定义的CCE-Ingress-Controller实现Kubernetes Ingress资源到ELB配置的转换
- 服务暴露层:支持ClusterIP、NodePort和LoadBalancer三种服务类型的不同组合
# 典型问题现象检查命令 kubectl get ingress -n {namespace} # 查看Ingress资源状态 kubectl describe ingress {ingress-name} -n {namespace} # 获取详细事件记录注意:华为云CCE的Ingress控制器默认只处理注解中包含
kubernetes.io/ingress.class: cce的资源,手动创建的Ingress如未添加此注解将不会被处理
2. 配置检查清单:从入门到精通
2.1 端口映射的"双重验证"陷阱
许多开发者容易忽略的是,华为云CCE需要完成两次端口映射才能建立完整访问链路:
- 容器端口→服务端口:在Service的YAML中定义
ports: - name: http port: 8080 # 服务端口 targetPort: 80 # 容器端口 protocol: TCP - 服务端口→Ingress端口:在Ingress路由规则中指定
rules: - host: demo.example.com http: paths: - path: / backend: serviceName: demo-service servicePort: 8080 # 必须与Service定义一致
常见错误包括:
- 容器进程未监听targetPort指定端口
- Service的selector与Pod标签不匹配
- Ingress中servicePort写成targetPort
2.2 ELB类型选择的关键影响
华为云提供三种ELB类型,对Ingress支持度差异显著:
| ELB类型 | 支持协议 | Ingress兼容性 | 典型适用场景 |
|---|---|---|---|
| 应用型(ALB) | HTTP/HTTPS | 完全支持 | Web应用、API网关 |
| 网络型(NLB) | TCP/UDP | 部分支持 | 游戏、视频流等长连接 |
| 经典型(CLB) | 全协议 | 不支持 | 传统业务迁移过渡期 |
关键点:创建CCE集群时如果选错ELB类型,后续无法直接修改,只能重建Ingress控制器
3. 高级排查:当基础配置都正确时
3.1 安全组的三维检查法
华为云网络栈中安全组规则需要满足以下三维度放通:
ELB监听器维度:
- 入方向放通客户端访问端口(80/443)
- 出方向放通到后端节点的健康检查端口
节点安全组维度:
# 检查节点安全组规则 hcloud Server SecurityGroup list --server-id {node-id}需确保:
- 允许ELB健康检查IP段访问NodePort范围(默认30000-32767)
- 允许集群内部Pod间通信(VPC子网CIDR)
网络ACL维度: 在VPC子网层级可能存在的额外过滤规则
3.2 证书管理的特殊注意事项
HTTPS访问异常时,除常规证书检查外,需特别注意:
- 华为云ELB要求证书必须从证书管理服务导入,不支持直接上传PEM文件
- 证书链必须完整包含中间CA证书
- 证书过期会导致ELB自动删除监听器,但Ingress资源仍显示为正常
# 证书状态检查流程 curl -kv https://your-domain.com # 验证证书链 openssl s_client -connect {elb-ip}:443 -servername {domain} | openssl x509 -noout -dates # 检查有效期4. 性能优化与最佳实践
4.1 连接保持与超时参数调优
针对高并发场景推荐配置:
metadata: annotations: kubernetes.io/ingress.class: cce ingress.cce.io/keepalive-timeout: "300" # 连接保持时间(秒) ingress.cce.io/client-body-timeout: "60" # 客户端上传超时 ingress.cce.io/proxy-connect-timeout: "15" # 后端连接超时4.2 多可用区部署方案
华为云CCE跨AZ部署时,必须配置:
- Ingress注解开启多AZ:
annotations: ingress.cce.io/az-config: '{"type":"multi","azs":["az1","az2"]}' - ELB实例需选择"跨可用区"部署模式
- 每个AZ至少保留2个worker节点
实际项目中,我们曾遇到因单AZ部署导致某机房网络故障时服务完全不可用的情况。通过上述配置,即使单个AZ故障,服务仍能保持50%以上的容量运行。
5. 监控与日志分析体系
华为云CCE提供三层监控数据源:
ELB访问日志:
- 记录客户端原始请求
- 需在ELB控制台手动开启
- 存储周期最长30天
Ingress控制器日志:
kubectl logs -l app=cce-ingress-controller -n kube-system --tail=1000重点关注事件:
FailedUpdateLoadBalancerSyncLoadBalancerFailed
Prometheus监控指标:
cce_elb_healthy_host_count:健康后端实例数cce_elb_request_count:每分钟请求量cce_elb_latency_seconds:请求延迟分布
在日志分析过程中,我们发现约40%的Ingress访问问题可通过以下模式识别:
- 周期性5xx错误 → 健康检查配置不当
- 突发性连接重置 → 安全组规则冲突
- 持续超时 → 子网路由表缺失