Kubernets traefik代理ws wss应用

2023-11-01 05:38

本文主要是介绍Kubernets traefik代理ws wss应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景:

团队要发布一组应用,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-gatewayreplicas: 1selector:matchLabels:app: xxx-gatewaytemplate:metadata:labels:app: xxx-gatewayspec:containers:- name: xxx-gatewayimage: ccr.ccs.tencentyun.com/xxx-master/xxx-gateway:202107151002env:- name: SPRING_PROFILES_ACTIVEvalue: "official"- name: SPRING_APPLICATION_JSONvalueFrom:configMapKeyRef:name: spring-configkey: dev-config.jsonports:- containerPort: 8443resources:requests:memory: "512M"cpu: "500m"limits:memory: "512M"cpu: "500m" imagePullSecrets:                                              - name: tencent
---apiVersion: v1
kind: Service
metadata:name: xxx-gatewaylabels:app: xxx-gateway
spec:ports:- port: 8443selector:app: xxx-gatewayclusterIP: 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-httpnamespace: officialannotations:kubernetes.io/ingress.class: traefik  traefik.ingress.kubernetes.io/router.entrypoints: web
spec:rules:- host: xxx-gateway-0.xxx.comhttp:paths:- pathType: Prefixpath: /backend:service:name: xxx-gateway port: number: 8443
EOF

部署ingress

kubectl apply -f gateway-0-ingress.yaml

查看ingress部署状况

kubectl get ingress -n official

image.png
嗯 然后测试一下wss(wss我直接用443端口了。证书挂载slb层的–这是我理解的!具体的参照我traefik的配置),这里强调一下wscat这个工具。反正看了下我们的后端小伙伴测试ws应用都是用的在线的ws工具:
image.png
就这样的。然后正巧看到wscat就安装了一下:

sudo apt install npm
sudo npm install -g wscat 
wscat -c wss://xxx-gateway-0.xxx.com:443/ws

image.png
嗯哼 基本上可以确认是应用对外成功了?

当然了以上只是我顺利的假想!
实际上是代理后连接后端的ws服务依然有各种问题(开始我怀疑是traefik的问题),还是连不上!我粗暴的把xxx-gateway 的暴露方式修改为NodePort 然后挂载到了slb层(在scl直接添加了ssl证书),测试了一下是可以的就直接用了。先让应用跑起来,然后再研究一下怎么处理。

2. 关于ws和http:

先不去管那么多,先整明白实现我的traefik如何实现代理ws呢?
image.png
图中内容摘自: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-testreplicas: 1selector:matchLabels:app: web-socket-testtemplate:metadata:labels:app: web-socket-testspec:containers:- name: web-socket-testimage: ksdn117/web-socket-testports:- containerPort: 8010name: web- containerPort: 8443name: sslresources:requests:memory: "512M"cpu: "500m"limits:memory: "512M"cpu: "500m"
---apiVersion: v1
kind: Service
metadata:name: web-socket-testlabels:app: web-socket-test
spec:type: NodePortports:- port: 8010targetPort: 8010protocol: TCPname: web- port: 8443targetPort: 8443name: sslprotocol: TCPselector:app: web-socket-test
EOF

注: 我这里的配置文件加了type:NodePort

kubectl  apply -f web-socket-test.yaml
kubectl get pods 
kubectl get svc 

image.png

2.内部wscat测试ws服务是否联通

先内部连接container pod ip测试一下服务:
image.png

wscat --connect ws://172.22.0.230:8010
kubectl logs -f web-socket-test-0

image.png

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-httpnamespaces: default
spec:entryPoints:- webroutes:- match: Host(`web-socket-test.xxx.com`)kind: Ruleservices:- name: web-socket-testport: 8010EOFkubectl apply -f web-socket-ingressroute.yaml

image.png
wscat连接测试一下:
image.png
这样测来是没有问题的?
删除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-testnamespace: defaultannotations:kubernetes.io/ingress.class: traefik  traefik.ingress.kubernetes.io/router.entrypoints: web
spec:rules:- host: web-socket-test.layame.comhttp:paths:- pathType: Prefixpath: /backend:service:name: web-socket-test port: number: 8010EOFkubectl apply -f web-socket-ingress.yaml

image.png

wscat --connect wss://web-socket-test.xxx.com:443

image.png
甩锅基本完成起码不是我的基础设施应的问题…让后端小伙伴测试一下看下是哪里有问题了。从我代理层来说是没有问题的!

关于其他:

当然了看一些博客还有要加passHostHeader: true的配置的

1. ingressroute:

image.png

2. ingress

ingress:traefik.ingress.kubernetes.io/service.passhostheader: “true”
在这里插入图片描述

如果有问题 可以尝试一下上面的方式!

这篇关于Kubernets traefik代理ws wss应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/320845

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。