我在Raspberry Pi上设置了一个小型Kubernetes集群,该集群目前由1个Master和1个Worker组成。我已经创建了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

PODS已启动并正在运行,服务也已启动
$ 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

但是我无法从主节点访问NGINX。
curl http://192.168.178.101:30333
curl: (7) Failed to connect to 192.168.178.101 port 30333: Connection timed out

如果我在Worker节点上尝试正常,NGINX会响应。
尽管本地主机:30333不起作用,但我可以从工作节点使用IP地址:30333或主机名:30333!

从我的主人到 worker 的连接似乎很好。我可以在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

describe service的输出:
$ kubectl describe service nginx-service
Name:                     nginx-service
Namespace:                default
Labels:                   app=nginx
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"nginx-service","namespace":"default"},"s...
Selector:                 app=nginx
Type:                     NodePort
IP:                       10.104.133.199
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30333/TCP
Endpoints:                10.44.0.1:80,10.44.0.2:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

更新:
我在NodePort 30333上尝试了一个简单的Telnet命令到Worker。但是出现连接超时错误。

因此,然后,我删除了NodePort服务,并尝试了一个简单的Port forward命令
kubectl port-forward pod/nginx-545b8fdd47-brg7r 8080:80

这个工作正常,我可以通过此端口从Master-> Worker连接。

但是NodePort服务仍然无法正常工作!

最佳答案

因此,经过许多小时和几天的努力,我认为我已经找到了问题的根源。

我找到了这个博客:
https://limpygnome.com/2019/09/21/raspberry-pi-kubernetes-cluster/

这导致我收到此错误报告:
https://github.com/kubernetes-sigs/kubespray/issues/4674

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

sudo iptables -P FORWARD ACCEPT

但是我认为重启后(即使使用iptables-persistent)也无法坚持下去,我假设规则是在启动期间和更改后由Docker/K8s动态更新的。

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

因此,通过在我的节点上执行以下命令,我可以使它永久运行。
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy

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

关于kubernetes - 无法访问RPI上运行的K8集群中的NGINX nodePort服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61011414/

10-09 06:47