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
相关推荐
云川之下21 分钟前
【k8s】sriov‑device‑plugin、sriov‑network‑config‑daemon详解
云原生·容器·kubernetes
golang学习记13 小时前
Go 项目使用docker compose的正确方式
开发语言·docker·golang
张忠琳18 小时前
【NPU】Ascend Device Plugin —Part 6 K8s客户端 + 重复检测模块 超深度源码分析之二
云原生·容器·kubernetes·npu·docker device
雨声不在18 小时前
私有 Docker Registry 排障实录:两个隐蔽的坑
docker·容器
云川之下18 小时前
【k8s】SR‑IOV‑Network‑Operator 详解
云原生·容器·kubernetes
云烟成雨TD19 小时前
Micrometer 系列【29】源码分析:MeterRegistry 实例化流程
java·云原生·micrometer
读书读傻了哟19 小时前
解决docker拉取镜像报错failed to resolve reference “docker.io/xxx“...i/o timeout问题
运维·docker·容器
2501_9318037519 小时前
深入理解 GORM:从模型定义到关联查询的核心原理
golang
似璟如你20 小时前
Java 开发者的 Go 语法基础:从 0 开始快速上手 Go
java·开发语言·后端·golang·go·编程语言