通过 NGINX Ingress Controller 访问 Kubernetes 集群中的 EMQ X

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值