Kubernetes 部署 Ingress 控制器 Traefik v2.1
目錄[-]
- . 一、Traefik 簡介
- . 二、Kubernetes 部署 Traefik
- . 1、創建 CRD 資源
- . 2、創建 RBAC 權限
- . 3、創建 Traefik 配置文件
- . 4、節點設置 Label 標簽
- . 5、Kubernetes 部署 Traefik
- . 三、Traefik 路由規則配置
- . 1、配置 HTTP 路由規則 (Traefik Dashboard 為例)
- . 2、配置 HTTPS 路由規則(Kubernetes Dashboard 為例)
系統環境:
- Traefik 版本:v2.1.2
- Kubernetes 版本:1.16.3
地址:
- Traefik 2.1 官方文檔:https://docs.traefik.io/v2.1/
- 部署文件的 Github 地址:https://github.com/my-dlq/blog-example/tree/master/kubernetes/traefik-v2.1-deploy
一、Traefik 簡介
Traefik 最新推出了 v2.1 版本,這里將 Traefik 升級到最新版本,簡單的介紹了下如何在 Kubernetes 環境下安裝 Traefik v2.1,下面將介紹如何在 Kubernetes 環境下部署并配置 Traefik v2.1。
二、Kubernetes 部署 Traefik
注意:這里 Traefik 是部署在 Kube-system Namespace 下,如果不是需要修改下面部署文件中的 Namespace 屬性。
1、創建 CRD 資源
在 traefik v2.1 版本后,開始使用 CRD(Custom Resource Definition)來完成路由配置等,所以需要提前創建 CRD 資源。
創建 traefik-crd.yaml 文件
## IngressRoute apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata:name: ingressroutes.traefik.containo.us spec:scope: Namespacedgroup: traefik.containo.usversion: v1alpha1names:kind: IngressRouteplural: ingressroutessingular: ingressroute --- ## IngressRouteTCP apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata:name: ingressroutetcps.traefik.containo.us spec:scope: Namespacedgroup: traefik.containo.usversion: v1alpha1names:kind: IngressRouteTCPplural: ingressroutetcpssingular: ingressroutetcp --- ## Middleware apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata:name: middlewares.traefik.containo.us spec:scope: Namespacedgroup: traefik.containo.usversion: v1alpha1names:kind: Middlewareplural: middlewaressingular: middleware --- ## TLSOption apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata:name: tlsoptions.traefik.containo.us spec:scope: Namespacedgroup: traefik.containo.usversion: v1alpha1names:kind: TLSOptionplural: tlsoptionssingular: tlsoption --- ## TraefikService apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata:name: traefikservices.traefik.containo.us spec:scope: Namespacedgroup: traefik.containo.usversion: v1alpha1names:kind: TraefikServiceplural: traefikservicessingular: traefikservice創建 Traefik CRD 資源
$ kubectl apply -f traefik-crd.yaml2、創建 RBAC 權限
Kubernetes 在 1.6 版本中引入了基于角色的訪問控制(RBAC)策略,方便對 Kubernetes 資源和 API 進行細粒度控制。Traefik 需要一定的權限,所以這里提前創建好 Traefik ServiceAccount 并分配一定的權限。
創建 traefik-rbac.yaml 文件
## ServiceAccount apiVersion: v1 kind: ServiceAccount metadata:namespace: kube-systemname: traefik-ingress-controller --- ## ClusterRole kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata:name: traefik-ingress-controller rules:- apiGroups: [""]resources: ["services","endpoints","secrets"]verbs: ["get","list","watch"]- apiGroups: ["extensions"]resources: ["ingresses"]verbs: ["get","list","watch"]- apiGroups: ["extensions"]resources: ["ingresses/status"]verbs: ["update"]- apiGroups: ["traefik.containo.us"]resources: ["middlewares"]verbs: ["get","list","watch"]- apiGroups: ["traefik.containo.us"]resources: ["ingressroutes"]verbs: ["get","list","watch"]- apiGroups: ["traefik.containo.us"]resources: ["ingressroutetcps"]verbs: ["get","list","watch"]- apiGroups: ["traefik.containo.us"]resources: ["tlsoptions"]verbs: ["get","list","watch"]- apiGroups: ["traefik.containo.us"]resources: ["traefikservices"]verbs: ["get","list","watch"] --- ## ClusterRoleBinding kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata:name: traefik-ingress-controller roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: traefik-ingress-controller subjects:- kind: ServiceAccountname: traefik-ingress-controllernamespace: kube-system創建 Traefik RBAC 資源
- -n:指定部署的 Namespace
3、創建 Traefik 配置文件
由于 Traefik 配置很多,通過 CLI 定義不是很方便,一般時候選擇將其配置選項放到配置文件中,然后存入 ConfigMap,將其掛入 traefik 中。
創建 traefik-config.yaml 文件
kind: ConfigMap apiVersion: v1 metadata:name: traefik-config data:traefik.yaml: |-ping: "" ## 啟用 PingserversTransport:insecureSkipVerify: true ## Traefik 忽略驗證代理服務的 TLS 證書api:insecure: true ## 允許 HTTP 方式訪問 APIdashboard: true ## 啟用 Dashboarddebug: false ## 啟用 Debug 調試模式metrics:prometheus: "" ## 配置 Prometheus 監控指標數據,并使用默認配置entryPoints:web:address: ":80" ## 配置 80 端口,并設置入口名稱為 webwebsecure:address: ":443" ## 配置 443 端口,并設置入口名稱為 websecureproviders:kubernetesCRD: "" ## 啟用 Kubernetes CRD 方式來配置路由規則kubernetesIngress: "" ## 啟動 Kubernetes Ingress 方式來配置路由規則log:filePath: "" ## 設置調試日志文件存儲路徑,如果為空則輸出到控制臺level: error ## 設置調試日志級別format: json ## 設置調試日志格式accessLog:filePath: "" ## 設置訪問日志文件存儲路徑,如果為空則輸出到控制臺format: json ## 設置訪問調試日志格式bufferingSize: 0 ## 設置訪問日志緩存行數filters:#statusCodes: ["200"] ## 設置只保留指定狀態碼范圍內的訪問日志retryAttempts: true ## 設置代理訪問重試失敗時,保留訪問日志minDuration: 20 ## 設置保留請求時間超過指定持續時間的訪問日志fields: ## 設置訪問日志中的字段是否保留(keep 保留、drop 不保留)defaultMode: keep ## 設置默認保留訪問日志字段names: ## 針對訪問日志特別字段特別配置保留模式ClientUsername: drop headers: ## 設置 Header 中字段是否保留defaultMode: keep ## 設置默認保留 Header 中字段names: ## 針對 Header 中特別字段特別配置保留模式User-Agent: redactAuthorization: dropContent-Type: keep創建 Traefik ConfigMap 資源
- -n: 指定程序啟的 Namespace
4、節點設置 Label 標簽
由于是 Kubernetes DeamonSet 這種方式部署 Traefik,所以需要提前給節點設置 Label,這樣當程序部署時 Pod 會自動調度到設置 Label 的節點上。
節點設置 Label 標簽
- 格式:kubectl label nodes [節點名] [key=value]
查看節點是否設置 Label 成功
$ kubectl get nodes --show-labelsNAME STATUS ROLES VERSION LABELS k8s-master-2-11 Ready master v1.16.3 kubernetes.io/hostname=k8s-master-2-11,node-role.kubernetes.io/master= k8s-node-2-12 Ready <none> v1.16.3 kubernetes.io/hostname=k8s-node-2-12,IngressProxy=true k8s-node-2-13 Ready <none> v1.16.3 kubernetes.io/hostname=k8s-node-2-13 k8s-node-2-14 Ready <none> v1.16.3 kubernetes.io/hostname=k8s-node-2-14如果想刪除標簽,可以使用?kubectl label nodes k8s-node-2-12 IngressProxy-?命令
5、Kubernetes 部署 Traefik
一樣,用 DaemonSet 方式部署,便于在多服務器間擴展,用 hostport 方式占用服務器 80、443 端口,方便流量進入。
創建 traefik 部署文件 traefik-deploy.yaml
apiVersion: v1 kind: Service metadata:name: traefik spec:ports:- name: webport: 80- name: websecureport: 443- name: adminport: 8080selector:app: traefik --- apiVersion: apps/v1 kind: DaemonSet metadata:name: traefik-ingress-controllerlabels:app: traefik spec:selector:matchLabels:app: traefiktemplate:metadata:name: traefiklabels:app: traefikspec:serviceAccountName: traefik-ingress-controllerterminationGracePeriodSeconds: 1containers:- image: traefik:v2.1.2name: traefik-ingress-lbports:- name: webcontainerPort: 80hostPort: 80 ## 將容器端口綁定所在服務器的 80 端口- name: websecurecontainerPort: 443hostPort: 443 ## 將容器端口綁定所在服務器的 443 端口- name: admincontainerPort: 8080 ## Traefik Dashboard 端口resources:limits:cpu: 2000mmemory: 1024Mirequests:cpu: 1000mmemory: 1024MisecurityContext:capabilities:drop:- ALLadd:- NET_BIND_SERVICEargs:- --configfile=/config/traefik.yamlvolumeMounts:- mountPath: "/config"name: "config"volumes:- name: configconfigMap:name: traefik-config tolerations: ## 設置容忍所有污點,防止節點被設置污點- operator: "Exists"nodeSelector: ## 設置node篩選器,在特定label的節點上啟動IngressProxy: "true"Kubernetes 部署 Traefik
$ kubectl apply -f traefik-deploy.yaml -n kube-system到此 Traefik v2.1 應用已經部署完成。
三、Traefik 路由規則配置
1、配置 HTTP 路由規則 (Traefik Dashboard 為例)
Traefik 應用已經部署完成,但是想讓外部訪問 Kubernetes 內部服務,還需要配置路由規則,這里開啟了 Traefik Dashboard 配置,所以首先配置 Traefik Dashboard 看板的路由規則,使外部能夠訪問 Traefik Dashboard。
創建 Traefik Dashboard 路由規則文件 traefik-dashboard-route.yaml
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata:name: traefik-dashboard-route spec:entryPoints:- webroutes:- match: Host(`traefik.mydlq.club`)kind: Ruleservices:- name: traefikport: 8080創建 Traefik Dashboard 路由規則對象
$ kubectl apply -f traefik-dashboard-route.yaml -n kube-system接下來配置 Hosts,客戶端想通過域名訪問服務,必須要進行 DNS 解析,由于這里沒有 DNS 服務器進行域名解析,所以修改 hosts 文件將 Traefik 指定節點的 IP 和自定義 host 綁定。打開電腦的 Hosts 配置文件,往其加入下面配置:
192.168.2.12 traefik.mydlq.club配置完成后,打開瀏覽器輸入地址:http://traefik.mydlq.club?打開 Traefik Dashboard。
?
2、配置 HTTPS 路由規則(Kubernetes Dashboard 為例)
這里我們創建 Kubernetes 的 Dashboard 看板,它是 Https 協議方式,由于它是需要使用 Https 請求,所以我們配置基于 Https 的路由規則并指定證書。
創建證書文件
# 創建自簽名證書 $ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=cloud.mydlq.club"# 將證書存儲到 Kubernetes Secret 中 $ kubectl create secret generic cloud-mydlq-tls --from-file=tls.crt --from-file=tls.key -n kube-system創建 Traefik Dashboard 路由規則文件 kubernetes-dashboard-route.yaml
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata:name: kubernetes-dashboard-route spec:entryPoints:- websecuretls:secretName: cloud-mydlq-tlsroutes:- match: Host(`cloud.mydlq.club`) kind: Ruleservices:- name: kubernetes-dashboardport: 443創建 Kubernetes Dashboard 路由規則對象
$ kubectl apply -f kubernetes-dashboard-route.yaml -n kube-system跟上面一樣,配置 Hosts 文件
192.168.2.12 cloud.mydlq.club配置完成后,打開瀏覽器輸入地址:https://cloud.mydlq.club?打開 Dashboard Dashboard。
?
到此文章結束,可以訪問我的 Github 下載?部署文件,別忘點顆 Start!!
總結
以上是生活随笔為你收集整理的Kubernetes 部署 Ingress 控制器 Traefik v2.1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多态的调用方法
- 下一篇: linux 程序占内存,linux下,一