基礎指南:如何在K3s中配置Traefik?

雲由臨時的服務器組和向服務器分配容器的方法組成。容器是一種將應用程序打包到標準化單元中的方法,以便該應用程序可以在雲中的任何服務器上平穩運行。經常出現的問題是需要將外部客戶端的流量定向到雲內的容器中,同時確保外部客戶端不與雲綁定。針對該問題,一個常見的解決方案是創建一個Ingress controller。

Kubernetes的Ingress

Kubernetes Ingress有兩個要求:

  • Ingress controller

  • Ingress

這是爲Kubernetes配置Ingress的端到端設置示例,以便集羣的外部客戶端可以Ingress controller訪問集羣內運行的Pod。一旦流量被引導到pod,流量將被引導至該Pod內的正確容器中。在本文中我們將K3s部署到樹莓派上構建集羣。您可以參考我們往期教程,瞭解如何在樹莓派上搭建K3s集羣:超強教程!在樹莓派上構建多節點K8S集羣!

在這裏插入圖片描述
上圖描述了以下組件的工作:

客戶端希望將流量發送到Pod。通過創建ClusterIP服務,將Pod部署到K3s集羣並在集羣內公開。客戶端無法訪問此服務,但是Ingress Controller可以訪問該服務。Ingress controller執行Ingress定義的路由規則。Ingress controller通過NodePort服務向客戶端公開。
在這裏插入圖片描述
Kubernetes並不部署Ingress controller,但是K3s會默認部署一個。上圖展示了K3s部署Traefik作爲Ingress controller的實現。因此,Traefik將會負責滿足Ingress的請求。Ingress 請求由K3s提交,根據不同的HTTP屬性實例化傳入流量的路由規則。

上圖中描述的Ingress在Traefik上創建了一個路由規則,這樣傳入的流量如何路徑與“/”後面的內容相匹配,就會被重定向到80端口的nginx-svc服務。

創建K3s Ingress 資源

以下指南將根據上一部分的例子來構建對應的Ingress配置。

運行Traefik 儀表盤
K3s爲Ingress controller創建了一個Traefik 部署,但默認情況下,儀表盤是禁用的。在啓用儀表盤的情況下運行Traefik,可以實現應用Ingress創建的路由規則的概念。

必須編輯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: v1
data:
  traefik.toml: |
    # traefik.toml
    logLevel = "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: ConfigMap
metadata:
  annotations:
    meta.helm.sh/release-name: traefik
    meta.helm.sh/release-namespace: kube-system
  creationTimestamp: "2020-10-02T13:59:32Z"
  labels:
    app: traefik
    app.kubernetes.io/managed-by: Helm
    chart: traefik-1.81.0
    heritage: Helm
    release: traefik
  name: traefik
  namespace: kube-system
  resourceVersion: "3405531"

必須添加31行和32行才能夠啓用儀表盤。在添加這些行後,鍵入esc + : + wq,保存文件。

重啓Traefik部署


kubectl -n kube-system scale deploy traefik --replicas 0
kubectl -n kube-system scale deploy traefik --replicas 1

端口轉發Traefik儀表盤

kubectl -n kube-system port-forward deployment/traefik 8080

在你的瀏覽器中,訪問http://localhost:8080,打開儀表盤。

配置Traefik路由規則

我們的例子可以很容易地在不創建yaml文件的情況下完成;然而,yaml文件允許你保存你的工作,並輕鬆地啓動和拆除整個配置設置。接下來的例子將使用yaml文件而不是命令行命令來構建Ingress的Kubernetes資源。

創建deployment

必須有一個最終將流量路由到的後備Pod。運行nginx即可。將以下文件另存爲deployment.yaml


apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      # manage pods with the label app: nginx
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

kubectl create -f deployment.yaml

創建服務
Ingress在Ingress controller,Traefik上配置路由規則。Traefik檢查傳入的HTTP流量,並將流量引導到已觸發規則的服務,最後從服務流向Pod。現在我們將創建這個Service,將以下文件保存爲servcie.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
    - name: http
      port: 80
  selector:
    # apply service to any pod with label app: nginx
    app: nginx
kubectl create -f service.yaml

創建Ingress

Ingress使用路由規則配置Traefik。這個示例將使用基於路徑的路由規則。通過檢查傳入網址的上下文來評估基於路徑的路由規則。此處,路徑前綴爲/。路徑/捕捉所有傳入的流量,所以類似/context1,/context2/anything的上下文將會觸發在Traefik上的路由規則,因爲所有這些上下文的前綴都是/。將以下文件保存爲ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          serviceName: nginx-svc
          servicePort: 80
kubectl create -f ingress.yaml

路由規則可以在Traefik的儀表盤上查看:

在這裏插入圖片描述
使用NodePort暴露Ingress controller到外部流量

nginx app的Ingress規則已經被定義,但是Traefik尚未被暴露到外部流量。創建Nodeport類型的服務將會暴露Traefik到客戶端。保存以下文件nodeport.yaml


apiVersion: v1
kind: Service
metadata:
  name: traefik
  namespace: kube-system
spec:
  type: NodePort
  ports:
    - name: traefik
      port: 80
      nodePort: 30182
      targetPort: 80
  selector:
    app: traefik
kubectl create -f nodeport.yaml

作爲外部客戶端

集羣的外部客戶端現在可以向Ingress controller發出請求。Ingress controller會將流量重定向到nginx-svc服務,而nginx-svc又會將流量導向pod nignx。要作爲外部客戶端,我們需要Cluster中的一臺服務器的IP地址。


kubectl get nodes -o wide

將任何INTERNAL-IP和我們的Traefik服務的NodePort 30182粘貼到瀏覽器中。將顯示NGINX的默認頁面。請注意,外部客戶端必須與Cluster在同一個網絡上才能工作。

在這裏插入圖片描述

結 論

Ingress在雲原生環境中是一個極爲重要的概念。Kubernetes提供Ingress,但將Ingress controller的實現留給開發人員。K3s默認提供Traefik作爲ingress controller,如果沒有ingress controller,創建Ingress將無濟於事。Ingress controller本身就是一個pod,必須暴露給外部流量。在此示例中,我們使用NodePort進行公開。在評估路由規則(該規則通過提交Ingress進行配置)後,命中的Ingress controller流量將重定向到配置的服務。
附錄

本指南中的各個文件可以合併爲一個文件。通過維護一個文件,很容易創建和銷燬整個Ingress設置,將以下文件另存爲nginx-ingres-full.yaml
創建

kubectl create -f nginx-ingress-full.yaml

銷燬


kubectl delete -f nginx-ingress-full.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      # manage pods with the label app: nginx
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
    - name: http
      port: 80
  selector:
    # apply service to any pod with label app: nginx
    app: nginx
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          serviceName: nginx-svc
          servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: traefik
  namespace: kube-system
spec:
  type: NodePort
  ports:
    - name: traefik
      port: 80
      nodePort: 30182
      targetPort: 80
  selector:
    app: traefik

原文鏈接:
https://levelup.gitconnected.com/a-guide-to-k3s-ingress-using-traefik-with-nodeport-6eb29add0b4b

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