1. 程式人生 > >使用traefik作為ingress controller透出叢集中的https後端(如kubernetes dashboard)_Kubernetes中文社群

使用traefik作為ingress controller透出叢集中的https後端(如kubernetes dashboard)_Kubernetes中文社群

文章楔子

對於k8s叢集中的http/https服務,一種常見的設計是叢集內部走http協議,然後在ingress controller處統一管理TLS證書,並負責接受外部的https請求,以及將內部的http響應統一轉換為https發回客戶端,這樣既能降低叢集內部通訊的複雜度,又能保證叢集服務的安全性。

然而對於諸如kubernetes/dashoboard一類的服務,使用其預設的部署配置啟動的服務提供的是https協議的服務,從叢集外部訪問該服務時,通常只能使用類似如下的連結間接的訪問。

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/.

本文旨在指導讀者將叢集內部的HTTPS服務通過traefik暴露到叢集外部,直接通過ingress訪問。

通過ingress訪問https協議後端的dashboard

開啟https後端ingress

前置條件

  • kubernetes叢集
  • traefik 1.6.5

可以參考這份yaml檔案安裝traefik,需要注意兩點:

  • 該檔案中的image被我修改成了k8s.gcr.io/traefik:1.6.5,指向我使用的私有倉庫。如果讀者想從公網拉取該映象請將映象名修改為traefik:1.6.5
  • 該檔案並不涉及外部https相關程式碼,對外只開啟了http,如果需要https的話請先在kube-system名稱空間建立一個名為ssl的secret,裡面存放TLS證書,然後使用
    這份yaml檔案
    部署traefik

配置Traefik

如果使用了我的部署檔案,Traefik是直接配置好的,如果是讀者先前自己安裝好的traefik,請將下面的程式碼儲存為檔案,或編輯自己的traefik配置,在適當的位置加入insecureSkipVerify = true。然後將配置應用到叢集,並重啟所有traefik容器。

kind: ConfigMap
apiVersion: v1
metadata:
 name: traefik-conf
 namespace: kube-system
data:
 traefik.toml: |
   insecureSkipVerify = true
   defaultEntryPoints = ["http"]
   [entryPoints]
     [entryPoints.http]
     address = ":80"

insecureSkipVerify = true,該項配置指定了traefik在訪問https後端的時候可以忽略TLS證書驗證錯誤,從而使得https的後端,如kubernetes dashboard,可以像http後端一樣直接通過traefik透出

測試效果

這裡以透出https的kubernetes dashboard為例,執行下面的yaml檔案,為dashboard建立ingress

kind: Service
apiVersion: v1
metadata:
 labels:
   k8s-app: kubernetes-dashboard
 name: kubernetes-dashboard
 namespace: kube-system
spec:
 ports:
 - port: 443
   targetPort: 8443
 selector:
   k8s-app: kubernetes-dashboard
---
kind: Ingress
apiVersion: extensions/v1beta1
metadata: 
 name: dashboard
 namespace: kube-system
 annotations:
   kubernetes.io/ingress.class: traefik
spec:
 rules:
 - host: dashboard.multi.io
   http:
     paths:
     - backend:
         serviceName: kubernetes-dashboard
         servicePort: 443
       path: /

隨後配置/etc/hosts檔案,並訪問該連結

$ cat /etc/hosts
10.130.29.80 dashboard.multi.io