• 通过 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

  • 相关阅读:
    Writing Layout Tests for DumpRenderTree – WebKit
    阻碍Web开放的不是WebKit,而是Web开发者的短视
    Running Selenium 'headless' with Chrome Driver in Python YouTube
    百度开发者大会:愿与开发者合作共赢
    Nginx进行流量copy到测试环境
    Minimize to tray 1.3.2.61
    Smart Caching for Web Browsers
    Objective of the Guidelines
    美丽说胡嵩:APP只做一件事 价值定位要清晰 | 马可咪
    Writing Layout Tests for DumpRenderTree – WebKit
  • 原文地址:https://www.cnblogs.com/emqx/p/14119008.html
Copyright © 2020-2023  润新知