本文是來演示如何在 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>
也能使用客戶端進行連接