Helm/Kubernetes多环境配置:如何获取独立外部IP?
我是Helm和Kubernetes新手,正尝试搭建包含测试、生产环境的集群,单环境运行正常,但无法为两个环境配置独立外部IP。已部署Nginx-Ingress控制器,按文档理解Ingress应路由流量,但执行kubectl get svc仅显示一个外部IP,访问返回404。安装Chart无报错,前后端服务均运行。此外,我参考的Helm入门教程为简化跳过了Ingress,但我认为Ingress更适合生产环境,不过该示例为单环境服务配置了不同端点。
提供的Ingress.yaml模板
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-service annotations: #nginx.ingress.kubernetes.io/use-regex: "true" #nginx.ingress.kubernetes.io/rewrite-target: /$1 nginx.ingress.kubernetes.io/enable-cors: "true" nginx.ingress.kubernetes.io/cors-allow-origin: octodemo.net nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, PATCH, OPTIONS, DELETE" nginx.ingress.kubernetes.io/cors-allow-headers: "DNT,X-CustomHeader,X-LANG,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Api-Key,X-Device-Id,Access-Control-Allow-Origin" spec: rules: - host: {{ .Values.ingress.host }} http: paths: - path: / pathType: Prefix backend: service: name: {{ .Values.frontend.service.name }} port: number: {{ .Values.frontend.service.ports.port }} - path: /api pathType: Prefix backend: service: name: {{ .Values.backend.service.name }} port: number: {{ .Values.backend.service.ports.port }} ingressClassName: nginx
kubectl get svc -A执行结果
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default kubernetes ClusterIP 10.92.0.1 <none> 443/TCP 20d demoapp backend-svc ClusterIP 10.92.8.36 <none> 5000/TCP 8m7s demoapp frontend-svc ClusterIP 10.92.7.207 <none> 3000/TCP 8m7s demotest test-backend-svcs ClusterIP 10.92.1.97 <none> 5000/TCP 3m39s demotest test-frontend-svc ClusterIP 10.92.7.164 <none> 3000/TCP 3m39s ingress-nginx ingress-nginx-controller LoadBalancer 10.92.14.1 34.94.209.65 80:31918/TCP,443:30364/TCP 17d ingress-nginx ingress-nginx-controller-admission ClusterIP 10.92.1.197 <none> 443/TCP 17d kube-system default-http-backend NodePort 10.92.5.251 <none> 80:30582/TCP 20d kube-system kube-dns ClusterIP 10.92.0.10 <none> 53/UDP,53/TCP 20d kube-system metrics-server ClusterIP 10.92.12.113 <none> 443/TCP 20d
1. 核心概念澄清
Nginx Ingress Controller本身是LoadBalancer类型的Service,所以只会有一个外部IP。所有环境的流量都通过这个IP进入,再由Ingress规则根据域名或路径前缀路由到对应namespace的服务,不需要给每个环境单独分配外部IP。
2. 修复404及多环境路由步骤
(1)配置多环境Ingress规则
当前Ingress模板仅支持单个host,需要扩展为支持生产、测试两个环境的规则,示例如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: multi-env-ingress annotations: nginx.ingress.kubernetes.io/enable-cors: "true" nginx.ingress.kubernetes.io/cors-allow-origin: "octodemo.net" nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, PATCH, OPTIONS, DELETE" nginx.ingress.kubernetes.io/cors-allow-headers: "DNT,X-CustomHeader,X-LANG,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Api-Key,X-Device-Id,Access-Control-Allow-Origin" spec: ingressClassName: nginx rules: # 生产环境路由规则 - host: prod.octodemo.net http: paths: - path: / pathType: Prefix backend: service: name: frontend-svc port: number: 3000 serviceNamespace: demoapp - path: /api pathType: Prefix backend: service: name: backend-svc port: number: 5000 serviceNamespace: demoapp # 测试环境路由规则 - host: test.octodemo.net http: paths: - path: / pathType: Prefix backend: service: name: test-frontend-svc port: number: 3000 serviceNamespace: demotest - path: /api pathType: Prefix backend: service: name: test-backend-svcs port: number: 5000 serviceNamespace: demotest
(2)域名解析配置
将prod.octodemo.net和test.octodemo.net都解析到Ingress Controller的外部IP(34.94.209.65)。如果没有真实域名,可在本地hosts文件添加映射:
34.94.209.65 prod.octodemo.net 34.94.209.65 test.octodemo.net
(3)验证Ingress状态
执行以下命令确认Ingress资源正常:
# 查看Ingress列表 kubectl get ingress # 查看具体Ingress的规则和事件 kubectl describe ingress multi-env-ingress
(4)测试访问
分别访问http://prod.octodemo.net和http://test.octodemo.net,验证是否正确路由到对应环境的前后端服务。
3. Helm多环境部署优化建议
使用Helm的环境专属values文件区分配置:
- 生产环境部署:
helm install demoapp ./mychart -f values-prod.yaml - 测试环境部署:
helm install demotest ./mychart -f values-test.yaml
在每个values文件中定义对应环境的ingress.host,也可以在Ingress模板中通过Helm条件判断生成多环境规则,或者为每个环境单独创建Ingress资源。
内容的提问来源于stack exchange,提问作者Jowz

