
ingress-nginx 如何用 --publish-service 将 LoadBalancer Service 的外部 IP 发布给 Ingress【免费下载链接】ingress-nginxIngress NGINX Controller for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/in/ingress-nginx希望 Ingress 对象的 ADDRESS 列出现一个可用的外部地址并且让所有 Ingress 共享这个地址ingress-nginx 文档给出的方案是把 controller 放在一个Type: LoadBalancer的 Service 之后再用--publish-service参数把该 Service 指给 controller。本文按 static-ip 示例 走完整路径创建 LoadBalancer Service → 用--publish-service启动 controller → 创建 Ingress 并验证地址已发布。前提集群支持Type: LoadBalancer的 Service示例主流程假设该 Service 能拿到 EXTERNAL-IP。如果集群里运行着多个 Ingress controller先通过 Ingress class 保证该 Ingress 只由目标 controller 处理参见 multiple-ingress。--publish-service 的作用机制按 命令行参数表 的定义--publish-serviceService fronting the Ingress controller形式为namespace/name。与update-status一起使用时controller 会把该 Service 端点的地址镜像到它满足的所有 Ingress 对象的 load-balancer status。--update-status更新 Ingress 对象的 load-balancer status默认值为true且要求--publish-service指向一个有效的 Service 引用。也就是说链路是LoadBalancer Service 拿到外部 IP → controller 通过--publish-service读取该 Service 的地址 → 写入所有受管 Ingress 的status.loadBalancer。static-ip 示例 同时解释了背景controller Pod 实际运行在集群节点上默认能否获得静态 IP 取决于 cloudprovider 是否支持例如 GKE/GCE 节点虽然有静态 IP但升级后不会保留。LB Service --publish-service是文档给出的通用解法。准备条件示例依赖两个对象tls-secretTLS Secret 和测试 HTTP 服务http-svc。创建 TLS Secret2048 位 RSA主机名为任意值命令来自 PREREQUISITES$ openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj /CNnginxsvc/Onginxsvc $ kubectl create secret tls tls-secret --key tls.key --cert tls.crt secret tls-secret created部署测试 HTTP 服务。该清单即仓库 docs/examples/ 目录下的http-svc.yaml包含http-svcDeployment 与同名 Service$ kubectl create -f http-svc.yaml service http-svc created第一步创建 LoadBalancer Service 并等待获得 IP示例的 Service 清单是 static-ip-svc.yaml通过标签选中 controller Pod暴露 80/443并设置externalTrafficPolicy: Local# This is the backend service apiVersion: v1 kind: Service metadata: name: ingress-nginx-lb labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx spec: externalTrafficPolicy: Local type: LoadBalancer loadBalancerIP: 104.154.109.191 ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: # Selects ingress-nginx-controller pods app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx注意清单中的loadBalancerIP: 104.154.109.191是文档演示用的地址对应后文“固定已分配 IP”一节实际环境请替换成你要固定的地址如果先让 Service 动态分配 IP、之后再固定可参照本文最后一节的方法。创建 Service并用 EXTERNAL-IP 列确认它已拿到地址$ kubectl create -f static-ip-svc.yaml service ingress-nginx-lb created $ kubectl get svc ingress-nginx-lb NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-lb 10.0.138.113 104.154.109.191 80:31457/TCP,443:32240/TCP 15m以上为文档示例输出。实际环境需等待 EXTERNAL-IP 列不再是pending并记下这个地址它是后文验证 ADDRESS 的对照值。第二步用 --publish-service 启动 controller示例的 controller 清单是 nginx-ingress-controller.yaml使用镜像registry.k8s.io/ingress-nginx/controller:v1.0.5文档示例版本。与任务直接相关的是容器args的最后一段containers: - image: registry.k8s.io/ingress-nginx/controller:v1.0.5 name: controller env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace args: - /nginx-ingress-controller - --publish-service$(POD_NAMESPACE)/ingress-nginx-lb$(POD_NAMESPACE)是 Kubernetes 环境变量展开指向同一清单里已定义的POD_NAMESPACEenv取自 Pod 的metadata.namespace无需手工替换展开后参数值即“当前命名空间/ingress-nginx-lb”正好指向第一步创建的 Service。完整清单还包含 readiness/liveness 探针/healthz端口 10254、80/443 端口映射与terminationGracePeriodSeconds: 60。$ kubectl create -f nginx-ingress-controller.yaml deployment ingress-nginx-controller created第三步创建 Ingress 并核对地址示例 Ingress 是 nginx-ingress.yamlingressClassName: nginxcontroller 的--ingress-class默认为nginx会处理 class 为nginx或为空的 Ingress引用tls-secret把所有路径路由到http-svc:80apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-nginx spec: ingressClassName: nginx tls: # This assumes tls-secret exists. - secretName: tls-secret rules: - http: paths: - path: / pathType: Prefix backend: # This assumes http-svc exists and routes to healthy endpoints. service: name: http-svc port: number: 80创建后查看 ADDRESS 是否已发布$ kubectl create -f nginx-ingress.yaml ingress ingress-nginx created $ kubectl get ing ingress-nginx NAME HOSTS ADDRESS PORTS AGE ingress-nginx * 104.154.109.191 80, 443 13m以上为文档示例输出ADDRESS 应等于第一步kubectl get svc里拿到的 EXTERNAL-IP。再用 curl 验证端到端可访问文档示例中地址即该 EXTERNAL-IP实际替换为你自己的地址$ curl 104.154.109.191 -kL CLIENT VALUES: client_address10.180.1.25 commandGET real path/ querynil request_version1.1 request_urihttp://104.154.109.191:8080/ ...该输出为文档示例是后端http-svc返回的内容。验证 IP 在 Ingress 重建后保留static-ip 示例 用删除并重建 Ingress 的方式验证地址不会丢失$ kubectl delete ing ingress-nginx ingress ingress-nginx deleted $ kubectl create -f nginx-ingress.yaml ingress ingress-nginx created $ kubectl get ing ingress-nginx NAME HOSTS ADDRESS PORTS AGE ingress-nginx * 104.154.109.191 80, 443 13m重建后 ADDRESS 仍是同一个外部 IP文档示例值。文档同时说明不同于 GCE Ingress这里所有 Ingress 共享同一个 load-balancer IP因为所有请求都经过同一组 nginx controller 转发。可选把动态分配的 IP 提升为静态 IP如果希望 Service 被删除后 IP 仍然保留先把该 IP 固定到 Service 上文档演示用值实际替换为你自己的 IP$ kubectl patch svc ingress-nginx-lb -p {spec: {loadBalancerIP: 104.154.109.191}} ingress-nginx-lb patched再按 cloudprovider 的方式把 IP 提升为静态资源文档注明 promotion 方式因 cloudprovider 而异以下示例仅适用于 GKE/GCE$ gcloud compute addresses create ingress-nginx-lb --addresses 104.154.109.191 --region us-central1完成后即使 Service 被删除IP 也不会释放可以用spec.loadBalancerIP指向该地址重新创建 Service。不适用的场景hostNetwork DaemonSetbare-metal部署bare-metal 部署文档 明确指出以hostNetwork: true的 DaemonSet 方式部署 controller 时集群中没有暴露 controller 的 Service标准云环境使用的--publish-service不适用所有 Ingress 的 status ADDRESS 保持为空。该模式下文档给出的替代手段是启用--report-node-internal-ip-address把运行 controller 的节点内部 IP 写入 Ingress status也可以用--publish-status-address直接覆盖写入的地址。参考文件示例主流程docs/examples/static-ip/README.md示例清单static-ip-svc.yaml、nginx-ingress-controller.yaml、nginx-ingress.yaml参数定义Command line arguments测试服务与示例前置条件http-svc.yaml、PREREQUISITES【免费下载链接】ingress-nginxIngress NGINX Controller for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/in/ingress-nginx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考