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-emqxNAME        READY   STATUS    RESTARTS   AGEmy-emqx-0   1/1     Running   0          97smy-emqx-1   1/1     Running   0          73smy-emqx-2   1/1     Running   0          51s

查看 service

$ kubectl get svc -n my-emqxNAME               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                                                           AGEmy-emqx            ClusterIP   172.21.5.160   <none>        1883/TCP,8883/TCP,8081/TCP,8083/TCP,8084/TCP,18083/TCP            5mmy-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-systemNAME               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.yamlapiVersion: extensions/v1beta1kind: Ingressmetadata:  annotations:    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"  name: emqxspec:  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.yamlapiVersion: v1kind: ConfigMapmetadata:  name: tcp-services  namespace: ingress-nginxdata:  1883: "my-emqx/my-emqx:1883"

最初在服务中配置对应端口

$ kubectl edit svc nginx-ingress-lb -n kube-system

配置如下

apiVersion: v1kind: Servicemetadata:  labels:    app: nginx-ingress-lb  name: nginx-ingress-lb  namespace: kube-systemspec:  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-systemNAME               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              AGEnginx-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