Kubernetes中通过Ingress暴露React应用及多API服务端口配置咨询
我来帮你梳理下解决这个问题的步骤,主要分两块:调整Ingress Controller的端口避开被占用的80,然后配置Ingress规则转发React应用和各个API请求。
第一步:修改Ingress Controller的Service,指定NodePort为30000
因为你的节点80端口被Apache占用,没法用默认的80端口暴露Ingress,所以需要把Ingress Controller的HTTP端口绑定到30000。假设你用的是官方的nginx-ingress-controller,操作如下:
手动修改Service
执行编辑命令打开Ingress Controller的Service配置:
kubectl edit service nginx-ingress-controller -n kube-system
找到spec.ports里的HTTP端口配置,添加nodePort: 30000,并确保Service类型是NodePort:
spec: type: NodePort ports: - name: http port: 80 targetPort: 80 nodePort: 30000 # 固定HTTP端口为30000 - name: https port: 443 targetPort: 443 # 如果需要HTTPS,也可以指定类似30001的nodePort,按需配置
用Helm安装的情况
如果是通过Helm部署的nginx-ingress,安装时直接指定参数:
helm install nginx-ingress ingress-nginx/ingress-nginx \ --set controller.service.nodePorts.http=30000 \ --namespace kube-system
第二步:配置Ingress规则,转发React应用和REST API
你的React应用Service是clientweb-service-ext(端口80),假设各REST API对应的ClusterIP Service分别是api-service-1、api-service-2(均用80端口),我们通过路径区分转发规则:
替换你当前的Ingress配置为以下内容:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: clientweb-ingress annotations: nginx.ingress.kubernetes.io/use-regex: "true" # 开启正则匹配,支持API子路径转发 spec: ingressClassName: nginx # 指定Ingress Controller的class,默认是nginx rules: - http: paths: # 根路径转发到React应用 - path: / pathType: Prefix backend: service: name: clientweb-service-ext port: number: 80 # /api1路径转发到第一个REST API服务 - path: /api1(/|$)(.*) pathType: ImplementationSpecific backend: service: name: api-service-1 port: number: 80 # /api2路径转发到第二个REST API服务 - path: /api2(/|$)(.*) pathType: ImplementationSpecific backend: service: name: api-service-2 port: number: 80 # 可继续添加更多API的路径规则,依此类推
关键说明
ingressClassName:必须指定你的Ingress Controller的class,确保Ingress能被正确识别处理。- 路径匹配:根路径用
Prefix类型,确保所有根路径请求都转发到React应用;API路径用正则匹配(配合use-regex注解),可以正确转发子路径请求(比如/api1/users会转发到api-service-1的/users)。 - 如果需要按域名区分服务(比如react.example.com和api.example.com),可以给规则添加
host字段,不过你当前需求是通过节点IP:30000访问,直接用路径区分即可。
第三步:验证配置
应用Ingress配置:
kubectl apply -f your-ingress-file.yaml
检查Ingress状态,确认规则生效:
kubectl get ingress clientweb-ingress
检查Ingress Controller的Service,确认30000端口已绑定:
kubectl get service nginx-ingress-controller -n kube-system
现在你就可以通过http://<节点IP>:30000访问React应用,通过http://<节点IP>:30000/api1、http://<节点IP>:30000/api2分别访问对应的REST API了。
内容的提问来源于stack exchange,提问作者user10294434

