簡體   English   中英

SuSE 上的 Kubernetes:NodePort 服務問題

[英]Kubernetes on SuSE: NodePort Service Problems

在 openSUSE Leap 15.3 上運行 Kubernetes 時,我試圖追蹤有關 NodePort 服務的奇怪行為。

為了在我自己的服務器上進行測試,我使用 openSUSE 15.3 安裝了 3 個 VM。 附上這篇文章: 如何在 Suse Linux 企業服務器 15 虛擬機中安裝 kubernetes? 我設置了這個 Kubernetes 集群:

kubix01:~ # k get nodes -o wide
NAME      STATUS   ROLES                  AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION         CONTAINER-RUNTIME
kubix01   Ready    control-plane,master   25h   v1.22.2   192.168.42.51   <none>        openSUSE Leap 15.3   5.3.18-59.27-default   docker://20.10.6-ce
kubix02   Ready    <none>                 25h   v1.22.2   192.168.42.52   <none>        openSUSE Leap 15.3   5.3.18-59.27-default   docker://20.10.6-ce
kubix03   Ready    <none>                 25h   v1.22.2   192.168.42.53   <none>        openSUSE Leap 15.3   5.3.18-59.27-default   docker://20.10.6-ce

為了進行測試,我使用這個 yaml 為 traefik/whoami 映像創建了一個新的 3 副本部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami
  labels:
    app: whoami
spec:
  replicas: 3
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
      - name: whoami
        image: traefik/whoami
        ports:
        - containerPort: 80

這會導致三個 Pod 按預期分布在 2 個工作節點上:

kubix01:~/k8s/whoami # k get pods -o wide
NAME                      READY   STATUS    RESTARTS      AGE   IP           NODE      NOMINATED NODE   READINESS GATES
whoami-8557b59f65-2qkvq   1/1     Running   2 (24h ago)   25h   10.244.2.7   kubix03   <none>           <none>
whoami-8557b59f65-4wnmd   1/1     Running   2 (24h ago)   25h   10.244.1.6   kubix02   <none>           <none>
whoami-8557b59f65-xhx5x   1/1     Running   2 (24h ago)   25h   10.244.1.7   kubix02   <none>           <none>

之后,我創建了一個 NodePort 服務,用這個 yaml 向世界提供東西:

apiVersion: v1
kind: Service
metadata:
  name: whoami
spec:
  type: NodePort
  selector:
    app: whoami
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 80
      nodePort: 30080

這是結果:

kubix01:~/k8s/whoami # k get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          25h
whoami       NodePort    10.105.214.86   <none>        8080:30080/TCP   25h

kubix01:~/k8s/whoami # k describe svc whoami
Name:                     whoami
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 app=whoami
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.105.214.86
IPs:                      10.105.214.86
Port:                     <unset>  8080/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30080/TCP
Endpoints:                10.244.1.6:80,10.244.1.7:80,10.244.2.7:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

所以一切看起來都很好,我用 curl 測試了一些東西:

  1. 在一個集群節點上 curl 到 PodIP:PodPort
kubix01:~/k8s/whoami # curl 10.244.1.6
Hostname: whoami-8557b59f65-4wnmd
IP: 127.0.0.1
IP: 10.244.1.6
RemoteAddr: 10.244.0.0:50380
GET / HTTP/1.1
Host: 10.244.1.6
User-Agent: curl/7.66.0
Accept: */*

kubix01:~/k8s/whoami # curl 10.244.1.7
Hostname: whoami-8557b59f65-xhx5x
IP: 127.0.0.1
IP: 10.244.1.7
RemoteAddr: 10.244.0.0:36062
GET / HTTP/1.1
Host: 10.244.1.7
User-Agent: curl/7.66.0
Accept: */*

kubix01:~/k8s/whoami # curl 10.244.2.7
Hostname: whoami-8557b59f65-2qkvq
IP: 127.0.0.1
IP: 10.244.2.7
RemoteAddr: 10.244.0.0:43924
GET / HTTP/1.1
Host: 10.244.2.7
User-Agent: curl/7.66.0
Accept: */*

==> 一切都按預期進行

  1. 在集群節點上卷曲以服務 ClusterIP:ClusterPort:
kubix01:~/k8s/whoami # curl 10.105.214.86:8080
Hostname: whoami-8557b59f65-xhx5x
IP: 127.0.0.1
IP: 10.244.1.7
RemoteAddr: 10.244.0.0:1106
GET / HTTP/1.1
Host: 10.105.214.86:8080
User-Agent: curl/7.66.0
Accept: */*

kubix01:~/k8s/whoami # curl 10.105.214.86:8080
Hostname: whoami-8557b59f65-4wnmd
IP: 127.0.0.1
IP: 10.244.1.6
RemoteAddr: 10.244.0.0:9707
GET / HTTP/1.1
Host: 10.105.214.86:8080
User-Agent: curl/7.66.0
Accept: */*

kubix01:~/k8s/whoami # curl 10.105.214.86:8080
Hostname: whoami-8557b59f65-2qkvq
IP: 127.0.0.1
IP: 10.244.2.7
RemoteAddr: 10.244.0.0:25577
GET / HTTP/1.1
Host: 10.105.214.86:8080
User-Agent: curl/7.66.0
Accept: */*

==> 一切正常,流量負載均衡到不同的 pod。

  1. 在集群節點上卷曲到 NodeIP:NodePort
kubix01:~/k8s/whoami # curl 192.168.42.51:30080
Hostname: whoami-8557b59f65-2qkvq
IP: 127.0.0.1
IP: 10.244.2.7
RemoteAddr: 10.244.0.0:5463
GET / HTTP/1.1
Host: 192.168.42.51:30080
User-Agent: curl/7.66.0
Accept: */*

kubix01:~/k8s/whoami # curl 192.168.42.52:30080
^C [NoAnswer]
kubix01:~/k8s/whoami # curl 192.168.42.53:30080
^C [NoAnswer]

==> NodePort 服務只在同一個節點上工作,其他節點沒有響應

  1. 從另一個網絡主機卷曲到 NodeIP:NodePort
user@otherhost:~$ curl 192.168.42.51:30080
^C [NoAnswer]
user@otherhost:~$ curl 192.168.42.52:30080
^C [NoAnswer]
user@otherhost:~$ curl 192.168.42.53:30080
^C [NoAnswer]

==> 服務根本無法從外部訪問,所有節點都沒有應答

有人知道這里出了什么問題嗎?

提前謝謝

貓貓

PS:另外這里有一張小圖片,可以讓你更清楚地了解一些東西。 紅色彎曲箭頭是非工作連接,格力彎曲箭頭是工作連接:

圖表

終於找到了解決辦法:

SUSE 關於 ip_forward sysctl 設置的奇怪行為。 在 OS 安裝期間,安裝程序中激活了選項“IPv4 轉發”。 安裝OS后,在/etc/sysctl.conf中另外增加了“net.ipv4.ip_forward = 1”和“net.ipv4.conf.all.forwarding = 1”。 選中“sysctl -l|grep ip_forward”后,兩個選項都已激活,但這顯然不是事實。 找到文件“/etc/sysctl.d/70-yast.conf”...這里兩個選項都設置為0,這顯然是事實。 但是在這個文件中手動將這些選項設置為 1 仍然不夠......使用 SUSEs YAST 工具並輸入“系統/網絡設置”-> 路由可以看到選項“啟用 IPv4 轉發”,該選項已被選中(記住:在 70-yast.conf 中,這些選項設置為 0)。 在使用了 YAST 中的選項后,70-yast.conf 被重寫,並且兩個選項在 70-yast.conf 中都設置為 1,NodePort 服務現在按預期工作。

結論:

恕我直言,這似乎是 SUSE 中的一個錯誤...在安裝過程中激活“IPv4 轉發”會導致 70-yast.conf 並禁用轉發選項。 作為一個加號,“sysctl -l”顯示錯誤的設置,就像 YAST 一樣......解決方案是在 YAST 的網絡設置中進行操作,以便使用激活的 ip_forwarding 選項重寫 70-yast.conf。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM