本文是來演示如何在 Kubernetes 下面通過 Traefik 暴露一個 TCP 服務的,這裡我們以 Redis 為例。首先需要保證 Traefik 2.0 已經安裝到了 Kubernetes 叢集之中,可以參考之前我們提供的安裝資源清單 https://github.com/cnych/kubeapp。
部署 Redis
為了演示方便,我們這裡只部署單節點的 Redis,對於 Redis 叢集模式並不是我們這裡的重點,下面是我們部署使用的資源清單檔案:(redis.yaml)
apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: redisspec: template: metadata: labels: app: redis spec: containers: - name: redis image: redis:3.2.11 ports: - containerPort: 6379 protocol: TCP---apiVersion: v1kind: Servicemetadata: name: redisspec: ports: - port: 6379 targetPort: 6379 selector: app: redis
直接建立即可:
$ kubectl apply -f redis.yaml
暴露 TCP 服務
由於 Traefik 中使用 TCP 路由配置需要 SNI,而 SNI 有是依賴 TLS 的,所以我們需要配置證書才行,但是如果沒有證書的話,我們可以使用萬用字元 * 進行配置,我們這裡建立一個 IngressRouteTCP 型別的 CRD 物件(前面我們就已經安裝了對應的 CRD 資源):(ingressroute-redis.yaml)
apiVersion: traefik.containo.us/v1alpha1kind: IngressRouteTCPmetadata: name: redisspec: entryPoints: - redis routes: - match: HostSNI(`*`) services: - name: redis port: 6379
要注意的是這裡的entryPoints部分,是根據我們啟動的 Traefik 的靜態配置中的 entryPoints 來決定的,比如我們可以自己新增一個用於 Redis 的專門的入口點:
containers:- image: traefik:v2.0 name: traefik-ingress-lb ports: - name: web containerPort: 80 hostPort: 80 - name: websecure containerPort: 443 hostPort: 443 - name: redis containerPort: 6379 hostPort: 6379 - name: admin containerPort: 8080 args: - --entrypoints.web.Address=:80 - --entrypoints.websecure.Address=:443 - --entrypoints.redis.Address=:6379 - --api.insecure=true - --providers.kubernetescrd - --api - --api.dashboard=true - --accesslog
這裡給入口點新增 hostPort 是為了能夠通過節點的埠訪問到服務,關於 entryPoints 入口點的更多資訊,可以檢視文件 entrypoints 了解更多資訊。
然後直接建立上面的 IngressRouteTCP 物件:
$ kubectl apply -f ingressroute-redis.yaml
建立完成後,同樣我們可以去 Traefik 的 Dashboard 頁面上檢視是否生效:
然後我們配置一個域名解析到 Traefik 所在的節點,然後通過 6379 埠來連線 Redis 服務:
$ redis-cli -h redis.youdianzhishi.com -p 6379redis.youdianzhishi.com:6379> pingPONGredis.youdianzhishi.com:6379> set hello worldOKredis.youdianzhishi.com:6379> get hello"world"redis.youdianzhishi.com:6379>
到這裡我們就完成了將 Redis(TCP)服務暴露給外部使用者了。