k8s 中的 Ingress 简介

news2024/11/22 15:46:01

一、关于 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: Prefix
        backend: # 定义了后端 Service 服务的详细信息
          service:
            name: my-app-service # 后端服务的名称 name
            port:
              number: 80
  tls: # 定义了 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: 3
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: web-server
        image: my-frontend-image:latest
        ports:
        - containerPort: 80

两个 Service:

apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  selector:
    app: frontend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
yamlapiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: api-server
        image: my-backend-image:latest
        ports:
        - containerPort: 8080

apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080

Ingress 对象:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: mydomain.com
    http:
      paths:
      - path: /frontend
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port:
              number: 80
      - path: /backend
        pathType: Prefix
        backend:
          service:
            name: backend-service
            port:
              number: 8080
  tls:
  - hosts:
    - mydomain.com
    secretName: 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.com
    http:
      paths:
      - path: /frontend
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port:
              number: 80
  tls:
  - hosts:
    - mydomain.com
    secretName: 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.coloradmin.cn/o/2151869.html

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

相关文章

一种新的电子邮件攻击方式:AiTM

新的攻击组利用合作伙伴组织之间的信任关系来绕过多重身份验证。 一种新的攻击方式开始出现,它利用合作伙伴组织之间的信任关系绕过多重身份验证。在一个利用不同组织之间关系的攻击中,攻击者成功地对四家或更多组织进行了商业电子邮件欺诈(BEC)攻击&…

中泰免签,准备去泰国旅游了吗?《泰语翻译通》app支持文本翻译和语音识别翻译,解放双手对着说话就能翻译。

泰国是很多中国游客的热门选择,现在去泰国旅游更方便了,因为泰国对中国免签了。如果你打算去泰国,那么下载一个好用的泰语翻译软件是很有必要的。 简单好用的翻译工具 《泰语翻译通》App就是为泰国旅游设计的,它翻译准确&#x…

Golang | Leetcode Golang题解之第420题强密码检验器

题目: 题解: func strongPasswordChecker(password string) int {hasLower, hasUpper, hasDigit : 0, 0, 0for _, ch : range password {if unicode.IsLower(ch) {hasLower 1} else if unicode.IsUpper(ch) {hasUpper 1} else if unicode.IsDigit(ch)…

Python | Leetcode Python题解之第421题数组中两个数的最大异或值

题目: 题解: class Trie:def __init__(self):# 左子树指向表示 0 的子节点self.left None# 右子树指向表示 1 的子节点self.right Noneclass Solution:def findMaximumXOR(self, nums: List[int]) -> int:# 字典树的根节点root Trie()# 最高位的二…

大模型中常见 loss 函数

loss 函数 首先,Loss 是允许不降到 0 的,模型计算的 loss 最终结果可以接近 0。 可以成为 loss 函数的条件## 常用 loss 以下函数调用基于 Pytorch,头文件导入: import torch.nn as nn 均方差(MSE) nn.…

基于微信小程序的剧本杀游玩一体化平台

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的剧…

详细分析Java中的ObjectMapper基本知识(附Demo)

目录 1. 基本知识2. 基本操作2.1 转换Java对象为JSON2.2 转换JSON为Java对象 3. 拓展 1. 基本知识 ObjectMapper 是 Jackson 数据处理库中的核心类之一,主要用于将 Java 对象转换为 JSON 和将 JSON 转换为 Java 对象 Jackson 是当前最流行的 JSON 处理库之一&…

秒懂Linux之消息队列与信号量(了解)

目录 前言 消息队列原理 信号量理论 信号量原理 IPC资源 前言 消息队列与信息量目前已经不常用了,大家也可以参考共享内存去了解基本原理即可。 消息队列原理 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型&…

ArcGIS10.2/10.6安装包下载与安装(附详细安装步骤)

相信从事地理专业的小伙伴来说,应该对今天的标题不会陌生。Arcgis是一款很常用的地理信息系统软件,主要用于地理数据的采集、管理、分析和展示。目前比较常见的版本有ArcGIS 10.2和ArcGIS 10.6。 不可否认,Arcgis具有强大的地图制作、空间分…

Linux环境Docker安装Mongodb

Linux环境Docker安装Mongodb 环境要求拉取指定版本镜像创建映射目录(相当于数据存放于容器外,容器被删除不会影响数据)启动容器 进入mongo命令行为指定db创建新用户查看mongodb的容器id进入命令行查看所有db切换db为指定db创建新用户使用新账…

5、论文阅读:深水下的图像增强

深水下的图像增强 前言介绍贡献UWCNN介绍网络架构残差Residuals块 Blocks网络层密集串联网络深度减少边界伪影网络损失Loss后处理前言 水下场景中,与波长相关的光吸收和散射会降低图像的可见度,导致对比度低和色偏失真。为了解决这个问题,我们提出了一种基于卷积神经网络的…

【JavaEE】线程创建和终止,Thread类方法,变量捕获(7000字长文)

阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!7000字长文,希望本文内容能够帮助到你! 目录 一:创建线程五种方式 方式一:继承Thread类,…

服务器非法关闭后MySQL服务启动失败

在写这篇文章前,我弄好了,写完之后把成功安装的几个MySQL都删除了,只留了最后测试成功的服务“mysql-test” ,然后点击运行,发现又出现上图的错误。心态炸了。 本以为定位到问题了,但是这个错误让我迷茫了。我只能临时…

缓存技巧 · Spring Cache Caffeine 高性能缓存库

Caffeine 背景 Caffeine是一个高性能的Java缓存库,它基于Guava Cache进行了增强,提供了更加出色的缓存体验。Caffeine的主要特点包括: 高性能:Caffeine使用了Java 8最新的StampedLock乐观锁技术,极大地提高了缓存的并…

VisionPro - 基础 - 00 模板匹配技术和在VP中的使用 - PMAlign - PatMax - (3)

前言: 针对PatMax 的高级应用和原理,在这一节继续进行说明:这一节主要考虑的是PatMax模板匹配的原理: How PatMax Finds Patterns in an Image PatMax 模板匹配原理 1 Run-time Space When you search for a PatMax pattern in …

World of Warcraft [CLASSIC] International translation bug

internationalization i18n_getinternationalizationjs-CSDN博客 1)国际化翻译不完整 Chance on melee and ranged critical strike to increase your attack power by 1262 for 10s. 2)更新美酒节,服务器并发太高,被提出副本 Wo…

DataFrame生成excel后为什么多了一行数字

问题描述 python查询数据生成excel文件,生成的excel多了第一行数字索引,1,2,3,4,5...... 代码: df pd.DataFrame(data)df.to_excel(filename, sheet_name用户信息表, indexFalse) 解决: 原理也很简单,就是设置个参…

Java对象一口气讲完!φ(* ̄0 ̄)

Java Object类 Java面向对象设计 - Java Object类 Java在java.lang包中有一个Object类。 所有Java类都直接或间接扩展Object类。 所有Java类都是Object类的子类Object类是所有类的超类。 Object类本身没有超类。 Object类的引用变量可以保存任何类的对象的引用。 以下代…

python中ocr图片文字识别样例(一)

一、使用easyocr安装依赖 pip install easyocr pip install opencv-python-headless # 处理图像二、具体实现,此处有个缺陷,大家可以尝试解决下,识别的文字打印结果没问题,但是图片识别出现乱码: 2.1 具体识别的图片…

Springboot 文件上传下载相关问题

文章目录 关于Springboot 文件上传下载问题解决方案注意事项文件上传文件下载文件删除文件在线打开在写练习的时候,发现了一些小小的问题,已经在 上述代码中体现。① 代码路径碰到中文的时候,会有乱码,需要转换(内容中…