Ingress 介紹
Ingress 公開了從集羣外部到集羣內 服務 的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 資源上定義的規則控制。官網的一個簡單示例如下:
Ingress 爲服務提供了供外部訪問的 URL,負載均衡流量,TLS/SSL 終止的能力。Ingress 可以簡單理解爲服務的服務,通過獨立的 Ingress 對象來指定請求轉發的規則,將請求路由到對應的服務中。
爲了讓 Ingress 資源工作,集羣必須有一個正在運行的 Ingress 控制器。 NGINX Ingress Controller 是由 Kubernetes 提供支持和維護的一個控制器。
本文主要介紹如何通過 NGINX Ingress Controller 來訪問 Kubernetes 集羣中的 EMQ X。
準備
開始之前,請確保您已經搭建好了一個可用的 Kubernetes 集羣,本文示例是基於阿里雲標準版託管集羣。
安裝 EMQ X
參考 emqx charts ,使用 Helm 進行安裝
$ helm repo add emqx https://repos.emqx.io/charts
$ kubectl create ns my-emqx
$ helm install my-emqx emqx/emqx -n my-emqx
確保 pod 處於 running 狀態
$ kubectl get pod -n my-emqx
NAME READY STATUS RESTARTS AGE
my-emqx-0 1/1 Running 0 97s
my-emqx-1 1/1 Running 0 73s
my-emqx-2 1/1 Running 0 51s
查看 service
$ kubectl get svc -n my-emqx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-emqx ClusterIP 172.21.5.160 <none> 1883/TCP,8883/TCP,8081/TCP,8083/TCP,8084/TCP,18083/TCP 5m
my-emqx-headless ClusterIP None <none> 1883/TCP,8883/TCP,8081/TCP,8083/TCP,8084/TCP,18083/TCP,4370/TCP 5m
部署 NGINX Ingress Controller
參考 Installation Guide,根據不同情況選擇不同的配置進行安裝,也可以通過 Helm 安裝
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
$ helm repo update
$ helm install my-release ingress-nginx/ingress-nginx
因爲本文基於阿里雲集羣,可以直接選擇組件安裝
查看 service
$ Kubectl get nginx-ingress-lb svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
nginx-ingress-lb LoadBalancer 172.21.6.205 47.99.187.164 80:30639/TCP,443:30396/TCP 3m12s
創建 Ingress 對象
# ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
name: emqx
spec:
rules:
- host: emqx.cn.iotdp.cn
http:
paths:
- backend:
serviceName: my-emqx
servicePort: 18083
path: /
- backend:
serviceName: my-emqx
servicePort: 8083
path: /mqtt
路由規則:
- 匹配
/mqtt
路由到 8083 Websocket 端口 - 其餘路徑路由到 18083 dashboard
部署資源
$ kubectl apply -f ingress.ymal -n my-emqx
部署完成以後,修改 DNS 解析,便可以通過:http://emqx.cn.iotdp.cn 來訪問 dashboard
然後通過 8083
和 /path
訪問 Websocket
TCP
Ingress 不支支持 TCP 和 UDP 服務,因此 Ingress 使用 --tcp-services-configmap
和 --udp-services-configmap
指向一個包含端口映射關係的 configmap
來訪問,key 爲外部暴露的端口,value 格式爲:<namespace/service name>:<service port>:[PROXY]:[PROXY]
首先修改 ingress-nginx deployment
$ kubectl edit deployment nginx-ingress-controller -n kube-system
添加以下內容到spec.template.spec.containers.args
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
containers:
- args:
- /nginx-ingress-controller
- '--configmap=$(POD_NAMESPACE)/nginx-configuration'
- '--annotations-prefix=nginx.ingress.kubernetes.io'
- '--publish-service=$(POD_NAMESPACE)/nginx-ingress-lb'
- '--tcp-services-configmap=$(POD_NAMESPACE)/tcp-services'
- '--udp-services-configmap=$(POD_NAMESPACE)/udp-services'
配置 tcp-service
# tcp-service.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: ingress-nginx
data:
1883: "my-emqx/my-emqx:1883"
最後在服務中配置對應端口
$ kubectl edit svc nginx-ingress-lb -n kube-system
配置如下
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-ingress-lb
name: nginx-ingress-lb
namespace: kube-system
spec:
type: LoadBalancer
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
- name: https
port: 443
protocol: TCP
targetPort: 443
- name: emqx-tcp
port: 1883
protocol: TCP
targetPort: 1883
selector:
app: ingress-nginx
查看 ingress-nginx 服務
$ kubectl get svc nginx-ingress-lb -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-ingress-lb ClusterIP 172.21.11.90 <none> 80:30639/TCP,443:30396/TCP,1883:30657/TCP 13m
我們便可以通過 1883
端口連接到 EMQ X 服務了。
版權聲明: 本文爲 EMQ 原創,轉載請註明出處。
原文鏈接:https://www.emqx.io/cn/blog/access-emqx-in-kubernetes-cluster-through-nginx-ingress-controller