k8s 中的 Ingress 简介

一、关于 Ingress

Ingress 是 K8s 中的一个 API 对象,用于管理和配置外部对集群内服务的访问。它可定义 HTTP 和 HTTPS 路由规则,将请求从集群外部的负载均衡器引导到相应的服务。Ingress 的灵活性使得我们能够实现高级的应用程序路由、SSL 终端和负载均衡等功能。

通过 Ingress,我们可以将集群内的多个服务暴露到外部,并根据需要进行定制化的路由设置,这为应用的扩展和灵活部署提供了便利。

Ingress 有哪些用途:

  • 统一入口控制。Ingress 提供了一个统一的入口点,用于管理多个服务的访问和流量控制。

  • HTTP/HTTPS 路由。通过 Ingress,可以配置基于主机名和路径的路由规则,将外部请求定向到集群内部的服务。

  • SSL 终止。Ingress 可以配置 SSL 证书,用于加密和解密外部流量,从而确保数据传输的安全性。

  • 负载均衡。通过 Ingress 控制器,可以实现对多实例服务的负载均衡,将请求分发到多个后端实例。

Ingress 能正常工作,主要涉及两个关键组件:Ingress 资源和控制器

资源就是用户定义的 Kubernetes 资源,描述了主机名、路径和后端服务之间的映射关系

控制器是实现 Ingress 规则的实际组件。常见的 Ingress 控制器包括 Nginx、Traefik 和 HAProxy 等等。控制器监控 Ingress 资源的变化,并相应地配置其代理服务器,以实现路由和流量管理。

Ingress 的工作流程:

  • 定义 Ingress 资源。用户创建 Ingress 资源,定义了主机名、路径和后端服务的映射。

  • Ingress 控制器监控。Ingress 控制器不断监控 Ingress 资源的变化。

  • 配置代理服务器。根据 Ingress 资源的定义,Ingress 控制器配置其代理服务器(如 NGINX)以匹配请求。

  • 处理请求。当外部请求到达集群时,Ingress 控制器的代理服务器根据 Ingress 规则进行路由,将请求转发到相应的服务。

Ingress 的应用场景:

  • 多服务管理。适用于需要管理多个服务的环境,通过 Ingress 实现统一的入口控制。

  • 基于域名的路由。在同一个集群中运行多个应用,通过不同的域名或子域名进行访问。

  • 基于路径的路由。根据请求路径将流量路由到不同的服务,例如 /api 路径指向一个微服务,/web 路径指向另一个微服务。

  • SSL 终止。需要使用 HTTPS 加密流量的场景,通过 Ingress 配置 SSL 证书进行终止。

  • 负载均衡。在多实例服务间进行负载均衡,以提高服务的可用性和扩展性。

二、Ingress 的结构和配置示例

2.1 Ingress 配置的基本结构

  • 规则(Rules):每个 Ingress 对象可以包含多个规则,每个规则定义了一组路径匹配规则和与之关联的后端服务。

  • 后端服务(Backend Services):规则中指定的后端服务是 Ingress 路由请求到达时的目标服务。这可以是集群中的 Service、Pod 或外部服务。

  • 路径(Paths):路径定义了应该如何将请求路由到后端服务。可以使用通配符和正则表达式进行路径匹配。

  • TLS(Transport Layer Security):Ingress 还支持 TLS,用于启用 HTTPS。TLS 配置包括证书和密钥,确保数据在传输过程中的安全性。

下面是一个简单的 Ingress 对象的例子:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata: # 包含了资源的元数据,如名称、标签等name: my-ingress
spec:rules: # 定义了一组规则,用于匹配传入的 HTTP 请求并将其路由到后端服务,可多个- host: mydomain.com # 指定了此规则适用于哪个主机名http: # 定义了HTTP相关的配置paths: # 定义了一系列路径和它们对应的后端服务# 指定了路径的前缀,这里是 /app# 这意味着所有以 /app 开头的请求都将被路由到这个路径下- path: /app # 指定了路径的类型,这里是 Prefix,表示路径前缀匹配pathType: Prefixbackend: # 定义了后端 Service 服务的详细信息service:name: my-app-service # 后端服务的名称 nameport:number: 80tls: # 定义了 TLS 配置,用于加密传输- hosts: #  指定了哪些主机名需要使用 TLS 加密- mydomain.com# 指定了存储 TLS 证书和密钥的 Secret 的名称secretName: my-tls-secret

在这个例子中,我们定义了一个 Ingress 对象,它将 mydomain.com/app 的请求路由到名为 my-app-service 的 Service,并启用了 HTTPS。

2.2 Ingress 的使用实例

为了更好地理解 Ingress 的使用,下面例举一个具体的示例来演示。

假设我们有一个 Web 应用,包括前端(frontend)和后端(backend)服务。现在,我们希望通过 Ingress 将这两个服务暴露到外部,并在路径上进行定制化的路由。

首先,我们创建前端和后端的 Deployment 和 Service:

Deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:name: frontend
spec:replicas: 3selector:matchLabels:app: frontendtemplate:metadata:labels:app: frontendspec:containers:- name: web-serverimage: my-frontend-image:latestports:- containerPort: 80

两个 Service:

apiVersion: v1
kind: Service
metadata:name: frontend-service
spec:selector:app: frontendports:- protocol: TCPport: 80targetPort: 80
yamlapiVersion: apps/v1
kind: Deployment
metadata:name: backend
spec:replicas: 3selector:matchLabels:app: backendtemplate:metadata:labels:app: backendspec:containers:- name: api-serverimage: my-backend-image:latestports:- containerPort: 8080

apiVersion: v1
kind: Service
metadata:name: backend-service
spec:selector:app: backendports:- protocol: TCPport: 8080targetPort: 8080

Ingress 对象:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: my-ingress
spec:rules:- host: mydomain.comhttp:paths:- path: /frontendpathType: Prefixbackend:service:name: frontend-serviceport:number: 80- path: /backendpathType: Prefixbackend:service:name: backend-serviceport:number: 8080tls:- hosts:- mydomain.comsecretName: my-tls-secret

在这个示例中,我们定义了一个 Ingress 对象,它将 mydomain.com/frontend 的请求路由到前端服务,将 mydomain.com/backend 的请求路由到后端服务。此外,我们还启用了 HTTPS,并指定了 TLS 证书的 Secret。

2.3 动态更新 Ingress 规则

Ingress 的一个强大之处在于它支持动态更新。

当路由规则需要调整时,可以直接修改 Ingress 对象,而不需要重启应用或重新创建服务。

如下配置示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: my-ingress
spec:rules:- host: mydomain.comhttp:paths:- path: /frontendpathType: Prefixbackend:service:name: frontend-serviceport:number: 80tls:- hosts:- mydomain.comsecretName: my-tls-secret

在这个例子中,我们仅保留了前端服务的路由规则。然后,通过应用这个更新后的 Ingress 对象,K8s 将自动更新负载均衡器的配置,使得只有 mydomain.com/frontend 的请求能够到达前端服务。

参考:https://zhuanlan.zhihu.com/p/676245770      

三、外部请求的大概链路

如上图,大概的请求链路如下:

1)用户从 web/mobile/pc 等客户端发出 HTTP/HTTPS 请求。

2)由于应用服务通常是通过域名的形式对外暴露,所以请求将会先进行 DNS 域名解析,得到对应的公网 IP 地址。

3)公网 IP 地址通常会绑定一个 Load Balancer 负载均衡器,此时请求会进入此负载均衡器。

  • 负载均衡器可以是硬件,也可以是软件,它通常会保持稳定(固定的公网 IP 地址),因为如果切换 IP 地址会因为 DNS 缓存的原因导致服务某段时间内不可达

  • 负载均衡器是一个重要的中间层,对外承接公网流量,对内进行流量的管理和转发。

4)Load Balancer 再将请求转发到 k8s 集群的某个流量入口点,通常是 Ingress

  • Ingress 负责集群内部的路由转发,可以看成是集群内部的网关。

  • Ingress 只是配置,具体进行流量转发的是 Ingress-controller,后者有多种选择,比如 Nginx、HAProxy、Traefik、Kong 等等。

5)Ingress 根据用户自定义的路由规则进一步转发到 service。

  • 比如根据请求的 Path 路径做转发

  • 根据请求的 Host 做转发

6)Service 根据 selector(匹配 label 标签)将请求转发到 Pod。

  • Service 有多种类型,集群内部默认的类型就是 ClusterIP。

  • Service 本质上也只是一种配置,这种配置最终会作用到 Node 节点上的 kube-proxy 组件,后者会通过设置 iptables/ipvs 来完成实际的请求转发。

  • Service 可能会对应多个 Pod,但最终请求只会按照一定的规则转发到一个 Pod 上。

7)Pod 最后将请求发送给其中的 Container 容器。

  • 同一个 Pod 内部可能有多个 Container,但是多个容器不能共用同一个端口,因此这里会根据具体的端口号将请求发给对应的 Container。

以上就是一种典型的集群外部 HTTP 请求如何达到 Pod 中的 Container 的全过程。

需要注意的是,由于网络配置灵活多变,以上请求流转过程并不是唯一的方式,例如:

  • 如果是云服务环境,那么可以通过使用 LoadBalancer 类型的 Service 直接绑定一个云服务商提供的负载均衡器,然后再接 Ingress 或者其它 Service。

  • 也可以通过 NodePort 类型的 Service 直接使用节点上的端口,通过这些节点自建负载均衡器。

  • 如果要部署的服务特别简单,无序管理内部流量需要,这时不用 ingress 也是可以的。

另外,关于 Linux 内核的 namespace。正是有了它才实现了资源的隔离。因为每个 Pod 有各自的 Linux namespace,所以不同的 Pod 是资源隔离的。namespace 有多种,包括 PID、IPC、Network、Mount、Time 等等。其中 PID namespace 实现了进程的隔离,因此 pod 内可以有自己的 1 号进程。而 Network namespace 则让每个 Pod 有了自己的网络。

文章转载自:橙子家

原文链接:https://www.cnblogs.com/hnzhengfy/p/18408742/k8s_ingress

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1540697.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【代码随想录Day22】回溯算法Part01

理论基础 题目链接/文章讲解:代码随想录 视频讲解:带你学透回溯算法(理论篇)| 回溯法精讲!_哔哩哔哩_bilibili 回溯算法模板框架: void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&…

深兰科技荣获“2024年度人工智能最具商业合作价值企业”奖

9月19日,以“释放AI应用价值,发展新质生产力”为主题的“AIAC2024人工智能应用大会”在北京隆重举行。大会揭晓了“AI卓智奖”年度人工智能创新评选的获奖榜单,深兰科技荣获“2024年度人工智能最具商业合作价值企业”称号,同时&am…

【老板必看!】电脑怎么看使用软件时间记录?一文读懂5种超实用的方法!

在企业管理中,电脑虽不善言语、不会说话,但会留下无数线索,就像一场未解之谜,等待着各位福尔摩斯得到来,去揭开它的秘密面纱。 你是否曾好奇过,当你不在的时候,员工都在用电脑都在忙些什么&…

超重磅!青否交互式数字人2.0正式发布,支持流式输入!

青否交互式数字人自今年1月10日发布后,好评不断!是行业内第一家支持交互式数字人源码独立部署的。 今天,交互式数字人2.0版本重磅发布! 0.5秒反应速度 数字人克隆和声音克隆算法深度优化,支持流式输入,交互…

全志A133 android10 适配EC20 4G模块

一,移植适配 1. 驱动移植 代码路径:longan/kernel/linux-4.9/drivers/usb/serial/option.c diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 9f96dd2..2f25466 100644 --- a/drivers/usb/serial/option.cb/drivers/us…

12.第二阶段x86游戏实战2-CE找基地址

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…

规模化电动汽车接入配电网调度方法

规模日益增长的电动汽车和可再生能源带来的不确定性给配电网的安全运营带来了严峻挑战。为综合考虑多重不确定性、平衡运营成本与系统可靠性,首先,提出一种基于分布鲁棒联合机会约束的电动汽车-配电网充放电调度模型。该模型将节点电压、支路功率、备用需求等通过联合机会约束建…

常用函数式接口的使用

FunctionalInterface注解 函数式接口在java中是指:有且仅有一个抽象方法的接口。 虽然知道怎么使用,但是没有搞懂使用场景,暂且记录下使用方法吧,不至于看到源码的时候不知所云。 要我自己写代码,我是想不起来这样用的&#xff0…

轻松掌控资产:企业必备的智能管理解决方案

在信息化管理日益重要的今天,高效管理企业的固定资产成为亟待解决的问题。我们深知企业在资产管理方面面临的挑战,因此推出了一款全新的资产管理解决方案,旨在帮助企业轻松应对资产管理中的各种难题。 特色功能 1. 资产申购 员工可通过系统便…

计算机毕业设计之:教学平台微信小程序(

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

YOLOv5的训练技巧汇总

文章目录 前言训练技巧1.训练预热 Warmup1.1 什么是训练预热 Warmup?1.2 常见的训练预热类型1.3 yolov5里面的warmup 2.余弦退火调整学习率 CosineAnnealingLR2.1 解释2.2 yolov5中的余弦退火 3.自适应锚框 Autoanchor3.1 什么是anchor?3.1 yolov5中的默认锚框3.3 …

【网络编程】socket套接字|sockaddr|sockaddr_in|通信过程

目录 ​编辑 源IP地址和目的IP地址 Socket 网络字节序 socket编程接口 sockaddr结构 sockaddr sockaddr_in(IPv4) sockaddr_in(IPv6) 完整的套接字(socket)通信过程 创建socket套接字 bind绑定套接字 listen建立监听 accept接受连接 connect…

OpenCV系列教程二:基本图像增强(数值运算)、滤波器(去噪、边缘检测)

文章目录 一、基本图像增强(数值运算)1.1 加法 (cv2.add)1.1.1 图像与标量相加(调节亮度)1.1.2 图像与图像相加(两个图像shape要相同)1.1.3 图像的加权加法(渐变切换&…

身份证识别接口的应用场景和作用

引言 在信息化与数字化高速发展的今天,身份证作为个人身份的重要证明文件,在各行各业的应用越来越广泛。传统的身份证信息录入和审核过程通常需要人工操作,不仅效率低下,而且容易出现错误。为了解决这些问题,身份证识别…

C++入门基础知识八

1.介绍new与delete 1.malloc和free是函数,new和delete是操作符 2.malloc申请的空间不会初始化,new可以初始化 3.malloc申请空间失败时,返回的是NULL,因此必须判空,new不需要,但是new需要捕获异常 4.申请…

Kyutai 开源对话模型 Moshi;李飞飞空间智能公司已筹集超过 2.3 亿美元丨 RTE 开发者日报

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。 我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…

OpenAI GPT o1技术报告阅读(3)-英文阅读及理解

✨继续阅读报告:使用大模型来学习推理(Reason) 原文链接:https://openai.com/index/learning-to-reason-with-llms/ 这次我们继续看一个英文阅读理解的案例。 原问题: The following passage is the draft of an excerpt from a contempora…

Web开发:ABP框架3——入门级别的接口增删改查实现原理

一、上节回顾 运用了ABP框架&#xff0c;使用了EFcore进行增删改查 二、程序的入口 代码解说&#xff1a; public class Program // 定义程序主类 {public async static Task<int> Main(string[] args) // 主方法&#xff0c;返回状态码{// 配置Serilog日志Log.Logger…

手机换新,怎么把旧iPhone手机数据传输至新iPhone16手机

随着苹果公司推出了备受期待的iPhone 16。这款最新型号的iPhone不仅在设计上进行了革新&#xff0c;更在性能和功能上带来了前所未有的突破。对于那些准备从旧iPhone升级到iPhone 16的用户来说&#xff0c;最关心的问题之一就是如何把旧手机的资料转移到新手机中了。如果你不知…

Java从入门到精通学习框架(二)

在这个阶段&#xff0c;重点是掌握 Java 的高级特性&#xff0c;理解和应用常见的数据结构、Java 的并发编程模型&#xff0c;以及深入理解 Java 的内存管理机制等。通过这一阶段的学习&#xff0c;你将能够编写更加复杂和高效的程序&#xff0c;并为后续的框架学习打下坚实基础…