天天看點

在kubernetes中安裝traefik2

traefik2 DaemonSet

雲原生微服務中我們使用了traefik2來作為我們的網關,當然我們也是通過DaemonSet(也可以使用deployment)的方式來部署到Kubernetes叢集中。

DaemonSet部署之後的pod有如下特征

Kubernetes叢集中的每個work node上都有這個pod(traefik2執行個體)

每個work node上隻有一個這樣的pod執行個體

當有新的work node加入Kubernetes叢集後,該pod會自動在新加入的work node上被建立出來,而當舊的work node被删除後,它上面的pod也會被相應的删除掉。

比如我們的traefik2的DaemonSet像下面這樣

在kubernetes中安裝traefik2

需要注意的是args從configMap中引入了4個變量,其值分别如下:

# 通路http端口
web_port=80

# 通路https端口
websecure_port=443

# traefik dashborad端口(預設)
traefik_port=8080

# 監控哪個namespace資源,如果有多個,則以逗号連接配接。預設是所有namespace
watch_namespace=exmpale-beta
           

如果你使用DaemonSet的方式安裝兩個相同的traefik,那麼上面提及到的4個變量都要進行對應的修改

一個traefik提供對内服務的通路,一個traefik提供對外服務的通路

使用了kubernetes,流量路由就如下所示

internet
        |
   [ Ingress ]
   --|-----|--
   [ Services ]

           

這裡定義的80/443端口就是外部的請求要通過這兩個端口才能轉發到Service(kubernetes)中。

指定關注的的namespace

如果我們不指定traefik2監控的是哪個namespace的資源(預設是所有的),那麼當我們通路的時候就可能通路到其他namespace的資源

curl -H 'Host: www.example-beta.com' www.example-rc.com
           

example-beta.com部署在example-beta這個namespace,而example-rc.com部署在example-rc這個namespace,但是通過上面的通路方式就能通路到example-beta的資源,很明顯這并不安全。

在kubernetes中安裝traefik2

traefik ingress解析規則是根據Host頭來解析的,如果我們偷天換日就會導緻通路了另外一個namespace的資源。

關于traefik ingress route我在下面還會提及

使用traefik2 IngressRoute代替Kubernetes Ingress

traefik2不僅可以作為網關,它還可以作為ingress controller(另一個比較出名的的nginx),有了它我們需要使用ingress route來配置我們的比對規則而不再使用kubernetes的ingress。

之前kubernetes 的ingress規則是這樣的

在kubernetes中安裝traefik2

而使用了ingress route之後則是這樣的

在kubernetes中安裝traefik2

為什麼需要CRD?

IngressRoute這個Kind是traefik提供的,kubernetes并不認識它呀,不過還好kubernetes支援CRD(Custom Resource Definitions)。我們隻需要加上CRD即可。

所有關于kubernetes的CRD配置請參考官方文檔: https://docs.traefik.io/reference/dynamic-configuration/kubernetes-crd/

通路叢集資源(RBAC)

這裡着重需要說明的是RBAC: 基于角色的通路控制(Role-Based Access Control)的配置

在kubernetes中安裝traefik2
在kubernetes中安裝traefik2

RBAC實際上很簡單,想想平時做的業務系統,你隻要知道下面這幾個概念你就知道了。

Kubernetes中的service,ingress,configmap,secret等都是資源,一般是一個賬号,屬于什麼角色,這個角色可以操控哪些資源

比如HR可以檢視員工工資,而員工隻能知道自己的工資

是以Kubernetes中也存在着三個基本概念

  1. Role : 角色,它其實是一組規則,定義了一組對Kubernetes API對象的操作權限
  2. Subject:被作用者,既可以是“人”,也可以是“機器”,也可以使你在Kubernetes裡定義的“用

    戶”。

  3. RoleBinding:定義了“被作用者”和“角色”的綁定關系
在kubernetes中安裝traefik2

Role對象的rules字段,就是它所定義的權限規則。在上面的例子裡,這條規則的含義就是:允許“被作用者”,對mynamespace下面的Pod對象,進行GET、WATCH和LIST操作。

RoleBinding對象裡定義了一個subjects字段,即“被作用者”。它的類型是User,即Kubernetes裡的使用者。這個使用者的名字是example-user。

這裡的User實際上是Kubernetes的内置賬戶ServiceAccount。

在Kubernetes中Role和RoleBinding對象都是Namespaced對象,它們對權限的限制規則僅在它們自己的Namespace内有效。 對于非Namespaced(Non-namespaced)對象(比如:Node),或者,某一個Role想要作用于所有的Namespace的時候,就需要使用ClusterRole和ClusterRoleBinding這兩個組合了。(也就是我們上面貼出來的配置)

至此,traefik2已經安裝完畢。

總結

對應安裝第三方提供的元件,安裝是存在固定流程的。

  1. 使用DaemonSet/Deployment的方式安裝
  2. 指定CRD
  3. 指定RBAC

對于traefik2而已,如果你想要在work node上安裝兩個traefik(一個對内,一個對外),那麼你至少需要改變三個端口。

繼續閱讀