ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

【K8s教程】ingress-nginx 通过主机网络部署说明

2021-08-11 09:01:51  阅读:425  来源: 互联网

标签:ingress NGINX Ingress nginx Pod K8s 控制器


参考: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 对象的负载均衡器状态设置为内部节点地址而不是外部。 需要更新状态参数

标签:ingress,NGINX,Ingress,nginx,Pod,K8s,控制器
来源: https://www.cnblogs.com/varden/p/15126662.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有