You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:54:53