雲由臨時的服務器組和向服務器分配容器的方法組成。容器是一種將應用程序打包到標準化單元中的方法,以便該應用程序能夠在雲中的任何服務器上平穩運行。常常出現的問題是須要將外部客戶端的流量定向到雲內的容器中,同時確保外部客戶端不與雲綁定。針對該問題,一個常見的解決方案是建立一個Ingress controller。node
Kubernetes Ingress有兩個要求:nginx
Ingress controllergit
Ingressjson
這是爲Kubernetes配置Ingress的端到端設置示例,以便集羣的外部客戶端能夠Ingress controller訪問集羣內運行的Pod。一旦流量被引導到pod,流量將被引導至該Pod內的正確容器中。在本文中咱們將K3s部署到樹莓派上構建集羣。您能夠參考咱們往期教程,瞭解如何在樹莓派上搭建K3s集羣:超強教程!在樹莓派上構建多節點K8S集羣!api
上圖描述瞭如下組件的工做:瀏覽器
客戶端但願將流量發送到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服務。網絡
如下指南將根據上一部分的例子來構建對應的Ingress配置。app
運行Traefik 儀表盤
K3s爲Ingress controller建立了一個Traefik 部署,但默認狀況下,儀表盤是禁用的。在啓用儀表盤的狀況下運行Traefik,能夠實現應用Ingress建立的路由規則的概念。ide
必須編輯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