共计 3376 个字符,预计需要花费 9 分钟才能阅读完成。
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