您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“怎么使用Traefik引導(dǎo)Kubernetes流量”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“怎么使用Traefik引導(dǎo)Kubernetes流量”這篇文章吧。
之前,我們使用 kubectl
進(jìn)行了直接部署。但是,這不是典型的部署方法。一般情況都會(huì)使用 YAML 配置文件,這也是我們要在本文中使用的配置文件。我們將從頂部開始,并以自頂向下的方式創(chuàng)建該配置文件。
首先是部署配置。配置如下所示,并在下面進(jìn)行說明。我通常以 Kubernetes 文檔中的示例為起點(diǎn),然后根據(jù)需要對(duì)其進(jìn)行修改。例如,下面的配置是復(fù)制了部署文檔中的示例后修改的。
創(chuàng)建一個(gè)文件 mysite.yaml
,其內(nèi)容如下:
apiVersion: apps/v1kind: Deploymentmetadata: name: mysite-nginx labels: app: mysite-nginxspec: replicas: 1 selector: matchLabels: app: mysite-nginx template: metadata: labels: app: mysite-nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
其中大部分是樣板。重要的部分,我們會(huì)將該部署命名為 mysite-nginx
,并為其加上同名的 app
標(biāo)簽。我們指定了一個(gè)副本,這意味著將只創(chuàng)建一個(gè) Pod。我們還指定了一個(gè)容器,我們將其命名為 nginx
。我們將鏡像指定為 nginx
。這意味著在部署時(shí),k3s 將從 DockerHub 下載 nginx
鏡像并從中創(chuàng)建一個(gè) Pod。最后,我們指定了容器端口為 80
,這只意味著在容器內(nèi)部 Pod 會(huì)監(jiān)聽 80
端口。
我在上面強(qiáng)調(diào)了“在容器內(nèi)部”,因?yàn)檫@是一個(gè)重要的區(qū)別。由于我們是按容器配置的,因此只能在容器內(nèi)部訪問它,并且進(jìn)一步將其限制為內(nèi)部網(wǎng)絡(luò)。這對(duì)于允許多個(gè)容器在同一容器端口上監(jiān)聽所是必要的。換句話說,通過這種配置,其他一些 Pod 也可以在其容器端口 80 上偵聽,并且不會(huì)與此容器沖突。為了提供對(duì)該 Pod 的正式訪問權(quán)限,我們需要一個(gè)服務(wù)配置。
在 Kubernetes 中,服務(wù)是一種抽象。它提供了一種訪問 Pod 或 Pod 集合的方法。當(dāng)連接到服務(wù)時(shí),服務(wù)會(huì)路由到單個(gè) Pod,或者如果定義了多個(gè) Pod 副本,會(huì)通過負(fù)載均衡路由到多個(gè) Pod。
可以在同一配置文件中指定該服務(wù),這就是我們將在此處要做的。用 ---
分隔配置區(qū)域,將以下內(nèi)容添加到 mysite.yaml
中:
---apiVersion: v1kind: Servicemetadata: name: mysite-nginx-servicespec: selector: app: mysite-nginx ports: - protocol: TCP port: 80
在此配置中,我們將服務(wù)命名為 mysite-nginx-service
。我們提供了一個(gè)選擇器:app: mysite-nginx
。這是服務(wù)選擇其路由到的應(yīng)用程序容器的方式。請(qǐng)記住,我們?yōu)槿萜魈峁┝?app
標(biāo)簽:mysite-nginx
。這就是服務(wù)用來查找我們的容器的方式。最后,我們指定服務(wù)協(xié)議為 TCP
,在端口 80
上監(jiān)聽。
入口配置指定了如何將流量從集群外部傳遞到集群內(nèi)部的服務(wù)。請(qǐng)記住,k3s 預(yù)先配置了 Traefik 作為入口控制器。因此,我們將編寫特定于 Traefik 的入口配置。將以下內(nèi)容添加到 mysite.yaml
中(不要忘了用 ---
分隔):
---apiVersion: networking.k8s.io/v1beta1kind: Ingressmetadata: name: mysite-nginx-ingress annotations: kubernetes.io/ingress.class: "traefik"spec: rules: - http: paths: - path: / backend: serviceName: mysite-nginx-service servicePort: 80
在此配置中,我們將入口記錄命名為 mysite-nginx-ingress
。我們告訴 Kubernetes,我們希望 traefik
成為我們的入口控制器,再加上 kubernetes.io/ingress.class
的注解。
在規(guī)則部分中,我們基本上是說,當(dāng) http
流量進(jìn)入時(shí),并且 path
匹配 /
(或其下的任何內(nèi)容),將其路由到由 serviceName mysite-nginx-service
指定的后端服務(wù)中,并將其路由到 servicePort 80
。這會(huì)將傳入的 HTTP 流量連接到我們之前定義的服務(wù)。
就配置而言,就是這樣了。如果我們現(xiàn)在部署,我們將獲得默認(rèn)的 nginx 頁面,但這不是我們想要的。讓我們創(chuàng)建一些簡(jiǎn)單但可自定義的部署方式。創(chuàng)建具有以下內(nèi)容的文件 index.html
:
<html><head><title>K3S!</title> <style> html { font-size: 62.5%; } body { font-family: sans-serif; background-color: midnightblue; color: white; display: flex; flex-direction: column; justify-content: center; height: 100vh; } div { text-align: center; font-size: 8rem; text-shadow: 3px 3px 4px dimgrey; } </style></head><body> <div>Hello from K3S!</div></body></html>
我們尚未介紹 Kubernetes 中的存儲(chǔ)機(jī)制,因此在這里我們偷懶一下,僅將該文件存儲(chǔ)在 Kubernetes 配置映射中。這不是我們推薦的部署網(wǎng)站的方式,但對(duì)于我們的目的來說是可行的。運(yùn)行以下命令:
kubectl create configmap mysite-html --from-file index.html
該命令從本地文件 index.html
創(chuàng)建名為 mysite-html
的配置映射資源。這實(shí)際上是在 Kubernetes 資源中存儲(chǔ)一個(gè)文件(或一組文件),我們可以在配置中調(diào)出該文件。它通常用于存儲(chǔ)配置文件(因此而得名),我們?cè)谶@里稍加濫用。在以后的文章中,我們將討論 Kubernetes 中適當(dāng)?shù)拇鎯?chǔ)解決方案。
創(chuàng)建配置映射后,讓我們將其掛載在我們的 nginx
容器中。我們分兩個(gè)步驟進(jìn)行。首先,我們需要指定一個(gè)卷來調(diào)出配置映射。然后我們需要將該卷掛載到 nginx
容器中。通過在 mysite.yaml
中的 container
后面的 spec
標(biāo)簽下添加以下內(nèi)容來完成第一步:
volumes: - name: html-volume configMap: name: mysite-html
這告訴 Kubernetes 我們要定義一個(gè)名為 html-volume
的卷,并且該卷應(yīng)包含名為 html-volume
(我們?cè)谏弦徊街袆?chuàng)建的)的配置映射的內(nèi)容。
接下來,在 nginx
容器規(guī)范中的端口下方,添加以下內(nèi)容:
volumeMounts: - name: html-volume mountPath: /usr/share/nginx/html
這告訴 Kubernetes,對(duì)于 nginx
容器,我們想在容器中的 /usr/share/nginx/html
路徑上掛載名為 html-volume
的卷。 為什么要使用 /usr/share/nginx/html
?那個(gè)位置就是 nginx
鏡像提供 HTML 服務(wù)的地方。通過在該路徑上掛載卷,我們用該卷內(nèi)容替換了默認(rèn)內(nèi)容。
作為參考,配置文件的 deployment
部分現(xiàn)在應(yīng)如下所示:
apiVersion: apps/v1kind: Deploymentmetadata: name: mysite-nginx labels: app: mysite-nginxspec: replicas: 1 selector: matchLabels: app: mysite-nginx template: metadata: labels: app: mysite-nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: html-volume mountPath: /usr/share/nginx/html volumes: - name: html-volume configMap: name: mysite-html
現(xiàn)在我們準(zhǔn)備部署! 我們可以這樣做:
kubectl apply -f mysite.yaml
你應(yīng)該看到類似于以下內(nèi)容:
deployment.apps/mysite-nginx createdservice/mysite-nginx-service createdingress.networking.k8s.io/mysite-nginx-ingress created
這意味著 Kubernetes 為我們指定的三個(gè)配置分別創(chuàng)建了資源。使用以下方法檢查 Pod 的狀態(tài):
kubectl get pods
如果看到狀態(tài)為 ContainerCreating
,請(qǐng)給它一些時(shí)間并再次運(yùn)行 kubectl get pods
。通常,第一次會(huì)花一些時(shí)間,因?yàn)?k3s 必須下載 nginx
鏡像來創(chuàng)建 Pod。一段時(shí)間后,你應(yīng)該看到 Running
的狀態(tài)。
Pod 運(yùn)行之后,就該嘗試了。打開瀏覽器,然后在地址欄中輸入 kmaster
。
恭喜你!你已經(jīng)在 k3s 集群上部署了一個(gè)網(wǎng)站!
因此,現(xiàn)在我們有了一個(gè)運(yùn)行單個(gè)網(wǎng)站的整個(gè) k3s 集群。但是我們可以有更多的網(wǎng)站!如果我們要在同一集群中提供另一個(gè)網(wǎng)站怎么辦?讓我們看看如何做到這一點(diǎn)。
同樣,我們需要部署一些東西。碰巧我的狗有一條她想讓全世界都知道的信息,她想了好久了。因此,我專門為她制作了一些 HTML(可從示例 zip 文件中獲得)。同樣,我們將使用配置映射的技巧來托管這些 HTML。這次我們將把整個(gè)目錄(html
目錄)放到配置映射中,但是調(diào)用是相同的。
kubectl create configmap mydog-html --from-file html
現(xiàn)在,我們需要為此站點(diǎn)創(chuàng)建一個(gè)配置文件。它幾乎與用于 mysite.yaml
的完全相同,因此首先將 mysite.yaml
復(fù)制為 mydog.yaml
?,F(xiàn)在將 mydog.yaml
修改為:
apiVersion: apps/v1kind: Deploymentmetadata: name: mydog-nginx labels: app: mydog-nginxspec: replicas: 1 selector: matchLabels: app: mydog-nginx template: metadata: labels: app: mydog-nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: html-volume mountPath: /usr/share/nginx/html volumes: - name: html-volume configMap: name: mydog-html---apiVersion: v1kind: Servicemetadata: name: mydog-nginx-servicespec: selector: app: mydog-nginx ports: - protocol: TCP port: 80---apiVersion: networking.k8s.io/v1beta1kind: Ingressmetadata: name: mydog-nginx-ingress annotations: kubernetes.io/ingress.class: "traefik" traefik.frontend.rule.type: PathPrefixStripspec: rules: - http: paths: - path: /mydog backend: serviceName: mydog-nginx-service servicePort: 80
我們只需進(jìn)行搜索并將 mysite
替換為 mydog
即可完成大多數(shù)修改。其他兩個(gè)修改在入口部分中。我們將 path
更改為 /mydog
,并添加了一個(gè)注解 traefik.frontend.rule.type: PathPrefixStrip
。
/mydog
路徑的規(guī)范指示 Traefik 將以 /mydog
路徑開頭的所有傳入請(qǐng)求路由到 mydog-nginx-service
。任何其他路徑將繼續(xù)路由到 mysite-nginx-service
。
新的注解 PathPrefixStrip
告訴 Traefik 在將請(qǐng)求發(fā)送到 mydog-nginx-service
之前先去除前綴 /mydog
。我們這樣做是因?yàn)?mydog-nginx
應(yīng)用程序不需要前綴。這意味著我們可以簡(jiǎn)單地通過更改入口記錄中的前綴來更改掛載的服務(wù)的位置。
現(xiàn)在我們可以像以前一樣進(jìn)行部署:
kubectl apply -f mydog.yaml
現(xiàn)在,我的狗的消息應(yīng)該可以在 http://kmaster/mydog/ 上找到。
呼!消息發(fā)出去了!也許今晚我們都可以睡一覺。
因此,現(xiàn)在,我們有了一個(gè) k3s 集群,該集群托管了兩個(gè)網(wǎng)站,Traefik 根據(jù)路徑名決定將請(qǐng)求傳遞給哪個(gè)服務(wù)!但是,不僅限于基于路徑的路由,我們也可以使用基于主機(jī)名的路由,我們將在以后的文章中進(jìn)行探討。
另外,我們剛剛托管的網(wǎng)站是標(biāo)準(zhǔn)的未加密 HTML 網(wǎng)站,而如今的所有內(nèi)容都使用 SSL/TLS 加密。在我們的下一篇文章中,我們將為 k3s 集群添加支持以托管 SSL/TLS HTTPS 站點(diǎn)!
在開始之前,由于本文主要涉及的是示例站點(diǎn),因此我想向你展示如何刪除內(nèi)容,以防萬一你不希望將這些示例丟在集群中。
對(duì)于大多數(shù)配置,只需使用與部署時(shí)使用的相同配置文件運(yùn)行 delete
命令即可撤消配置。因此,讓我們同時(shí)清理 mysite
和 mydog
。
kubectl delete -f mysite.yamlkubectl delete -f mydog.yaml
由于我們是手動(dòng)創(chuàng)建配置映射的,因此我們也需要手動(dòng)刪除它們。
kubectl delete configmap mysite-htmlkubectl delete configmap mydog-html
現(xiàn)在,如果我們執(zhí)行 kubectl get pods
,我們應(yīng)該看到我們的 nginx Pod 不存在了。
$ kubectl get podsNo resources found in default namespace.
以上是“怎么使用Traefik引導(dǎo)Kubernetes流量”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。