无缝融入 Kubernetes 生态 | 云原生网关支持 Ingress 资源
简介:Kubernetes 一贯的作风是通过定义标准来解决同一类问题,在解决集群对外流量管理的问题也不例外。Kubernetes 对集群入口点进行了进一步的统一抽象,提出了 3 种解决方案:NodePort、LoadBalancer 和 Ingress。
作者:扬少
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 在云原生网关控制台的解析结果。
域名管理如下:
路由管理如下:
本文为阿里云原创内容,未经允许不得转载。
无缝融入 Kubernetes 生态 | 云原生网关支持 Ingress 资源的更多相关文章
- 不懂 Kubernetes 实现云原生是什么体验?
云原生的本质和最终效果 要明白什么是云原生,就要先弄明白云计算是什么有什么问题,云计算将计算资源.网络.存储等基础设施统一管理,通过资源规模化和自动化管理,实现降低资源的成本和提高资源的管理效率,云计 ...
- 《Kubernetes与云原生应用》系列之容器设计模式
http://www.infoq.com/cn/articles/kubernetes-and-cloud-native-app-container-design-pattern <Kubern ...
- 从Kubernetes到“云原生全家桶”,网易如何让业务部署提效280%?
近日,网易云轻舟微服务团队接受了CNCF的采访,分享了网易云在云原生领域尤其是Kubernetes方面的实践经验.以下为案例全文:公司:网易地点:中国杭州行业:互联网技术 挑战它的游戏业务是世界上最大 ...
- 从CLR GC到CoreCLR GC看.NET Core对云原生的支持
内存分配概要 前段时间在园子里看到有人提到了GC学习的重要性,很赞同他的观点.充分了解GC可以帮助我们更好的认识.NET的设计以及为何在云原生开发中.NET Core会占有更大的优势,这也是一个程序员 ...
- Kubernetes构建云原生架构-图解
- 云原生之旅 - 9)云原生时代网关的后起之秀Envoy Proxy 和基于Envoy 的 Emissary Ingress
前言 前一篇文章讲述了基于Nginx代理的Kuberenetes Ingress Nginx[云原生时代的网关 Ingress Nginx]这次给大家介绍下基于Envoy的 Emissary Ingr ...
- 第七章 云原生生态的基石 Kubernetes
7.1 Kubernetes架构 K8s的核心组件: etcd: 协同存储,负责保存整个集群的状态. API:资源操作的唯一入口. controller manager: 维护集群的状态,执行故障检测 ...
- Kubernetes 入门必备云原生发展简史
作者|张磊 阿里云容器平台高级技术专家,CNCF 官方大使 "未来的软件一定是生长于云上的"这是云原生理念的最核心假设.而所谓"云原生",实际上就是在定义一条能 ...
- 云原生时代, Kubernetes 多集群架构初探
为什么我们需要多集群? 近年来,多集群架构已经成为“老生常谈”.我们喜欢高可用,喜欢异地多可用区,而多集群架构天生就具备了这样的能力.另一方面我们也希望通过多集群混合云来降低成本,利用到不同集群各自的 ...
- 云原生2.0网关API标准发展趋势
摘要:Gateway API希望取代Ingress API. 本文分享自华为云社区<云原生2.0网关API标准发展趋势>,作者:华为云云原生团队 . 云原生网关API标准背景及发展现状 G ...
随机推荐
- .net core 多线程下使用 Random 会出现bug
.net core 多线程下使用 Random 会出现的bug 先看原文: Working with System.Random and threads safely in .NET Core and ...
- 舒服了,学习了,踩到一个 Lombok 的坑!
你好呀,我是歪歪. 踩坑了啊,最近踩了一个 lombok 的坑,有点意思,给你分享一波. 我之前写过一个公共的服务接口,这个接口已经有好几个系统对接并稳定运行了很长一段时间了,长到这个接口都已经交接给 ...
- KingbaseES V8R6 备份恢复案例--异机备份ssh认证失败
案例说明: 在生产环境,数据库服务被重启后,监控发现数据库物理备份的脚本无法执行,故障现象如下所示,从备份日志和sys_log中都出现了远程主机连接认证错误. 1)备份日志:(连接数据库服务器认证错误 ...
- wordpress自建博客站,为文章添加显示浏览次数功能
wordpress自建博客站,为文章添加显示浏览次数功能 笔者使用的主题是 GeneratePress 版本:3.1.3 1.后台文章管理列表添加浏览次数列 效果如图: 实现: 编辑funct ...
- 4 HTML表格标签
4 表格标签 表格标签也是一种复合标签.由:table,tr,td,th,thead,tbody组合,由行和列组合成,行和列交叉的地方就是单元格.在HTML中使用table来定义表格.网页的表格和办公 ...
- #树上带修莫队,树链剖分#洛谷 4074 [WC2013]糖果公园
题目 分析 考虑将树转换成序列求解,那就用欧拉序,入栈一次出栈一次正好抵消掉 注意当起点不是LCA的时候要将起点加入,剩下就是带修莫队板子题了 代码 #include <cstdio> # ...
- 【Kotlin】函数
1 常规函数 1.1 无参函数 fun main() { myFun() } fun myFun() { println("myFun") // 打印: myFun } 1.2 有 ...
- JDK14性能管理工具:Jconsole详解
目录 简介 JConsole 概览 内存 线程 类 VM信息 MBean 总结 简介 我们在开发java项目的时候,或多或少都会去用到Java的性能管理工具.有时候是为了提升应用程序的性能,有时候是为 ...
- JDK14的新特性:JFR,JMC和JFR事件流
目录 简介 JFR JMC 创建JFR 分析JFR JFR事件 JFR事件流 总结 JDK 14的新特性:JFR,JMC和JFR事件流 简介 Java Flight Recorder(JFR)是JVM ...
- OpenHarmony社区运营报告(2023年2月)
本月快讯 • 2023年2月25日,以"技术构筑万物智联"为主题的第一届开放原子开源基金会OpenAtom OpenHarmony(以下简称"OpenHarmony& ...