我正在尝试安装并使用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的事件。
安装说明是否存在问题,或者我是否在其中缺少任何内容。
答案 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
的更多信息,您可以找到here和here。
其他资源:
更新:
HostNetwork -控制窗格是否可以使用节点网络名称空间。这样做使Pod可以访问回送设备,在localhost上侦听的服务,并且可以用来监听同一节点上其他Pod的网络活动。
因此,除了上述答案之外:
为了将端口80和443直接绑定到Kubernetes节点的网络接口,您可以设置hostNetwork: true
(但不建议这样做):
启用此选项会将每个系统守护程序公开给任何网络接口上的NGINX Ingress控制器,包括主机的环回。请仔细评估可能对系统安全性的影响。