Kubernetes-calico 服务仅可从部署 pod 的位置访问

Kubernetes-calico 服务仅可从部署 pod 的位置访问

我已经遇到这个问题三天了,仍然不明白为什么我不能使用 NodePort 服务类型访问 k8s 集群外部的 NodePort。

基本上我已经在 rhel8 中设置了一个 3 节点集群,我遵循了本教程https://www.tecmint.com/install-a-kubernetes-cluster-on-centos-8/但是在 weavenet 网络中遇到了一些问题,这就是为什么我再次这样做,但这次使用 calico。

这是我的 3 节点集群: 在此处输入图片描述

我安装了 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 版本。如果您还有其他问题,请告诉我。

相关内容