背景:
团队要公布一组利用,springboot 开发的 ws 利用。而后须要对外。反对 ws wss 协定。jenkins 写完 pipeline 公布工作。记得过来没有上容器的时候都是用的腾讯云的 cls 挂证书映射 cvm 端口。我当初的网络环境是这样的:Kubernetes 1.20.5 装置 traefik 在腾讯云下的实际(当然了本次的环境是跑在 tke1.20.6 下面的,都是依照下面实例搭建的 — 除了我新建了一个 namespace traefik,并将 traefik 利用都装置在了这个命名空间内!这样做的起因是 tke 的 kebe-system 下的 pod 太多了!我有强迫症)
部署与剖析过程:
1. 对于我的利用:
利用的部署形式是 statefulset,如下:
cat <<EOF > xxx-gateway.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: xxx-gateway
spec:
serviceName: xxx-gateway
replicas: 1
selector:
matchLabels:
app: xxx-gateway
template:
metadata:
labels:
app: xxx-gateway
spec:
containers:
- name: xxx-gateway
image: ccr.ccs.tencentyun.com/xxx-master/xxx-gateway:202107151002
env:
- name: SPRING_PROFILES_ACTIVE
value: "official"
- name: SPRING_APPLICATION_JSON
valueFrom:
configMapKeyRef:
name: spring-config
key: dev-config.json
ports:
- containerPort: 8443
resources:
requests:
memory: "512M"
cpu: "500m"
limits:
memory: "512M"
cpu: "500m"
imagePullSecrets:
- name: tencent
---
apiVersion: v1
kind: Service
metadata:
name: xxx-gateway
labels:
app: xxx-gateway
spec:
ports:
- port: 8443
selector:
app: xxx-gateway
clusterIP: None
EOF
kubectl apply -f xxx-gateway.yaml -n official
偷个懒间接 copy 了一个其余利用的 ingress yaml 批改了一下, 如下:
cat <<EOF > gateway-0-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: layaverse-gateway-0-http
namespace: official
annotations:
kubernetes.io/ingress.class: traefik
traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
rules:
- host: xxx-gateway-0.xxx.com
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: xxx-gateway
port:
number: 8443
EOF
部署 ingress
kubectl apply -f gateway-0-ingress.yaml
查看 ingress 部署情况
kubectl get ingress -n official
嗯 而后测试一下 wss(wss 我间接用 443 端口了。证书挂载 slb 层的 – 这是我了解的! 具体的参照我 traefik 的配置), 这里强调一下 wscat 这个工具。反正看了下咱们的后端小伙伴测试 ws 利用都是用的在线的 ws 工具:
就这样的。而后刚巧看到 wscat 就装置了一下:
sudo apt install npm
sudo npm install -g wscat
wscat -c wss://xxx-gateway-0.xxx.com:443/ws
嗯哼 基本上能够确认是利用对外胜利了?
当然了以上只是我顺利的假想!
实际上是代理后连贯后端的 ws 服务仍然有各种问题(开始我狐疑是 traefik 的问题),还是连不上!我粗犷的把 xxx-gateway 的裸露形式批改为 NodePort 而后挂载到了 slb 层(在 scl 间接增加了 ssl 证书),测试了一下是能够的就间接用了。先让利用跑起来,而后再钻研一下怎么解决。
2. 对于 ws 和 http:
先不去管那么多,先整明确实现我的 traefik 如何实现代理 ws 呢?
图中内容摘自:https://blog.csdn.net/fmm_sunshine/article/details/77918477
3. 排查下是谁的锅
1. 搭建一个简略的 ws 利用
后端的代码既然搞不懂,那我就找一个简略的 ws 的服务而后用 traefik 代理测试一下!
dockerhub 搜得一个 nodejs 的 websocket 镜像:https://hub.docker.com/r/ksdn117/web-socket-test
部署一下:
cat <<EOF > web-socket-test.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web-socket-test
spec:
serviceName: web-socket-test
replicas: 1
selector:
matchLabels:
app: web-socket-test
template:
metadata:
labels:
app: web-socket-test
spec:
containers:
- name: web-socket-test
image: ksdn117/web-socket-test
ports:
- containerPort: 8010
name: web
- containerPort: 8443
name: ssl
resources:
requests:
memory: "512M"
cpu: "500m"
limits:
memory: "512M"
cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
name: web-socket-test
labels:
app: web-socket-test
spec:
type: NodePort
ports:
- port: 8010
targetPort: 8010
protocol: TCP
name: web
- port: 8443
targetPort: 8443
name: ssl
protocol: TCP
selector:
app: web-socket-test
EOF
注:我这里的配置文件加了 type:NodePort
kubectl apply -f web-socket-test.yaml
kubectl get pods
kubectl get svc
2. 外部 wscat 测试 ws 服务是否联通
先外部连贯 container pod ip 测试一下服务:
wscat --connect ws://172.22.0.230:8010
kubectl logs -f web-socket-test-0
3.traefik 对外代理 ws 利用并测试
traefik 失常的对外裸露服务能够用 ingress 的形式还有 ingressroute 我都去尝试一下:
1. ingressroute 形式
cat <<EOF > web-socket-ingressroute.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: web-socket-test-http
namespaces: default
spec:
entryPoints:
- web
routes:
- match: Host(`web-socket-test.xxx.com`)
kind: Rule
services:
- name: web-socket-test
port: 8010
EOF
kubectl apply -f web-socket-ingressroute.yaml
wscat 连贯测试一下:
这样测来是没有问题的?
删除 ingress
kubectl delete -f web-socket-ingressroute.yaml
2. ingress 形式
整一下 ingress 的形式:
cat <<EOF > web-socket-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-socket-test
namespace: default
annotations:
kubernetes.io/ingress.class: traefik
traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
rules:
- host: web-socket-test.layame.com
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: web-socket-test
port:
number: 8010
EOF
kubectl apply -f web-socket-ingress.yaml
wscat --connect wss://web-socket-test.xxx.com:443
甩锅根本实现起码不是我的基础设施应的问题 ….. 让后端小伙伴测试一下看下是哪里有问题了。从我代理层来说是没有问题的!
对于其余:
当然了看一些博客还有要加 passHostHeader: true 的配置的
1. ingressroute:
2. ingress
ingress:traefik.ingress.kubernetes.io/service.passhostheader: “true”
如果有问题 能够尝试一下下面的形式!