Traefik 2.0 暴露 Redis(TCP) 服務


文章轉載自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247484452&idx=1&sn=0a17b907b4b214b498eb99bacfefec0d&chksm=fdb90b39cace822fdd48a8e9499ccd53d4c53a11a464ad0be63235176e509342da0d5ec48a22&scene=178&cur_album_id=1319287026209947648#rd

本文是來演示如何在 Kubernetes 下面通過 Traefik 暴露一個 TCP 服務的,這里我們以 Redis 為例。

UDP的服務看這篇文章:https://www.cnblogs.com/sanduzxcvbnm/p/15749641.html
或者這篇:https://www.cnblogs.com/sanduzxcvbnm/p/15749677.html

參考轉載的文章內容經過實踐操作
k8s版本:1.20.12
traefik版本:2.4.8

部署 Redis

為了演示方便,我們這里只部署單節點的 Redis,對於 Redis 集群模式並不是我們這里的重點,下面是我們部署使用的資源清單文件:(redis.yaml)

# redis.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  namespace: test
spec:
  selector:
    matchLabels:
        app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:6.2.6
        ports:
        - containerPort: 6379
          protocol: TCP

---
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: test
spec:
  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)

# cat ingressroute-redis.yaml

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: redis
  namespace: test
spec:
  entryPoints:
    - redis
  routes:
  - kind: Rule
    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 是為了能夠通過節點的端口訪問到服務

我這里安裝的traefik是使用kubeoperator安裝k8s集群時選擇的,對照上面的文件,修改步驟有兩種,第一種是修改對應的yaml文件,第二種是通過kubepi進行修改

修改對應的yaml文件

通過kubepi進行修改


創建上面的 IngressRouteTCP 對象:

$ kubectl apply -f ingressroute-redis.yaml

創建完成后,同樣我們可以去 Traefik 的 Dashboard 頁面上查看是否生效:


然后我們配置一個域名解析到 Traefik 所在的節點,然后通過 6379 端口來連接 Redis 服務:

$ redis-cli -h www.daniel.com -p 6379
www.daniel.comm:6379> ping
PONG
www.daniel.com:6379> set hello world
OK
www.daniel.com:6379> get hello
"world"
www.daniel.com:6379>

也能使用客戶端進行連接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM