参考:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#via-the-host-network
在没有可用的外部负载均衡器但不能使用 NodePorts 的设置中,可以配置 ingress-nginx Pod 使用它们运行的主机的网络,而不是专用的网络命名空间。 这种方法的好处是 NGINX Ingress 控制器可以将端口 80 和 443 直接绑定到 Kubernetes 节点的网络接口,而无需 NodePort 服务强加的额外网络转换。
这种方法不利用任何服务对象来公开 NGINX Ingress 控制器。 如果 ingress-nginx目标集群中存在服务, 建议删除 。
这可以通过启用 Pod 规范中的 hostNetwork 选项。
template:
spec:
hostNetwork: true
安全考虑:启用此选项会将 NGINX Ingress 控制器每个系统守护进程暴露给任何网络接口上 ,包括主机的回环接口。请仔细评估这可能对您的系统安全产生的影响。
例子:考虑这个 ingress-nginx-controller 部署由 2 个副本组成,NGINX Pod 继承自其主机的 IP 地址而不是内部 Pod IP。
$ kubectl -n ingress-nginx get pod -o wide
NAME READY STATUS IP NODE
default-http-backend-7c5bc89cc9-p86md 1/1 Running 172.17.1.1 host-2
ingress-nginx-controller-5b4cf5fc6-7lg6c 1/1 Running 203.0.113.3 host-3
ingress-nginx-controller-5b4cf5fc6-lzrls 1/1 Running 203.0.113.2 host-2
这种部署方法的一个主要限制是, 每个集群节点上只能调度一个 NGINX Ingress 控制器 Pod,因为在同一网络接口上多次绑定同一端口在技术上是不可能的。 由于这种情况而无法调度的 Pod 会因以下事件而失败:
$ kubectl -n ingress-nginx describe pod <unschedulable-ingress-nginx-controller-pod>
...
Events:
Type Reason From Message
---- ------ ---- -------
Warning FailedScheduling default-scheduler 0/3 nodes are available: 3 node(s) didn't have free ports for the requested pod ports.
确保仅创建可调度 Pod 的一种方法是将 NGINX Ingress 控制器部署为 DaemonSet 而不是传统的 Deployment。
DaemonSet 只为每个集群节点调度一种类型的 Pod,包括主节点,除非节点配置为 Pod 排斥这些 。
由于 DaemonSet 对象的大多数属性与 Deployment 对象相同,因此本文档页面将相应清单的配置留给用户自行决定。
与 NodePorts 一样,这种方法有一些需要注意的地方。
- DNS解析
Pod 配置为 hostNetwork: true 不要使用内部 DNS 解析器(即 kube-dns 或 CoreDNS ),除非它们的 dnsPolicy 规格字段设置为 ClusterFirstWithHostNet. 如果 NGINX 出于任何原因需要解析内部名称,请考虑使用此设置。
- 入口状态
因为在使用主机网络的配置中没有暴露 NGINX Ingress 控制器的服务,默认标准云设置使用的 --publish-service 标志不适用 ,所有 Ingress 对象的状态保持空白。
$ kubectl get ingress
NAME HOSTS ADDRESS PORTS
test-ingress myapp.example.com 80
相反,由于裸机节点通常没有 ExternalIP,因此必须启用 --report-node-internal-ip-address 标志,它将所有 Ingress 对象的状态设置为运行 NGINX Ingress 控制器的所有节点的内部 IP 地址。
例子:给定一个 ingress-nginx-controller DaemonSet 由 2 个副本组成
$ kubectl -n ingress-nginx get pod -o wide
NAME READY STATUS IP NODE
default-http-backend-7c5bc89cc9-p86md 1/1 Running 172.17.1.1 host-2
ingress-nginx-controller-5b4cf5fc6-7lg6c 1/1 Running 203.0.113.3 host-3
ingress-nginx-controller-5b4cf5fc6-lzrls 1/1 Running 203.0.113.2 host-2
控制器将其管理的所有 Ingress 对象的状态设置为以下值:
$ kubectl get ingress -o wide
NAME HOSTS ADDRESS PORTS
test-ingress myapp.example.com 203.0.113.2,203.0.113.3 80
或者,可以使用以下 --publish-status-address 标志覆盖写入 Ingress 对象的地址。请参阅命令行参数(https://kubernetes.github.io/ingress-nginx/user-guide/cli-arguments/)。
命令行参数说明:
--publish-service 面向入口控制器的服务。 采用“命名空间/名称”的形式。 当与 update-status 一起使用时,控制器将此服务端点的地址镜像到它满足的所有 Ingress 对象的负载均衡器状态
--publish-status-address 自定义地址(或地址,以逗号分隔)设置为该控制器满足的 Ingress 对象的负载均衡器状态。 需要更新状态参数
--report-node-internal-ip-address 将 Ingress 对象的负载均衡器状态设置为内部节点地址而不是外部。 需要更新状态参数