Docker 将ngnix入口控制器作为守护程序集公开

Docker 将ngnix入口控制器作为守护程序集公开,docker,nginx,kubernetes,nginx-ingress,Docker,Nginx,Kubernetes,Nginx Ingress,我正在尝试安装并使用nginx入口来公开在kubernetes集群下运行的服务,我遵循这一点 在步骤4中注意到: 如果创建了守护程序集,则入口控制器容器的端口80和443将映射到容器正在运行的节点的相同端口。要访问入口控制器,请使用这些端口和入口控制器运行所在群集的任何节点的IP地址 这意味着守护程序将侦听端口80和443,以将传入流量转发到由ingress.yaml配置文件映射的服务 但是在运行指令3.2kubectl apply-f daemon set/nginx ingres.yaml之

我正在尝试安装并使用nginx入口来公开在kubernetes集群下运行的服务,我遵循这一点

步骤4中注意到:

如果创建了守护程序集,则入口控制器容器的端口80和443将映射到容器正在运行的节点的相同端口。要访问入口控制器,请使用这些端口和入口控制器运行所在群集的任何节点的IP地址

这意味着守护程序将侦听端口80和443,以将传入流量转发到由ingress.yaml配置文件映射的服务

但是在运行指令3.2
kubectl apply-f daemon set/nginx ingres.yaml之后,创建了守护程序集,但在所有集群节点的80或443上都没有侦听任何内容


安装指令有问题吗,或者我遗漏了什么。

这不是从netstat的输出中可以得到的典型侦听。它由iptables“监听”。以下是我的群集节点上入口控制器的iptables规则

-A CNI-DN-0320b4db24e84e16999fd -s 10.233.88.110/32 -p tcp -m tcp --dport 80 -j CNI-HOSTPORT-SETMARK
-A CNI-DN-0320b4db24e84e16999fd -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.233.88.110:80
-A CNI-DN-0320b4db24e84e16999fd -s 10.233.88.110/32 -p tcp -m tcp --dport 443 -j CNI-HOSTPORT-SETMARK
-A CNI-DN-0320b4db24e84e16999fd -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.233.88.110:443
10.233.88.110是在该节点上运行的入口控制器的ip地址

$ kubectl get pod -n ingress-nginx -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP              NODE          NOMINATED NODE   READINESS GATES
ingress-nginx-controller-5rh26   1/1     Running   1          77d   10.233.83.110   k8s-master3   <none>           <none>
ingress-nginx-controller-9nnwl   1/1     Running   1          77d   10.233.88.110   k8s-master2   <none>           <none>
ingress-nginx-controller-ckkb2   1/1     Running   1          77d   10.233.68.111   k8s-master1   <none>           <none>
$kubectl获得吊舱-n入口nginx-o宽
名称就绪状态重新启动老化IP节点指定节点就绪门
ingress-nginx-controller-5rh26 1/1运行1 77d 10.233.83.110 k8s-master3
ingress-nginx-controller-9nnwl 1/1运行1 77d 10.233.88.110 k8s-master2
ingress-nginx-controller-ckkb2 1/1运行1 77d 10.233.68.111 k8s-master1
编辑
当请求到达端口80/443时,iptables将对该请求应用DNAT规则,该规则将目标IP修改为入口控制器的IP地址。实际侦听在入口控制器容器内。

它不是典型的侦听,您可以从netstat的输出中获得。它由iptables“监听”。以下是我的群集节点上入口控制器的iptables规则

-A CNI-DN-0320b4db24e84e16999fd -s 10.233.88.110/32 -p tcp -m tcp --dport 80 -j CNI-HOSTPORT-SETMARK
-A CNI-DN-0320b4db24e84e16999fd -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.233.88.110:80
-A CNI-DN-0320b4db24e84e16999fd -s 10.233.88.110/32 -p tcp -m tcp --dport 443 -j CNI-HOSTPORT-SETMARK
-A CNI-DN-0320b4db24e84e16999fd -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.233.88.110:443
10.233.88.110是在该节点上运行的入口控制器的ip地址

$ kubectl get pod -n ingress-nginx -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP              NODE          NOMINATED NODE   READINESS GATES
ingress-nginx-controller-5rh26   1/1     Running   1          77d   10.233.83.110   k8s-master3   <none>           <none>
ingress-nginx-controller-9nnwl   1/1     Running   1          77d   10.233.88.110   k8s-master2   <none>           <none>
ingress-nginx-controller-ckkb2   1/1     Running   1          77d   10.233.68.111   k8s-master1   <none>           <none>
$kubectl获得吊舱-n入口nginx-o宽
名称就绪状态重新启动老化IP节点指定节点就绪门
ingress-nginx-controller-5rh26 1/1运行1 77d 10.233.83.110 k8s-master3
ingress-nginx-controller-9nnwl 1/1运行1 77d 10.233.88.110 k8s-master2
ingress-nginx-controller-ckkb2 1/1运行1 77d 10.233.68.111 k8s-master1
编辑 当请求到达端口80/443时,iptables将对该请求应用DNAT规则,该规则将目标IP修改为入口控制器的IP地址。实际侦听在入口控制器容器内。

如(+1)所述 根据集群中
--代理模式的默认设置:

使用哪种代理模式:“用户空间”(较旧)或“iptables”(更快)或“IPV”。如果为空,请使用可用的最佳代理(当前iptables)。如果选择了iptables代理,无论如何选择,但系统的内核或iptables版本不足,这总是会返回到用户空间代理

假设您在
kube系统
名称空间中有
nginx入口控制器xxx
控制器,您可以使用此命令验证您这边的参数:

sudo iptables-save | grep $(kubectl get pods -n kube-system -o wide | grep nginx-ingress-controller-xxx | awk '{print $6}')
有关
iptables/netfilter
的更多信息,您可以找到和

额外资源:

更新

主机网络-控制pod是否可以使用节点网络命名空间。这样做可以让pod访问环回设备、监听本地主机的服务,并可以用来窥探同一节点上其他pod的网络活动

因此,除了上述答案外:

为了将端口80和443直接绑定到Kubernetes节点的网络接口,您可以设置
hostNetwork:true
(但不推荐):

启用此选项将在任何网络接口(包括主机的环回)上向NGINX入口控制器公开每个系统守护程序。请仔细评估这对系统安全性的影响

如所述(+1) 根据集群中
--代理模式的默认设置:

使用哪种代理模式:“用户空间”(较旧)或“iptables”(更快)或“IPV”。如果为空,请使用可用的最佳代理(当前iptables)。如果选择了iptables代理,无论如何选择,但系统的内核或iptables版本不足,这总是会返回到用户空间代理

假设您在
kube系统
名称空间中有
nginx入口控制器xxx
控制器,您可以使用此命令验证您这边的参数:

sudo iptables-save | grep $(kubectl get pods -n kube-system -o wide | grep nginx-ingress-controller-xxx | awk '{print $6}')
有关
iptables/netfilter
的更多信息,您可以找到和

额外资源:

更新

主机网络-控制pod是否可以使用节点网络命名空间。这样做可以让pod访问环回设备、监听本地主机的服务,并可以用来窥探同一节点上其他pod的网络活动

因此,除了上述答案外:

为了将端口80和443直接绑定到Kubernetes节点的网络接口,您可以设置
hostNetwork:true
(但不推荐):

启用此选项会将每个系统守护程序公开给任何n上的NGINX入口控制器