在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像下面這樣

traefik-ds.png

需要注意的是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的資源,很明顯這並不安全。

traefik-ingressroute-1.png

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

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

使用traefik2 IngressRoute代替Kubernetes Ingress

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

之前kubernetes 的ingress規則是這樣的

ingress.png

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

traefik-ingressroute-2.png

爲什麼需要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)的配置

traefik-cluster-role.png

traefik-cluster-role-binding-user.png

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

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

比如HR可以查看員工工資,而員工只能知道自己的工資

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

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

role-binding-user.png

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(一個對內,一個對外),那麼你至少需要改變三個端口。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章