安裝 EMQX 到 Kubernetes 上
如何使用 emqx-operator 建立 EMQX 服務到 Kubernetes 上。
Note
emqx-operator 是用 Helm 的腳本,可以快速定義 EMXQ 服務。
引用 Github 上的架構圖,如下:

從架構圖上可以看到兩款 EMQX Operator、EMQX Cluster 則為我們要建立的服務。
EMQX Operator
為 EMQX 的 CRD,是需要最先建立的資源,建立命令如下。
1helm upgrade --install emqx-operator emqx/emqx-operator \
2--namespace emqx-operator-system \
3--create-namespace \
4--version 2.2.5 -f values.yaml
上面命令包括了 values.yaml
檔案,內容如下。主要是使服務更可以建立在指定的 nodes 中。
1image:
2 repository: emqx/emqx-operator-controller
3 tag: 2.2.5
4imagePullSecrets: []
5replicaCount: 1
6resources:
7 limits:
8 cpu: 500m
9 memory: 512Mi
10 requests:
11 cpu: 100m
12 memory: 128Mi
13affinity:
14 nodeAffinity:
15 requiredDuringSchedulingIgnoredDuringExecution:
16 nodeSelectorTerms:
17 - matchExpressions:
18 - key: "lindu-tech/server"
19 operator: In
20 values:
21 - "infra"
22tolerations:
23 - key: "lindu-tech/server"
24 operator: "Exists"
25 effect: "NoSchedule"
26affinity:
27 podAntiAffinity:
28 requiredDuringSchedulingIgnoredDuringExecution:
29 - labelSelector:
30 matchExpressions:
31 - key: "app.kubernetes.io/name"
32 operator: In
33 values:
34 - "emqx-operator"
35 topologyKey: "kubernetes.io/hostname"
EMQX Cluster
建立好 EMQX Operator 後,可以使用 Kind: EMQX
,接著才建立 EMQX Cluster。
創建一個 emqx-cluster.yaml 檔案,內容如下。服務只開啟了 listeners.tcp.default
,其他因為使用不到所以皆關閉。其服務是使用 nodePort 的方式揭露,port 的位置需自行地義,不要衝突。
1apiVersion: apps.emqx.io/v2beta1
2kind: EMQX
3metadata:
4 name: emqx
5spec:
6 image: emqx:5.3.2
7 config:
8 data: |
9 listeners.tcp.default {
10 enable = true
11 bind = "0.0.0.0:1883"
12 max_connections = 1024
13 max_conn_rate = "1000/s"
14 }
15 listeners.wss.default {
16 enable = false
17 }
18 listeners.ssl.default {
19 enable = false
20 }
21 listeners.ws.default {
22 enable = false
23 }
24 coreTemplate:
25 spec:
26 volumeClaimTemplates:
27 storageClassName: sas
28 resources:
29 requests:
30 storage: 5Mi
31 accessModes:
32 - ReadWriteOnce
33 replicas: 1
34 resources:
35 requests:
36 cpu: 200m
37 memory: 256Mi
38 replicantTemplate:
39 spec:
40 replicas: 1
41 resources:
42 requests:
43 cpu: 250m
44 memory: 256Mi
45 listenersServiceTemplate:
46 spec:
47 type: NodePort
48 ports:
49 # - name: wss-default
50 # nodePort: 31081
51 # port: 8084
52 # protocol: TCP
53 # targetPort: 8084
54 # - name: ssl-default
55 # nodePort: 31082
56 # port: 8883
57 # protocol: TCP
58 # targetPort: 8883
59 - name: tcp-default
60 nodePort: 31083
61 port: 1883
62 protocol: TCP
63 targetPort: 1883
64 # - name: ws-default
65 # nodePort: 31084
66 # port: 8083
67 # protocol: TCP
68 # targetPort: 8083
69 dashboardServiceTemplate:
70 spec:
71 type: NodePort
72 ports:
73 - name: tcp-default
74 nodePort: 32083
75 port: 18083
76 protocol: TCP
77 targetPort: 18083
定義建立好後,運行下面命令創建資源,資源會建立在預設的 namespace 中。
1kubectl apply -f emqx-cluster.yaml
2
3# 確認資源狀態
4kubectl get emqx
5NAME STATUS AGE
6emqx Ready 5d18h
配置 SSL 連線
EMQX 有整合 cert-manager
服務,可以透過配置執行憑證的申請,但是憑證只能在與 EMQX Operator 同個 namespace 中,以上面的命令為例就會建立在 namespace emqx-operator-system
裡面。
如果 EMQX Operator 與 EMQX Cluster 不在同個 namespace 中的話,就會取不到憑證,所以要另外配置,下面為配置方式。
收先要先使用 cert-manager 做憑證的申請並建立 secret,建立一個 test-mqtt.example.com.yaml 檔案,內容如下。
1apiVersion: cert-manager.io/v1
2kind: Certificate
3metadata:
4 labels:
5 app.kubernetes.io/instance: emqx
6 app.kubernetes.io/name: emqx
7 name: test-mqtt.example.com
8spec:
9 dnsNames:
10 - test-mqtt.example.com
11 duration: 2160h0m0s
12 issuerRef:
13 group: cert-manager.io
14 kind: ClusterIssuer
15 name: letsencrypt-http01
16 renewBefore: 360h0m0s
17 secretName: test-mqtt.example.com
18 usages:
19 - digital signature
20 - key encipherment
運行上面定義的 yaml 來建立資源,執行憑證的申請。
1kubectl apply -f test-mqtt.example.com.yaml
接著配置 EMQX Cluster 的憑證掛載,
1apiVersion: apps.emqx.io/v2beta1
2kind: EMQX
3metadata:
4 name: emqx
5spec:
6 image: emqx:5.3.2
7 config:
8 data: |
9 listeners.tcp.default {
10 enable = true
11 bind = "0.0.0.0:1883"
12 max_connections = 1024
13 max_conn_rate = "1000/s"
14 }
15 listeners.ssl.default {
16 enable = true
17 bind = "0.0.0.0:8883"
18 max_connections = 1024
19 max_conn_rate = "1000/s"
20 ssl_options {
21 cacertfile = "/mounted/cert/ca.crt"
22 certfile = "/mounted/cert/tls.crt"
23 keyfile = "/mounted/cert/tls.key"
24 gc_after_handshake = true
25 handshake_timeout = 5s
26 }
27 }
28 listeners.wss.default {
29 enable = false
30 }
31 listeners.ws.default {
32 enable = false
33 }
34 coreTemplate:
35 spec:
36 volumeClaimTemplates:
37 storageClassName: sas
38 resources:
39 requests:
40 storage: 5Mi
41 accessModes:
42 - ReadWriteOnce
43 replicas: 1
44 resources:
45 requests:
46 cpu: 200m
47 memory: 256Mi
48 extraVolumes:
49 - name: emqx-tls
50 secret:
51 secretName: test-mqtt.example.com
52 extraVolumeMounts:
53 - name: emqx-tls
54 mountPath: /mounted/cert
55 replicantTemplate:
56 spec:
57 replicas: 1
58 resources:
59 requests:
60 cpu: 250m
61 memory: 256Mi
62 extraVolumes:
63 - name: emqx-tls
64 secret:
65 secretName: test-mqtt.example.com
66 extraVolumeMounts:
67 - name: emqx-tls
68 mountPath: /mounted/cert
69 listenersServiceTemplate:
70 spec:
71 type: NodePort
72 ports:
73 # - name: wss-default
74 # nodePort: 30712
75 # port: 8084
76 # protocol: TCP
77 # targetPort: 8084
78 - name: ssl-default
79 nodePort: 31082
80 port: 8883
81 protocol: TCP
82 targetPort: 8884
83 - name: tcp-default
84 nodePort: 31083
85 port: 1883
86 protocol: TCP
87 targetPort: 1884
88 # - name: ws-default
89 # nodePort: 31394
90 # port: 8083
91 # protocol: TCP
92 # targetPort: 8083
93 dashboardServiceTemplate:
94 spec:
95 type: NodePort
96 ports:
97 - name: tcp-default
98 nodePort: 32084
99 port: 18083
100 protocol: TCP
101 targetPort: 18083
接著執行配置更新,就可以使用 mqtts:// 來做連線。
1kubectl apply -f emqx-cluster.yaml
test
使用工具 mqttx 工具做測試,看連線次是否有成功建立。
comments powered by Disqus