天天看點

K3S Helm 高可用安裝 rancher 修改80和443端口K3S Helm 高可用安裝 rancher 修改80和443端口(k8s同理)

K3S Helm 高可用安裝 rancher 修改80和443端口(k8s同理)

請注意,本文是基于預設K3S安裝了Traefik的基礎上來寫的。如果是使用自定義的IngressController,僅作參考,不過也具備參考意義。

某些時候,我們需要修改rancher的預設端口。

如果是單機安裝,直接docker的-p就可以解決,因為這個時候,docker容器直接接管了流量。

但是高可用部署,由于是部署在K3S環境中,是以,不能簡單的處理。必須通過修改K3S叢集的流量控制入口(說白了,就是Ingress和LoadBanlencer)來處理。這個時候rancher是叢集内部的一個POD而已,是以它自己不用修改端口。

這裡,必須先搞清楚(我花了很多時間搞清楚)K3S的流量控制藝術,在搞清楚藝術之前,還得了解Ingress和IngressController,針對Ingress和IngressController,寫的最好的文章是我認為寫的最好的一篇。

有了Ingress和IngressController的認知之後,我們來看K3S的流量藝術。

  1. K3S預設會安裝Traefik作為IngressController,接管叢集内80和443的流量。如果看到寫的最好的文章,我們就知道,一般情況下,其實IngressController本身并不會(除非特殊的啟用hostPort)并不會在主機上監聽端口,它依然屬于叢集内部。
  2. 從寫的最好的文章我們知道,讓IngressController能夠對外服務,可以有三種做法:1)給IngressController開一個NodePort服務;2)IngressController作為DaemonSet部署,暴露hostPort;3)給IngressController暴露一個LoadBalancer服務;

    其實說白了,就是想辦法讓IngressController這個容器,能夠對外暴露服務端口。

    不過,K3S沒有采用上面三種做法,它使用了一個特别的辦法,在官網我們可以得知(官網中文翻譯根本看不懂,難啃),它采用了

    DaemonSet部署特殊的Klipper Load Balancer程序的方式,來給Traefik Ingress Controller提供流量導入

  3. 2所述的流量導入,可以簡單圖解為:

    [client]-->(主機port)<--iptables監聽-->[DaemonSet-Klipper]--iptables轉發-->[叢集内Traefik]

    也就是說,K3S通過在每個節點部署Klipper,然後以iptables路由的方式,将節點流量轉發到内部的IngressController。
  4. 我們可以在節點中通過

    k3s kubectl get svc -n kube-system

    k3s kubectl get pods -n kube-system

    k3s kubectl get daemonset -n kube-system

    k3s kubectl edit daemonset svclb-traefik -n kube-system

    逐一驗證2中所述的官網描述以及通過寫的最好的文章所了解到的資訊

有了上面的藝術刨析,我們就知道,端口的改造,重點是修改 Daemonset:svclb-traefik,我們從Klipper的github核心檔案可以了解到,它是通過iptables來處理流量的。裡面使用了一些環境變量來設定入口端口和轉發資訊

于是:

  1. k3s kubectl edit daemonset svclb-traefik -n kube-system
  2. 修改裡面的環境變量端口以及容器端口,其中DEST_IP和DEST_PORT代表的是叢集内部的Traefik的ServiceIP和端口。其他的就不用細講了。
  3. 等待相關POD自動更新

或者,因為了解了剛才的藝術過程。

同樣是在官網-ServiceLB如何工作這一節,我們可以得知——由于它使用了

Klipper Load Balancer

,是以,你在K3S上建立一個

L4負載均衡(即type: LoadBalancer服務)

,K3S會自動啟動一個Klipper Load Balancer,在主機上打開L4負載均衡中設定的服務端口,通過iptables轉發你的請求到這個L4負載均衡上面,然後由L4負載均衡再轉發到配置的内部端口上。基于這個資訊,那麼

  1. 打開服務發現,建立一個L4負載均衡,其目标選擇POD:traefik
  2. 設定L4負載均衡的服務端口為需要的端口
  3. 儲存,等待K3S自動建構svclb-traefik-xxxx

繼續閱讀