我正在尝试安装并使用nginx来公开在kubernetes集群下运行的服务,并且我正在遵循这个使用说明。
在步骤4中,注意到:
如果您创建了一个守护进程,那么Ingress控制器容器的端口80和443将映射到容器正在运行的节点的相同端口。若要访问侵入控制器,请使用这些端口和集群中正在运行Ingress控制器的任何节点的IP地址。
这意味着守护进程将监听端口80和443,将传入的通信量转发到由ingress.yaml配置文件映射的服务。
但是在运行指令3.2 kubectl apply -f daemon-set/nginx-ingress.yaml之后,创建了守护进程集,但是集群所有节点上的80或443都没有监听。
安装指令有问题吗?还是我漏掉了什么?
发布于 2019-09-19 01:12:00
它不是从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:44310.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地址。实际侦听在入口控制器容器内。
发布于 2019-09-23 14:13:10
正如杭都 (+1)所提到的,根据集群中用于--proxy-mode的默认设置
使用哪种代理模式:“userspace”(旧版)或“iptables”(更快)或“ipv”。如果为空,则使用最佳可用代理(当前为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的更多信息,您可以找到这里和这里。
追加资源:
更新
HostNetwork -控制pod是否可以使用节点网络命名空间。这样做可以让pod访问环回设备,在本地主机上侦听服务,并可用于窥探同一节点上其他荚的网络活动。
因此,除上述答案外:
为了将端口80和443直接绑定到Kubernetes节点的网络接口,您可以设置hostNetwork: true (但不建议这样做):
启用此选项时,每个系统守护进程都会在任何网络接口(包括主机的回送)上向NGINX Ingress控制器公开。请仔细评估这可能对您的系统安全产生的影响。
https://stackoverflow.com/questions/58001524
复制相似问题