K8s环境下使用sidecar模式对EMQX的exhook.proto 进行流量代理

背景

在使用emqx作为mqtt时需要我们需要拦截client的各种行为,如连接,发送消息,认证等。除了使用emqx自带的插件机制。我们也可以用多语言-钩子扩展来实现这个功能,但是目前emqx仅仅支持单个grpc服务端的设置,所以会有单点问题。当然也可以用外部的流量代理。本文在k8s环境下使用sidecar的模式对grpc的流量做负载均衡,以实现高可用的效果。如图所示:

进行拦截:

打包emqx-exhook-server

docker build -f Dockerfile -t emqx-exhook-server:0.0.1 .

k8s 部署emqx

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: emqx-deployment
  labels:
    app: emqx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: emqx
  template:
    metadata:
      labels:
        app: emqx
    spec:
      initContainers:
        - name: emqx-exhook-server
          image: emqx-exhook-server:0.0.1
          restartPolicy: Always
      containers:
        - name: emqx
          image: emqx:5.8.0
          ports:
            - name: mqtt
              containerPort: 1883
            - name: mqttssl
              containerPort: 8883
            - name: mgmt
              containerPort: 8081
            - name: ws
              containerPort: 8083
            - name: wss
              containerPort: 8084
            - name: dashboard
              containerPort: 18083
      restartPolicy: Always

---
apiVersion: v1
kind: Service
metadata:
  name: emqx-service
spec:
  selector:
    app: emqx
  ports:
    - name: mqtt
      port: 1883
      protocol: TCP
      targetPort: mqtt
    - name: mqttssl
      port: 8883
      protocol: TCP
      targetPort: mqttssl
    - name: mgmt
      port: 8081
      protocol: TCP
      targetPort: mgmt
    - name: ws
      port: 8083
      protocol: TCP
      targetPort: ws
    - name: wss
      port: 8084
      protocol: TCP
      targetPort: wss
    - name: dashboard
      port: 18083
      protocol: TCP
      targetPort: dashboard

测试

  • mac-desktop下需要开启端口转发

    kubectl port-forward svc/emqx-service 18083:18083
    kubectl port-forward svc/emqx-service 1883:1883

  • 配置

  • 进行发布/订阅

    正常连接

总结

  • 对于在k8s的集群的来说也是支持的,因为每个pod都有一个sidecar
  • 对于sidecar 也可以动态升级,不影响主容器
  • 因每个pod都有一个sidecar,原生支持负载均衡(客户端负载均衡),挂掉一台且不会影响emqx集群
  • github
相关推荐
Lazy龙24 分钟前
Golang协程
golang
木亦汐丫2 小时前
Docker 镜像版本Alpine、Slim、Bookworm、Bullseye、Stretch、Jessie
运维·docker·容器·debian·alpine·slim·bullseye
中草药z4 小时前
【Docker】零基础上手:原理+Ubuntu/Windows GUI 安装 + 镜像源 / 目录优化
运维·ubuntu·docker·容器·gui·安装·cgroups
勇往直前plus5 小时前
如何利用docker部署springboot应用
spring boot·docker·容器
小北爱编程ma6 小时前
【云原生】用Prometheus Operator监听Golang服务指标,并用Granafa可视化展示
云原生
NineData6 小时前
NineData云原生智能数据管理平台新功能发布|2025年9月版
数据库·云原生·devops·ninedata·数据库迁移·数据复制·风险sql管控
博睿谷IT99_7 小时前
Linux 云计算核心技术:原理、组件与 K8s 实战部署
linux·kubernetes·云计算
有谁看见我的剑了?8 小时前
k8s storageclasses nfs-provisioner 部署
docker·容器·kubernetes
超龄超能程序猿9 小时前
Docker 镜像的导出和还原操作
运维·docker·容器
维尔切9 小时前
Docker 监控平台部署
运维·docker·容器·grafana·prometheus