【K8s教程】Nginx Ingress控制器通过主机网络部署说明

参考: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 对象的负载均衡器状态设置为内部节点地址而不是外部。 需要更新状态参数
posted @ 2021-08-11 08:45  Varden  阅读(1094)  评论(0编辑  收藏  举报