Kubernetes nodePort 不可访问的解决方法

Kubernetes 的node节点,在本机上可以访问 web 的某个端口,但是从外网却无法访问。

通常是由于selinux问题 和 iptables 问题。

解决方式如下:

# 查看 selinux, 如果显示 Enforcing,表示开启
getenforce

# 关闭 selinux
setenforce 0

# 清除 iptables
iptables --flush iptables -tnat --flush

# 接受所有来路
iptables -P FORWARD ACCEPT

# 重启 docker,k8s 会重新调度 service docker restart

SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux 安全子系统。NSA 是在 Linux 社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在它的任务中所需要文件。

SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 。

通过 setenforce 0 关闭 SELinux ,这样容器才可以访问主机的文件系统,例如 pod 的网络操作就需要访问主机文件系统,直到kubelet 支持 SELinux 之前都需要关闭 SELinux。

iptables --flush 和 iptables -tnat --flush是清空 iptables 的规则,然后重启 docker 后会重新加入 kubernetes 的 iptables 规则,iptables -P FORWARD ACCEPT 则允许转发。

使用 Kubernetes 创建完 pod 之后,查看 pods 状态,发现都处于 containercreationg 状态中。kubectl get pods ...