K8s设置service的nodeport以后外部无法访问对应的端口的问题

博客讲述了在Kubernetes环境中,使用NodePort模式服务时遇到外部无法访问的问题。问题根源在于Docker 1.13版本后iptables的FORWARD链默认策略变为DROP,导致不同主机间通信受阻。临时解决方案是通过iptables命令设置FORWARD链为ACCEPT,但重启后会失效。永久解决方法是在Docker服务配置中添加启动参数,修改iptables规则,确保重启后依然生效。

于Service 设置为NodePort 模式后导致外部无法访问对应的端口问题,查看下node节点上已经出现了30002端口的监听,确保服务器外部安全组等限制已经放行该端口,按照网上搜到的教程配置基本没看到要配置iptables相关的问题。
然后查阅了不少资料才看到docker 1.13 版本对iptables的规则进行了改动,默认FORWARD 链的规则为DROP ,带来的问题主要一旦DROP后,不同主机间就不能正常通信了(kubernetes的网络使用flannel的情况)。
查看下node节点上的iptables规则:

[root@k8s-master ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
KUBE-FIREWALL  all  --  0.0.0.0/0            0.0.0.0/0           
 
Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-ISOLATION  all  --  0.0.0.0/0            0.0.0.0/0           
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0  

iptables 被kubernetes接管后的规则比较多,仔细看下FORWARD 规则就发现了,policy DROP状态,这就导致了我们直接访问node节点的IP加上端口会无法访问容器,问题出在iptables上就好解决了。
临时解决方案,直接设置FORWARD 全局为ACCEPT:

[root@k8s-master ~]# iptables -P FORWARD ACCEPT

[root@k8s-master ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
KUBE-FIREWALL  all  --  0.0.0.0/0            0.0.0.0/0           
 
Chain FORWARD (policy ACCEPT)

这样需要在每台node上执行命令,并且重启node后规则失效;
永久解决方案,修改Docker启动参数,在[Service] 区域末尾加上参数:

[root@k8s-master ~]# vim /usr/lib/systemd/system/docker.service
[Service]
............
ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT

[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl restart docker

由于修改了systemctl 文件,所以需要重新载入,重启docker 就可以看到iptables规则已经加上ACCEPT all – 0.0.0.0/0 0.0.0.0/0

登录后复制
[root@k8s-master ~]#  iptables -L -n
Chain INPUT (policy DROP)
target     prot opt source               destination         
KUBE-FIREWALL  all  --  0.0.0.0/0            0.0.0.0/0           
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0 
-----------------------------------
 

<think>我们正在讨论Kubernetes中Service端口配置:nodePort、targetPort和port。根据引用[1]、[2]、[3]、[4]、[5]的内容,这些端口分别代表:-**targetPort**:Pod内容器监听的端口,即容器实际暴露的端口(如Dockerfile中EXPOSE的端口)。-**port**:Service在集群内部暴露的端口,其他Pod通过该端口访问Service。-**nodePort**:当Service类型为NodePort或LoadBalancer时,在集群节点上映射的端口外部用户可以通过该端口访问Service。最佳配置建议基于以下几点:1.**targetPort**:-应设置为Pod内容器实际监听的端口,例如,nginx容器通常为80。-如果容器暴露了多个端口,可以为每个端口定义Service端口映射。-确保与Dockerfile中的EXPOSE端口一致(引用[3]、[5])。2.**port**:-是集群内部的Service端口,建议选择不冲突且符合内部通信规范的端口。-例如,如果容器在80端口监听,Service的port可以设置为80(与targetPort相同)或任何其他值(如8080),但调用方需使用该port访问服务(引用[1]、[3]、[4])。-注意:集群内其他服务访问此Service时,使用Service名称和port(如`mysql-service:33306`)。3.**nodePort**:-当需要从集群外部访问时,Service类型应设为NodePort(或LoadBalancer)。-nodePort的默认范围是30000-32767(Kubernetes默认),可以手动指定在该范围内的端口。-避免使用已知冲突端口,且不建议手动指定固定nodePort(除非必要),可由系统自动分配(引用[1]、[3]、[4])。具体建议:-**通用场景**:```yamlapiVersion:v1kind:Servicemetadata:name:nginx-servicespec:type:NodePortselector:app:nginxports:-port:80#集群内访问的端口targetPort:80#Pod内容器的端口#不指定nodePort,由Kubernetes自动分配```-**自定义内部端口**:如果容器在80端口监听,但希望内部服务通过8080端口访问:```yamlports:-port:8080#集群内访问的端口targetPort:80#容器端口```-**固定nodePort(谨慎使用)**:```yamlports:-port:80targetPort:80nodePort:30001#手动指定,必须在30000-32767范围内```**最佳实践总结**:1.优先让系统自动分配nodePort,减少手动维护成本。2.targetPort必须与容器实际端口一致。3.port在集群内部应保持唯一,避免冲突;通常与targetPort相同,也可自定义(需确保调用方知晓)。4.若容器端口变更,只需更新Service的targetPort,无需改变port(集群内访问方式不变)。5.外部访问时,通过NodeIP:nodePort或LoadBalancer地址访问。**注意事项**:-安全组/防火墙需开放nodePort范围(30000-32767)以允许外部流量。-使用命名端口(如直接使用容器配置中定义的端口名称)可提高可读性和可维护性,例如:```yamlports:-name:httpport:80targetPort:web-server-port#对应Pod的containerPort名称```在Pod定义中:```yamlcontainers:-name:nginxports:-containerPort:80name:web-server-port```通过合理配置,确保Service正确路由流量至后端Pod,同时保障可维护性和安全性。</think> ### Kubernetes NodePort、TargetPort 和 Port 的最佳配置建议 在 Kubernetes Service 配置中,`nodePort`、`targetPort` 和 `port` 的合理配置对网络通信至关重要,以下是结合引用资料的最佳实践: #### 1. **核心概念定义**(引用[1][3][5]) - **`targetPort`**: Pod 内容器的实际监听端口,必须与容器暴露的端口一致(对应 Dockerfile 的 `EXPOSE` 或 Pod 的 `containerPort`)。 **最佳实践**: - 直接使用容器标准端口(如 Nginx 用 80,MySQL 用 3306) - 避免随意修改,保持与容器设计一致 - **`port`**: Service 在集群内部的访问端口,仅用于集群内服务间通信(引用[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值