共计 3735 个字符,预计需要花费 10 分钟才能阅读完成。
Kubernetes Ingress 介绍
通常状况下,Kubernetes 集群内的网络环境与内部是隔离的,也就是说 Kubernetes 集群内部的客户端无奈间接拜访到集群外部的服务,这属于不同网络域如何连贯的问题。解决跨网络域拜访的惯例做法是为指标集群引入一个入口点,所有内部申请指标集群的流量必须拜访这个入口点,而后由入口点将内部申请转发至指标节点。
同样,Kubernetes 社区也是通过增设入口点的计划来解决集群外部服务如何对外裸露的问题。Kubernetes 一贯的风格是通过定义规范来解决同一类问题,在解决集群对外流量治理的问题也不例外。Kubernetes 对集群入口点进行了进一步的对立形象,提出了 3 种解决方案:NodePort、LoadBalancer 和 Ingress。下图是这三种计划的比照:
通过以上比照,咱们能够发现,NodePort 和 LoadBalancer 次要工作在四层流量上,只能用于裸露集群中一个服务。当集群中对外裸露的服务数量增多时,NodePort 计划最终会因端口耗尽而无奈裸露更多的服务,而 LoadBalancer 计划则会引入等同数量的 SLB,在减少老本的同时也给运维带来肯定的累赘。定位在七层流量上的 Ingress 计划能够通过定义基于虚拟主机域和门路的路由规定来实现对集群中服务的代理,Ingress 与后端服务是一对多的关系,无效的升高了机器老本。
此外,因为内部拜访集群中服务的所有入口流量都先通过共享的 Ingress Provider 节点,所以集群管理者能够在 Ingress Provider 中额定施行拜访控制策略来保障集群中服务的安全性和稳定性,并且能够通过采集监控指标、记录拜访日志以及开启链路追踪来加强可观测建设。因而,目前 Ingress 计划是支流的抉择。
Kubernetes Ingress Provider 介绍
上文提到,Ingress 是 Kubernetes 应答集群治理内部拜访流量的场景形象进去一个资源对象,用来形容集群内部如何拜访集群外部服务的形式。通过 Ingress 资源来配置不同的转发规定,从而达到依据不同的规定设置内部拜访集群内不同的 Service 所对应的后端 Pod。Ingress Provider 是实在存在的 Workload 节点,是真正意义上 Ingress 规定的实现者与执行者。Kubernetes 提出 Ingress 的标准,将 Ingress 具体实现形式交给各种 Provider 以及云提供商,无效保障了 Ingress 不会被具体的 Provider 或者云厂商绑定,合乎 Kubernetes 始终秉承的凋谢、规范的思维。
在云原生技术浪潮下,Ingress Provider 产品种类如雨后春笋般涌现,其中用户知名度最高当属 Kubernetes Nginx Ingress。接下来会简略介绍一下 Nginx Ingress Controller 和阿里云推出的下一代网关——MSE Ingress Controller(MSE 云原生网关)。
Nginx Ingress Controller
Nginx Ingress Controller 是由 Kubernetes 官网保护的,外部由 Controller 和数据面 Nginx 组成。Nginx Ingress Controller 由用户部署在 Kubernetes 集群中,通过拜访集群的 API Server 来实时监听用户利用到集群中的 Ingress 资源,经 Controller 解析并转化为 Nginx 配置文件(nginx.conf),而后通过 reload 数据面 Nginx 的形式使得配置失效。
当内部申请拜访集群入口点 Nginx Ingress Controller 时,匹配 Nginx Ingress 转发规定的流量转发到后端 Service 所对应的 Pod,由 Pod 解决内部申请,其流程图如下:
MSE Ingress Controller(MSE 云原生网关)
随着云原生技术继续演进,云原生利用微服务化不断深入,Nginx Ingress 在面对简单路由规定配置、反对多种应用层协定(Dubbo 和 QUIC 等)、服务拜访的安全性以及流量的可观测性等问题上略显疲乏。
为了解决用户对大规模流量治理的强烈诉求,MSE 云原生网关应运而生,这是阿里云推出的兼容规范 Ingress 标准的下一代网关,具备低成本、平安、高集成和高可用的产品劣势。将传统的流量网关和微服务网关合并,在升高 50% 资源老本的同时为用户提供了精细化的流量治理能力,反对 ACK 容器服务、Nacos、Eureka、固定地址、FaaS 等多种服务发现形式,反对多种认证登录形式疾速构建平安防线,提供全方面、多视角的监控体系,如指标监控、日志剖析以及链路追踪,并且反对解析单、多 Kubernetes 集群模式下的规范 Ingress 资源,满足云原生利用场景下以申明式进行对立流量治理的诉求。
MSE Ingress Controller 通过 List-Watch 机制获取关联的 ACK 集群中 Ingress 资源的变动,而后以热更新的形式动静更新 MSE 云原生网关的路由规定。当 MSE 云原生网关收到申请时,匹配 Ingress 转发规定转发申请到后端 Service 所对应的 Pod。
相比 Nginx Ingress Controller,首先 MSE Ingress Controller 是以热更新的形式秒级失效监听到的 Ingress 资源,这种无需重启数据面即可失效配置的形式大大提高了集群入口网关的稳定性,无效保障了业务流量无损。更重要的是,MSE Ingress Controller 能够进行多集群治理,即同时作为多个集群的入口网关,意味着能够同时监听多个集群中的 Ingress 资源,解决用户跨 Kubernetes 集群流量调度和流量治理问题。
下图是 MSE Ingress Controller 在多 ACK 集群模式下 Ingress 的利用场景。
通过 MSE 云原生网关解析 Ingress
咱们将基于 MSE 云原生网关和阿里云 ACK 产品进行实际,由云原生网关解析并执行 ACK 集群中定义的 Ingress 资源,实现对外裸露 ACK 集群中指定服务。
前提条件
• 已领有一个 MSE 云原生网关
• 已领有一个 ACK 运维集群
步骤一:关联 ACK 集群并配置监听 Ingress
- 在 MSE 云原生网关控制台 -> 服务治理 -> 起源治理中,关联对应的 ACK 集群,开启监听 Kubernetes Ingress 配置,并配置 IngressClass 和监听的指标命名空间。
步骤二:部署服务
创立并拷贝以下内容到 httpbin.yaml 文件中,用于部署名称为 httpbin Deployment,以及名称为 httpbin 的 Service,而后利用到 ACK 集群中。
apiVersion: v1
kind: Service
metadata:
name: httpbin
labels:
app: httpbin
service: httpbin
spec:
ports:
- name: http
port: 8000
targetPort: 80
selector:
app: httpbin
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin
spec:
replicas: 1
selector:
matchLabels:
app: httpbin
template:
metadata:
labels:
app: httpbin
spec:
containers:
- image: mse-gw-demo-registry.cn-hangzhou.cr.aliyuncs.com/gw/httpbin
imagePullPolicy: IfNotPresent
name: httpbin
ports:
- containerPort: 80
步骤三:配置 Ingress
创立并拷贝以下内容到 ingress.yaml 中,而后利用到 ACK 集群中。
ACK 1.19 版本之前
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-demo
spec:
rules:
- host: test.com
http:
paths:
- path: /ip
backend:
serviceName: httpbin
servicePort: 800
ACK 1.19 及之后版本
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-demo
spec:
rules:
- host: test.com
http:
paths:
- path: /ip
backend:
service:
name: httpbin
port:
number: 8000
pathType: Exact
步骤四:拜访服务
在 MSE 云原生网关控制台的根本信息查看网关 IP 地址。
通过以下命令行测试拜访服务。
curl -H "host: test.com" 47.97.127.61/ip
预期后果:
{"origin": "x.x.x.x"}
步骤五:查看域名、路由相干配置
咱们能够在 MSE 云原生网关控制台查看已监听的域名和路由相干的配置,例如,上述 ingress.yaml 在云原生网关控制台的解析后果。
域名治理如下:
路由治理如下: