Kubernetes 无法访问在RPI上运行的K8群集中的NGINX nodePort服务

Kubernetes 无法访问在RPI上运行的K8群集中的NGINX nodePort服务,kubernetes,raspberry-pi,Kubernetes,Raspberry Pi,我在Raspberry Pi上建立了一个小型Kubernetes集群,目前由1个主节点和1个工作节点组成。我创建了一个简单的NGINX部署,并为此创建了一个NodePort服务。我的YAML看起来像这样: apiVersion: v1 kind: Service metadata: name: nginx-service labels: app: nginx spec: selector: app: nginx type: NodePort ports:

我在Raspberry Pi上建立了一个小型Kubernetes集群,目前由1个主节点和1个工作节点组成。我创建了一个简单的NGINX部署,并为此创建了一个NodePort服务。我的YAML看起来像这样:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
    - nodePort: 30333
      port: 80
      targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
  matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1
        imagePullPolicy: IfNotPresent

       ports:
        - containerPort: 80
          protocol: TCP
      restartPolicy: Always
吊舱已经启动,服务也在运行

$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5d66cc795f-bgqdp   1/1     Running   0          65m
nginx-5d66cc795f-mb8qw   1/1     Running   0          65m

$ kubectl get svc
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP        13d
nginx-service   NodePort    10.104.133.199   <none>        80:30333/TCP   66m
如果我从Worker节点尝试,它工作正常,NGINX会响应。 从工作节点我可以使用IP地址:30333或主机名:30333,尽管localhost:30333不工作

我的主人和工人之间的联系似乎很好。我可以在IP地址或主机名上ping、SSH等

你知道我做错了什么吗

get节点的输出-o宽:

 $ kubectl get nodes -o wide
NAME        STATUS   ROLES    AGE   VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION   CONTAINER-RUNTIME
k8-master   Ready    master   13d   v1.17.4   192.168.178.100   <none>        Raspbian GNU/Linux 10 (buster)   4.19.97-v7+      docker://19.3.8
k8-w1       Ready    worker   13d   v1.17.4   192.168.178.101   <none>        Raspbian GNU/Linux 10 (buster)   4.19.97-v7+      docker://19.3.8
这工作正常,我可以通过这个端口从Master->Worker连接


但是NodePort服务仍然不起作用

因此,经过许多小时和几天,我想我已经找到了问题的根源

我发现这个博客:

这让我看到了这个bug报告:

因此,执行以下操作将允许连接:

sudo iptables -P FORWARD ACCEPT
但我无法在重新启动后保持这种状态(即使使用iptables persistent),我假设Docker/K8s会在启动期间和更改之后动态更新规则

这促使我进一步调查,并在Weave network文档中找到了有关使用iptables v 1.8及更高版本的主机的K8s网络问题的信息。(这似乎也适用于其他K8s网络提供商,尽管其中一些可能已经解决)。 然后,我在Weave日志文件中看到它确实拒绝了请求

因此,通过在我的节点上执行以下操作,我能够永久地工作

sudo update-alternatives --set iptables /usr/sbin/iptables-legacy

我现在可以通过我的NodePort在所有节点之间进行访问,也可以从集群外部访问所有节点。

我想您的工作IP是否正确?当您尝试从worker开始时,您是使用IP还是
localhost
?您是否可以发布
kubectl get nodes-o wide
?@Crou的输出,并用get的输出进行更新nodes@MarcABOUCHACRA:是的,那是我的工人IP。我可以使用worker IP或worker主机名,结果是一样的。但是localhost不起作用。(我相应地更新了问题)如果使用主IP会发生什么<代码>节点端口打开每个节点上的端口。由于没有说明是否只有工人,我认为没有理由不在主机上打开端口。这解决了您的问题吗?您是否检查了端口是否已打开,以允许从外部通过此端口传入流量?从worker节点运行curl时,如果没有来自worker的端口转发,您将无法访问本地主机node@MickeyHovel对此更新允许我从master worker连接到节点端口,并从我的PC从集群连接到外部节点端口。
kubectl port-forward pod/nginx-545b8fdd47-brg7r 8080:80
sudo iptables -P FORWARD ACCEPT
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy