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
相关推荐
小诸葛的博客几秒前
docker compose入门7—详解build命令
docker·容器·eureka
hai405876 分钟前
云原生后端
云原生
007php0071 小时前
60分钟熟悉正则表达式
java·学习·mysql·架构·golang·正则表达式·php
GoppViper2 小时前
golang从http请求中读取xml格式的body,并转成json
xml·后端·http·golang
是jin奥2 小时前
Golang 逃逸分析(Escape Analysis)理解与实践篇
开发语言·后端·golang
❀͜͡傀儡师3 小时前
docker swarm集群部署
运维·docker·容器
技术卷3 小时前
Gin框架操作指南03:HTML渲染
golang·gin
大新新大浩浩4 小时前
使用rabbitmq-operator在k8s集群上部署rabbitmq实例
kubernetes·rabbitmq·ruby
The_tuber_sadness4 小时前
【Flutter】- go_router路由
javascript·flutter·golang
happy_king_zi4 小时前
Flink On kubernetes
大数据·flink·kubernetes