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

时间:2019-09-18 22:33:29

标签: docker nginx kubernetes nginx-ingress

我正在尝试安装并使用nginx-ingress公开在kubernetes集群下运行的服务,我正在遵循此instructions

第4步中,指出:

  

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

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

但是在执行了指令 3.2 kubectl apply -f daemon-set/nginx-ingress.yaml之后,就创建了守护程序集,但是在集群的所有节点中都没有侦听80或443的事件。

安装说明是否存在问题,或者我是否在其中缺少任何内容。

2 个答案:

答案 0 :(得分:1)

从netstat的输出中可以获得的不是典型的Listen。它被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>

修改 当请求到达端口80/443时,iptables会将DNAT规则应用于该请求,从而将目标IP修改为入口控制器的ip地址。实际的侦听是在入口控制器容器内。

答案 1 :(得分:0)

Hang du(+1)所述 根据您群集中--proxy-mode的默认设置:

  

要使用的代理模式:“用户空间”(旧)或“ iptables”(更快)或“ ipvs”。如果为空,请使用最可用的代理(当前iptables )。如果选择iptables代理(无论如何选择),但是系统的内核或iptables版本不够用,则始终退回到用户空间代理。

假设您在nginx-ingress-controller-xxx名称空间中拥有kube-system控制器,则可以使用此命令在您的身边验证以下参数:

sudo iptables-save | grep $(kubectl get pods -n kube-system -o wide | grep nginx-ingress-controller-xxx | awk '{print $6}')

有关iptables/netfilter的更多信息,您可以找到herehere

其他资源:

更新

HostNetwork -控制窗格是否可以使用节点网络名称空间。这样做使Pod可以访问回送设备,在localhost上侦听的服务,并且可以用来监听同一节点上其他Pod的网络活动。

因此,除了上述答案之外:

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

  

启用此选项会将每个系统守护程序公开给任何网络接口上的NGINX Ingress控制器,包括主机的环回。请仔细评估可能对系统安全性的影响。