基礎指南:如何在K3s中配置Traefik?
云由臨時的服務器組和向服務器分配容器的方法組成。容器是一種將應用程序打包到標準化單元中的方法,以便該應用程序可以在云中的任何服務器上平穩(wěn)運行。經(jīng)常出現(xiàn)的問題是需要將外部客戶端的流量定向到云內(nèi)的容器中,同時確保外部客戶端不與云綁定。針對該問題,一個常見的解決方案是創(chuàng)建一個Ingress controller。
Kubernetes的Ingress
Kubernetes Ingress有兩個要求:
Ingress controller
Ingress
這是為Kubernetes配置Ingress的端到端設置示例,以便集群的外部客戶端可以Ingress controller訪問集群內(nèi)運行的Pod。一旦流量被引導到pod,流量將被引導至該Pod內(nèi)的正確容器中。在本文中我們將K3s部署到樹莓派上構(gòu)建集群。您可以參考我們往期教程,了解如何在樹莓派上搭建K3s集群:
超強教程!在樹莓派上構(gòu)建多節(jié)點K8S集群!

上圖描述了以下組件的工作:
客戶端希望將流量發(fā)送到Pod。通過創(chuàng)建ClusterIP服務,將Pod部署到K3s集群并在集群內(nèi)公開。客戶端無法訪問此服務,但是Ingress Controller可以訪問該服務。Ingress controller執(zhí)行Ingress定義的路由規(guī)則。Ingress controller通過NodePort服務向客戶端公開。

Kubernetes并不部署Ingress controller,但是K3s會默認部署一個。上圖展示了K3s部署Traefik作為Ingress controller的實現(xiàn)。因此,Traefik將會負責滿足Ingress的請求。Ingress 請求由K3s提交,根據(jù)不同的HTTP屬性實例化傳入流量的路由規(guī)則。
上圖中描述的Ingress在Traefik上創(chuàng)建了一個路由規(guī)則,這樣傳入的流量如何路徑與“/”后面的內(nèi)容相匹配,就會被重定向到80端口的nginx-svc服務。
創(chuàng)建K3s Ingress 資源
以下指南將根據(jù)上一部分的例子來構(gòu)建對應的Ingress配置。
運行Traefik 儀表盤
K3s為Ingress controller創(chuàng)建了一個Traefik 部署,但默認情況下,儀表盤是禁用的。在啟用儀表盤的情況下運行Traefik,可以實現(xiàn)應用Ingress創(chuàng)建的路由規(guī)則的概念。
必須編輯Traefik的ConfigMap才能啟用儀表盤。
kubectl -n kube-system edit cm traefik該命令允許你在終端中編輯ConfigMap:
# Please edit the object below. Lines beginning with a '#' will be ignored,# and an empty file will abort the edit. If an error occurs while saving this file will be# reopened with the relevant failures.#apiVersion: v1data:: |# traefik.tomllogLevel = "info"defaultEntryPoints = ["http","https"][entryPoints][entryPoints.http]address = ":80"compress = true[entryPoints.https]address = ":443"compress = true[entryPoints.https.tls][[entryPoints.https.tls.certificates]]CertFile = "/ssl/tls.crt"KeyFile = "/ssl/tls.key"[entryPoints.prometheus]address = ":9100"[ping]entryPoint = "http"[kubernetes][kubernetes.ingressEndpoint]publishedService = "kube-system/traefik"[traefikLog]format = "json"[api]dashboard = true[metrics][metrics.prometheus]entryPoint = "prometheus"kind: ConfigMapmetadata:annotations:: traefik: kube-systemcreationTimestamp: "2020-10-02T13:59:32Z"labels:app: traefik: Helmchart: traefik-1.81.0heritage: Helmrelease: traefikname: traefiknamespace: kube-systemresourceVersion: "3405531"
必須添加31行和32行才能夠啟用儀表盤。在添加這些行后,鍵入esc + : + wq,保存文件。
重啟Traefik部署
kubectl -n kube-system scale deploy traefik --replicas 0kubectl -n kube-system scale deploy traefik --replicas 1
端口轉(zhuǎn)發(fā)Traefik儀表盤
kubectl -n kube-system port-forward deployment/traefik 8080在你的瀏覽器中,訪問http://localhost:8080,打開儀表盤。
配置Traefik路由規(guī)則
我們的例子可以很容易地在不創(chuàng)建yaml文件的情況下完成;然而,yaml文件允許你保存你的工作,并輕松地啟動和拆除整個配置設置。接下來的例子將使用yaml文件而不是命令行命令來構(gòu)建Ingress的Kubernetes資源。
創(chuàng)建deployment
必須有一個最終將流量路由到的后備Pod。運行nginx即可。將以下文件另存為deployment.yaml。
apiVersion: apps/v1kind: Deploymentmetadata:name: nginxspec:replicas: 1selector:matchLabels:# manage pods with the label app: nginxapp: nginxtemplate:metadata:labels:app: nginxspec:containers:name: nginximage: nginxports:containerPort: 80
kubectl create -f deployment.yaml創(chuàng)建服務
Ingress在Ingress controller,Traefik上配置路由規(guī)則。Traefik檢查傳入的HTTP流量,并將流量引導到已觸發(fā)規(guī)則的服務,最后從服務流向Pod。現(xiàn)在我們將創(chuàng)建這個Service,將以下文件保存為servcie.yaml:
apiVersion: v1kind: Servicemetadata:name: nginx-svcspec:ports:name: httpport: 80selector:# apply service to any pod with label app: nginxapp: nginx
kubectl create -f service.yaml創(chuàng)建Ingress
Ingress使用路由規(guī)則配置Traefik。這個示例將使用基于路徑的路由規(guī)則。通過檢查傳入網(wǎng)址的上下文來評估基于路徑的路由規(guī)則。此處,路徑前綴為/。路徑/捕捉所有傳入的流量,所以類似/context1,/context2/anything的上下文將會觸發(fā)在Traefik上的路由規(guī)則,因為所有這些上下文的前綴都是/。將以下文件保存為ingress.yaml:
apiVersion: extensions/v1beta1kind: Ingressmetadata:name: nginx-ingressannotations:: traefikspec:rules:http:paths:path: /pathType: Prefixbackend:serviceName: nginx-svcservicePort: 80
kubectl?create?-f?ingress.yaml路由規(guī)則可以在Traefik的儀表盤上查看:

使用NodePort暴露Ingress controller到外部流量
nginx app的Ingress規(guī)則已經(jīng)被定義,但是Traefik尚未被暴露到外部流量。創(chuàng)建Nodeport類型的服務將會暴露Traefik到客戶端。保存以下文件nodeport.yaml
apiVersion: v1kind: Servicemetadata:name: traefiknamespace: kube-systemspec:type: NodePortports:name: traefikport: 80nodePort: 30182targetPort: 80selector:app: traefik
kubectl create -f nodeport.yaml作為外部客戶端
集群的外部客戶端現(xiàn)在可以向Ingress controller發(fā)出請求。Ingress controller會將流量重定向到nginx-svc服務,而nginx-svc又會將流量導向pod nignx。要作為外部客戶端,我們需要Cluster中的一臺服務器的IP地址。
kubectl get nodes -o wide將任何INTERNAL-IP和我們的Traefik服務的NodePort 30182粘貼到瀏覽器中。將顯示NGINX的默認頁面。請注意,外部客戶端必須與Cluster在同一個網(wǎng)絡上才能工作。

結(jié)? 論
Ingress在云原生環(huán)境中是一個極為重要的概念。Kubernetes提供Ingress,但將Ingress controller的實現(xiàn)留給開發(fā)人員。K3s默認提供Traefik作為ingress controller,如果沒有ingress controller,創(chuàng)建Ingress將無濟于事。Ingress controller本身就是一個pod,必須暴露給外部流量。在此示例中,我們使用NodePort進行公開。在評估路由規(guī)則(該規(guī)則通過提交Ingress進行配置)后,命中的Ingress controller流量將重定向到配置的服務。
附錄
本指南中的各個文件可以合并為一個文件。通過維護一個文件,很容易創(chuàng)建和銷毀整個Ingress設置,將以下文件另存為nginx-ingres-full.yaml。
創(chuàng)建
kubectl create -f nginx-ingress-full.yaml銷毀
kubectl delete -f nginx-ingress-full.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: nginxspec:replicas: 1selector:matchLabels:# manage pods with the label app: nginxapp: nginxtemplate:metadata:labels:app: nginxspec:containers:name: nginximage: nginxports:containerPort: 80---apiVersion: v1kind: Servicemetadata:name: nginx-svcspec:ports:name: httpport: 80selector:# apply service to any pod with label app: nginxapp: nginx---apiVersion: extensions/v1beta1kind: Ingressmetadata:name: nginx-ingressannotations:: traefikspec:rules:http:paths:path: /pathType: Prefixbackend:serviceName: nginx-svcservicePort: 80---apiVersion: v1kind: Servicemetadata:name: traefiknamespace: kube-systemspec:type: NodePortports:name: traefikport: 80nodePort: 30182targetPort: 80selector:app: traefik
原文鏈接:
https://levelup.gitconnected.com/a-guide-to-k3s-ingress-using-traefik-with-nodeport-6eb29add0b4b
推薦閱讀
掃碼添加k3s中文社區(qū)助手
加入官方中文技術(shù)社區(qū)
官網(wǎng):https://k3s.io
