我已经遇到这个问题三天了,仍然不明白为什么我不能使用 NodePort 服务类型访问 k8s 集群外部的 NodePort。
基本上我已经在 rhel8 中设置了一个 3 节点集群,我遵循了本教程https://www.tecmint.com/install-a-kubernetes-cluster-on-centos-8/但是在 weavenet 网络中遇到了一些问题,这就是为什么我再次这样做,但这次使用 calico。
我安装了 calico 最新版本的网络插件,你可以看到所有的 kube pod 都健康并且正在运行。
这是我的部署文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-k8s
spec:
selector:
matchLabels:
app: hello-k8s
replicas: 1
template:
metadata:
labels:
app: hello-k8s
spec:
containers:
- name: spring-boot
image: fuzzy28/hello-k8s:v3
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: hello-k8s-svc
spec:
selector:
app: hello-k8s
ports:
- protocol: TCP
port: 8080
targetPort: 8080
type: NodePort
我已部署它并且它在下面突出显示的节点中运行良好。
如果我们检查该服务,它在 32020 端口运行。
我使用以下命令在所有节点上打开了端口
firewall-cmd --permanent --add-port=30000-32767/tcp
关键时刻,在 k8s 集群外部的浏览器上检查后发现无法访问。我在所有节点 IP 地址上都试过了,但无法访问。
奇怪的是,该 URL 只能在部署它的 pod 内部访问。
我真的不明白这里发生了什么,这是我的网络接口,如果你想看看。
答案1
我花了一段时间才找出导致该问题的最可能原因。事实证明,自 RHEL 8 版本以来,该问题iptables
已被弃用,并nftables
有新的替代版本。
38.2. 何时使用firewalld、nftables或iptables
iptables
:该iptables
实用程序是已弃用在 Red Hat Enterprise Linux 8 中。请改用nftables
。
Kubernetes 网络使用iptables
并且与不兼容nftables
。
我尝试通过禁用firewalld
和来解决您的问题nftables
,并强制 rhel8 使用 iptables,但仍然没有解决集群中的所有连接问题。
目前看来您能做的最好的事情就是使用较旧的 rhel 版本。如果您还有其他问题,请告诉我。