國美&華為,戰略合作簽約!
945
2025-04-03
前言
核心概念
1、Edge Router
2、Auto Service Discovery
前言
核心概念
1、Edge Router
2、Auto Service Discovery
安裝
1、創建 CRD 資源
2、創建 RBAC 權限
3、創建 Traefik 配置文件
4、節點設置 Label 標簽
5、安裝 Kubernetes Gateway CRD 資源
6、Kubernetes 部署 Traefik
配置HTTP路由規則
路由規則應用
第一步,配置 Host 文件
第二步,訪問對應應用
前言
Traefik 是一個開源的可以使服務發布變得輕松有趣的邊緣路由器。它負責接收你系統的請求,然后使用合適的組件來對這些請求進行處理。
與眾不同之處在于,除了它的許多特性之外,它還可以自動為您的服務發現正確的配置。當 Traefik 檢查您的基礎設施時,它會發現相關信息,并發現哪個服務為哪個請求提供服務。
Traefik 與每個主要的集群技術都是原生兼容的,比如 Kubernetes、Docker、Docker Swarm、AWS、Mesos、Marathon 等等;并且可以同時處理多個。(它甚至適用于運行在裸機上的遺留軟件。) 使用 Traefik,不需要維護和同步單獨的配置文件:所有事情都是實時自動發生的(沒有重啟,沒有連接中斷)。使用 Traefik,只需要花費時間開發和部署新功能到您的系統,而不是配置和維護其工作狀態。
核心概念
1、Edge Router
Traefik 是一個邊緣路由器,是你整個平臺的大門,攔截并路由每個傳入的請求:它知道所有的邏輯和規則,這些規則確定哪些服務處理哪些請求;
2、Auto Service Discovery
傳統的反向代理需要一個配置文件,其中包含路由到你服務的所有可能路由,而 Traefik 會實時檢測服務并自動更新路由規則,可以自動服務發現。部署服務時,附加一些信息,告訴 Traefik 服務可以處理的請求的特征。
這意味著當一個服務被部署時,Traefik 會立即檢測到它并實時更新路由規則。恰恰相反: 當您從基礎設施中移除一項服務時,該路由將相應地消失。
首先,當啟動 Traefik 時,需要定義 entrypoints(入口點),然后,根據連接到這些 entrypoints 的路由來分析傳入的請求,來查看他們是否與一組規則相匹配,如果匹配,則路由可能會將請求通過一系列中間件轉換過后再轉發到你的服務上去。在了解 Traefik 之前有幾個核心概念我們必須要了解:
Providers 用來自動發現平臺上的服務,可以是編排工具、容器引擎或者 key-value 存儲等,比如 Docker、Kubernetes、File;
Entrypoints 監聽傳入的流量(端口等…),是網絡入口點,它們定義了接收請求的端口(HTTP 或者 TCP);
Routers 分析請求(host, path, headers, SSL, …),負責將傳入請求連接到可以處理這些請求的服務上去;
Services 將請求轉發給你的應用(load balancing, …),負責配置如何獲取最終將處理傳入請求的實際服務;
Middlewares 中間件,用來修改請求或者根據請求來做出一些判斷(authentication, rate limiting, headers, …),中間件被附件到路由上,是一種在請求發送到你的服務之前(或者在服務的響應發送到客戶端之前)調整請求的一種方法。
安裝
1、創建 CRD 資源
創建 traefik-crd.yaml 文件
apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: ingressroutes.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: IngressRoute plural: ingressroutes singular: ingressroute scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: middlewares.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: Middleware plural: middlewares singular: middleware scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: ingressroutetcps.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: IngressRouteTCP plural: ingressroutetcps singular: ingressroutetcp scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: ingressrouteudps.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: IngressRouteUDP plural: ingressrouteudps singular: ingressrouteudp scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: tlsoptions.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: TLSOption plural: tlsoptions singular: tlsoption scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: tlsstores.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: TLSStore plural: tlsstores singular: tlsstore scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: traefikservices.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: TraefikService plural: traefikservices singular: traefikservice scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: serverstransports.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: ServersTransport plural: serverstransports singular: serverstransport scope: Namespaced
注意:這里 Traefik 是部署在 default Namespace 下,如果不想部署到配置的 Namespace,需要修改下面部署文件中的 Namespace 參數。
創建資源:
$ kubectl apply -f traefik-crd.yaml
2、創建 RBAC 權限
Kubernetes 在 1.6 版本中引入了基于角色的訪問控制(RBAC)策略,方便對 Kubernetes 資源和 API 進行細粒度控制。Traefik 需要一定的權限,所以,這里提前創建好 Traefik ServiceAccount 并分配一定的權限。
創建 traefik-rbac.yaml 文件:
## ServiceAccount apiVersion: v1 kind: ServiceAccount metadata: namespace: default name: traefik-ingress-controller --- ## ClusterRole kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller namespace: default rules: - apiGroups: - "" resources: - services - endpoints - secrets verbs: - get - list - watch - apiGroups: - extensions - networking.k8s.io resources: - ingresses - ingressclasses verbs: - get - list - watch - apiGroups: - extensions - networking.k8s.io resources: - ingresses/status verbs: - update - apiGroups: - traefik.containo.us resources: - ingressroutes - ingressroutetcps - ingressrouteudps - middlewares - tlsoptions - tlsstores - traefikservices - serverstransports verbs: - get - list - watch - apiGroups: - networking.x-k8s.io resources: - gatewayclasses - gatewayclasses/status - gateways verbs: - get - list - watch - apiGroups: - networking.x-k8s.io resources: - gatewayclasses/status verbs: - get - patch - update - apiGroups: - networking.x-k8s.io resources: - gateways/status verbs: - get - patch - update - apiGroups: - networking.x-k8s.io resources: - httproutes verbs: - create - delete - get - list - patch - update - watch - apiGroups: - networking.x-k8s.io resources: - httproutes/status verbs: - get - patch - update --- ## ClusterRoleBinding kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: traefik-ingress-controller subjects: - kind: ServiceAccount name: traefik-ingress-controller namespace: default
創建資源:
kubectl apply -f traefik-rbac.yaml
3、創建 Traefik 配置文件
由于 Traefik 配置很多,通過 CLI 定義不是很方便,一般時候都會通過配置文件配置 Traefik 參數,然后存入 ConfigMap,將其掛入 Traefik 中。
創建 traefik-config.yaml 文件
kind: ConfigMap apiVersion: v1 metadata: name: traefik-config data: traefik.yaml: |- ping: "" ## 啟用 Ping serversTransport: insecureSkipVerify: true ## Traefik 忽略驗證代理服務的 TLS 證書 api: insecure: true ## 允許 HTTP 方式訪問 API dashboard: true ## 啟用 Dashboard debug: false ## 啟用 Debug 調試模式 metrics: prometheus: "" ## 配置 Prometheus 監控指標數據,并使用默認配置 entryPoints: web: address: ":80" ## 配置 80 端口,并設置入口名稱為 web websecure: address: ":443" ## 配置 443 端口,并設置入口名稱為 websecure providers: kubernetesCRD: "" ## 啟用 Kubernetes CRD 方式來配置路由規則 kubernetesIngress: "" ## 啟用 Kubernetes Ingress 方式來配置路由規則 kubernetesGateway: "" ## 啟用 Kubernetes Gateway API experimental: kubernetesGateway: true ## 允許使用 Kubernetes Gateway API 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: redact Authorization: drop Content-Type: keep #tracing: ## 鏈路追蹤配置,支持 zipkin、datadog、jaeger、instana、haystack 等 # serviceName: ## 設置服務名稱(在鏈路追蹤端收集后顯示的服務名) # zipkin: ## zipkin配置 # sameSpan: true ## 是否啟用 Zipkin SameSpan RPC 類型追蹤方式 # id128Bit: true ## 是否啟用 Zipkin 128bit 的跟蹤 ID # sampleRate: 0.1 ## 設置鏈路日志采樣率(可以配置0.0到1.0之間的值) # httpEndpoint: http://localhost:9411/api/v2/spans ## 配置 Zipkin Server 端點
創建資源:
kubectl apply -f traefik-config.yaml
4、節點設置 Label 標簽
由于是 Kubernetes DeamonSet 這種方式部署 Traefik,所以需要提前給節點設置 Label,這樣當程序部署時會自動調度到設置 Label 的節點上。
格式:kubectl label nodes [節點名] [key=value]
~ kubectl label nodes s6 IngressProxy=true node/s6 labeled
查看節點是否設置 Label 成功:
~ kubectl get nodes --show-labels NAME STATUS ROLES AGE VERSION LABELS s6 Ready
如果想刪除標簽,可以使用 “kubectl label nodes s6 IngressProxy-” 命令
5、安裝 Kubernetes Gateway CRD 資源
由于目前 Kubernetes 集群上默認沒有安裝 Service APIs,我們需要提前安裝 Gateway API 的 CRD 資源,需要確保在 Traefik 安裝之前啟用 Service APIs 資源。
$ kubectl apply -k "github.com/kubernetes-sigs/service-apis/config/crd?ref=v0.1.0"
更多內容請參考官網:https://traefik.io/blog/getting-started-with-traefik-and-the-new-kubernetes-gateway-api/
6、Kubernetes 部署 Traefik
下面將用 DaemonSet 方式部署 Traefik,便于在多服務器間擴展,用 hostport 方式綁定服務器 80、443 端口,方便流量通過物理機進入 Kubernetes 內部。
創建 traefik-deploy.yaml 文件:
apiVersion: v1 kind: Service metadata: name: traefik spec: ports: - name: web port: 80 - name: websecure port: 443 - name: admin port: 8080 selector: app: traefik --- apiVersion: apps/v1 kind: DaemonSet metadata: name: traefik-ingress-controller labels: app: traefik spec: selector: matchLabels: app: traefik template: metadata: name: traefik labels: app: traefik spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 1 containers: - image: traefik:v2.4.3 name: traefik-ingress-lb ports: - name: web containerPort: 80 hostPort: 80 # 將容器端口綁定所在服務器的 80 端口 - name: websecure containerPort: 443 hostPort: 443 # 將容器端口綁定所在服務器的 443 端口 - name: admin containerPort: 8080 # Traefik Dashboard 端口 resources: limits: cpu: 2000m memory: 1024Mi requests: cpu: 1000m memory: 1024Mi securityContext: capabilities: drop: - ALL add: - NET_BIND_SERVICE args: - --configfile=/config/traefik.yaml volumeMounts: - mountPath: "/config" name: "config" readinessProbe: httpGet: path: /ping port: 8080 failureThreshold: 3 initialDelaySeconds: 10 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 5 livenessProbe: httpGet: path: /ping port: 8080 failureThreshold: 3 initialDelaySeconds: 10 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 5 volumes: - name: config configMap: name: traefik-config tolerations: ## 設置容忍所有污點,防止節點被設置污點 - operator: "Exists" nodeSelector: ## 設置node篩選器,在特定label的節點上啟動 IngressProxy: "true"
創建資源文件:
$ kubectl apply -f traefik-deploy.yaml
配置HTTP路由規則
Traefik 應用已經部署完成,但是想讓外部訪問 Kubernetes 內部服務,還需要配置路由規則,上面部署 Traefik 時開啟了 Traefik Dashboard,這是 Traefik 提供的視圖看板,所以,首先配置基于 HTTP 的 Traefik Dashboard 路由規則,使外部能夠訪問 Traefik Dashboard。然后,再配置基于 HTTPS 的 Kubernetes Dashboard 的路由規則,這里使用 Ingress 方式進行演示。
創建 traefik-dashboard-ingress.yaml 文件
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: traefik-dashboard-ingress namespace: default annotations: kubernetes.io/ingress.class: traefik traefik.ingress.kubernetes.io/router.entrypoints: web spec: rules: - host: traefik.7dresar.com http: paths: - pathType: Prefix path: / backend: service: name: traefik port: number: 8080
創建資源:
$ kubectl apply -f traefik-dashboard-ingress.yaml
更多路由規則可言參考 Traefik 文檔:https://doc.traefik.io/traefik/v2.4/routing/providers/kubernetes-ingress/
路由規則應用
第一步,配置 Host 文件
客戶端想通過域名訪問服務,必須要進行 DNS 解析,由于這里沒有 DNS 服務器進行域名解析,所以修改 hosts 文件將 Traefik 所在節點服務器的 IP 和自定義 Host 綁定。打開電腦的 Hosts 配置文件,往其加入下面配置:
192.168.1.2 traefik.7dresar.com
第二步,訪問對應應用
打開瀏覽器輸入地址:http://traefik.7dresar.com 打開 Traefik Dashboard。
本文源碼:
https://github.com/zuozewei/blog-example/tree/master/Kubernetes/k8s-traefik-v2.4
HTTP Kubernetes NAT Nginx
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。