最近发现EMQ对物联网场景支持比较好,各种协议插件比较多容器扩展。目前EMQ整个部署想加入到k8s集群里需要做一些事情,首先进行deploayment和server的部署,目前3.1版本版本,首先要在rancher后台新建api key,如果使用kubeconfig里面的token会有如下错误can't read token:eaccs。这个可能是里面token不能使用,后来我是从后台新增了一个api key。对改token进行base编码,从rancher进去到集群界面打开kubectl控制台,运行 echo -n token-sj5fc:x47bbk97cwmtt6btx6nvx5mw8tj99mf6l7pk269dlhbr9v8hv8skbm | base64 -w 0返回base64编码。

不使用api server地址而使用Kubeconfig里面rancher的集群访问地址,也可以从Kubectl控制台输入kubectl cluster-info查找api server地址。在k8s里面添加serect资源

apiVersion: v1
kind: Secret
metadata:
  name: emqx-secret
type: Opaque
data:
  token: dG9rZW4tc2o1ZmM6eDQ3YmJrOTdjd210dDZidHg2bnZ4NW13OHRqOTltZjZsN3BrMjY5ZGxoYnI5djhodjhza2Jt

添加好后添加deployment,service资源

apiVersion: v1
kind: Service
metadata:
  name: emqx
spec:
  ports:
  - port: 10001
    nodePort: 10001
    targetPort:  emqx-dashboard
    protocol: TCP
  selector:
    app: emqx
  type: NodePort

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: emqx
  labels:
        app: emqx
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: emqx
    spec:
      volumes:
      - name: emqx-secret
        secret:
          secretName: emqx-secret
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: worktype1
                operator: In
                values:
                - emq
      containers:
      - name: emqx
        image: emqx/emqx:v3.1.0
        ports:
        - name: emqx-dashboard
          containerPort: 18083
        - name: emqx-http
          containerPort: 8083
        - name: emqx-mqtt
          containerPort: 1883
        - name: emqx-management
          containerPort: 8080
        env:
        - name: EMQX_CLUSTER__DISCOVERY
          value: k8s
        - name: EMQX_NAME
          value: emqx
        - name: EMQX_CLUSTER__K8S__APISERVER
          value: https://rancher.domain.com/k8s/clusters/c-m62j9
        - name: EMQX_CLUSTER__K8S__NAMESPACE
          value: emqcluster
        - name: EMQX_CLUSTER__K8S__SERVICE_NAME
          value: emqx
        - name: EMQX_CLUSTER__K8S__ADDRESS_TYPE
          value: ip
        - name: EMQX_CLUSTER__K8S__APP_NAME
          value: emqx
        tty: true
        volumeMounts:
          - name: emqx-secret
            mountPath: "/var/run/secrets/kubernetes.io/serviceaccount"
            readOnly: true

这里为止整个能跑起来了,但有个就是如果发生pod转移或者重启之前设置信息都没了,需要对一些目录做持久化处理

比如以下目录

volumes:
  - ./emqx/log:/opt/emqx/log #working
  - ./emqx/data/mnesia:/opt/emqx/data/mnesia #working
  - ./emqx/lib:/opt/emqx/lib #not working
  - ./emqx/etc:/opt/emqx/etc/plugins/ #not working

参考:https://github.com/emqx/emqx-docker

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐