K8s Ingress, 你这个老6

news/2025/3/31 15:44:36/文章来源:https://www.cnblogs.com/JulianHuang/p/18798861

本文是有态度马甲的第185篇原创。

本文记录了k8s中核心对象Ingress的产生背景和实现机制。

我们都知道k8s Service是一种将Pods通过网络暴露出来的抽象,每个服务定义了一组有关Pod的端点, Service有几种类型

  • ClusterIP: 默认,以集群内Ip的形式提供集群内的可访问性
  • NodePort:在每个节点的静态端口上对外暴露了服务
  • Loadbalancer: 外部负载均衡器

这不明摆了,常规的对外暴露服务的方式只有NodePort吗?

NodePort类型建立在ClusterIP服务类型之上, 意味着你创建了NodePort类型服务,k8s自动创建了ClusterIP 服务。

外部客户端---> 任意节点(NodePort)---> ClusterIP服务---> Pod

有几个缺陷:

  • NodePort形式的服务 没有跨节点的负载均衡能力, 有的节点忙着导流,有的闲得蛋疼
  • 能暴露的服务数量受限于节点的可用端口
  • 这姑且不算缺陷吧: 引流方式基于节点端口,位于osi网络模型的4层, 人类感知不明显。

Ingress号称是一种智能路由,表象上Ingress从集群外部将HTTP和HTTPS路由引流到k8s集群中的Service。


一个典型的数据流如上图

曾几何时,我以为Ingress是新开天辟地的网络引流方案。

后面等我深究一丢丢,发现k8s Ingress 其实是个老6, 它对外暴露服务的方式其实很贼,还是现成技能的积木。

Ingress 本质上是先在集群内产生了负载均衡服务(nginx pod), 这个k8s服务在集群内与其他服务必然可以互访。

然后咋们目标不是要对外暴露服务吗? 那我这个Ingress Nginx服务就作为一个流量入口,我这个服务还使用NodePort形式对外暴露服务, 对内通过nginx天生的路由能力来引流到后端的Service。

下面是Ingress-nginx的流程图:

注意流量从 client---> nginx pod ---> service Pod,

Ingress记录并监听了注册到Ingress上服务的路由规则,Ingress-Nginx Controller是本次业务的声明式核心控制器,确保产生满足这一规则的NodePort类型的nginx服务, Ingress nginx本身不能解决节点间负载均衡问题,注意还需前置负载提供跨节点负载均衡能力。


我们找个demo快速验证一下吧。

k8s ingress官方 给了一个通过Ingress引流到"hello world“ 这样的服务,但是它的服务竟然采用了NodePort形式,这都NodePort了,还要你Ingress作甚。

我的Demo是以默认的ClusterIP形式快速启动了Nginx服务,

已经显示nginx-svc是 ClusterIP类型的服务。

aladdin@bogon ~ % kubectl get  svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP   7d
nginx-svc    ClusterIP   10.103.46.57   <none>        80/TCP    24h

之后使用Ingress配置通过host:hello.nginx.com路由到nginx-svc服务:

    apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: example-ingressspec:rules:- host: hello.nginx.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-svcport:number: 80

产生一个Ingress核心对象

    aladdin@bogon ~ % kubectl get  ingressNAME              CLASS   HOSTS             ADDRESS        PORTS   AGEexample-ingress   nginx   hello.nginx.com   192.168.58.2   80      24h

准备工作就做完了。

启动minikube tunnel, 然后在新的终端执行curl 127.0.0.1 -H "host:hello.nginx.com" 你会看到nginx服务的Welcome to nginx!输出。

That's All, Ingress 就是如此暴露服务引流的.


Ingress相关的核心对象默认被安装在Ingress-nginx命名空间下,我们接着验证Ingress架构图中出现的组件:

上图中出现了两种核心对象:

  • Deployment/Pod: ingress-nginx-controller-56d7c84fd4-znrvq其实就是Nginx Pod
  • Service: 以NodePort形式对外暴露的ingress-nginx-controller服务

根据我们的猜想:

这个Nginx Pod受ingress-nginx-controller服务(NodePort)控制对外暴露路由服务, 对内引流到backend Service。

验证如下:


Ingress-nginx分为两大块: Ingress规则和Ingress-nginx controller Service,

两者配合一举解决了NodePort暴露服务的一些缺陷, 通过Ingress暴露服务既能有效节约节点端口,又有负载均衡能力(搭配前置负载),又是广大码农喜闻乐见的7层协议, 悠哉快哉。

但是归根到底,Ingress-nginx底层还是NodePort服务和ClusterIP服务的积木组合, 实在是高啊。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# .NET core 中处理图像,SkiaSharp,ImageSharp,NetVips,Magick.net多维度对比

2025年有哪些图像处理库,我们可以在项目中使用哪些库?本文列出了最流行的现有库。 .NET Core图片处理库SkiaSharp(https://github.com/mono/SkiaSharp) Magick.net(https://github.com/dlemstra/Magick.NET) ImageSharp(https://github.com/SixLabors/ImageSharp) NetV…

20243317 实验二《Python程序设计》实验报告

课程:《Python程序设计》 班级: 2433 姓名: 邓雅文 学号:20243317 实验教师:王志强老师 实验日期:2025年3月26日 必修/选修: 公选课 一、实验内容 1、掌握python中函数定义与调用相关知识点 大致框架与C语言相同,同样有实参,形参,可能有返回值,形式如下: def 函数名…

MEBCY-v2

MERCY-v2 信息收集 查找目标主机ip ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:84:b2:cc, IPv4: 192.168.158.143 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.158.1 00:50:56:c…

人群密度分析预警摄像机

人群密度分析预警摄像机是可以实时地统计出一个指定区域内的总人数。当所监视区域的人员数量达到设定的阀值时摄像机输出报警信号。可设置人数阈值和时间阈值。用于设置触发进入区域内的人数值,达到该设定的阈值则摄像机输出报警信号。人数阈值可以手动设置,系统默认值为5人,…

CloudFlare DNS实现根域名跳转WWW域名,301跳转

0. 目的 托管在CloudFlare上的域名,已配置好www.bktai.com,想在用户访问根域名https://bktai.com时,重定向到 https://www.bktai.com. 为什么是重定向而不是同时可以访问?搜索引擎会搜到重复的内容,且维护两套路径都能正常工作,会造成混乱。 1. 配置根域名 点击自己要设置…

day:32 jmeter及性能测试——介绍

一、性能测试介绍 1、什么叫做性能测试? (1)通过某些工具或手段来检测软件的某些指标是否达到了要求,这就是性能测试 (2)指通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试 2、性能测试的时间? 在功能测试完成后才能进行性能测试…

第六周第五天

所用时间:405分钟 代码量(行):689 博客量(篇):20 了解到的知识点: 1.VLAN的创建与划分 今天进行了计算机网络的实验一,在昨天下载的packet tracer上进行,实现了VLAN的创建与划分,进行跨交换机的相同vlan之间的计算机和不同vlan之间的计算机的通信实验2.树状结构查询…

独立按键控制LED数码管

前言 通过1个独立按键,控制LED数码管显示字符。 结合之前我的两篇文章独立按键控制LED流水灯方向 https://www.cnblogs.com/luckydoog/p/18796974数码管静态显示 https://www.cnblogs.com/luckydoog/p/18797690效果原理 提前在程序里存储共阴极数码管的编码表,能表示的字符范…

day:32 jmeter操作数据库——参数化

一、数据库通过用户参数设置变量 1、建一个查询的jdbs请求2、前置处理器中添加用户参数3、修改线程数4、查看结果二、txt文档实现参数化 1.编辑sql语句中导入变量${变量名}新建一个txt文档:data 命名导入txt文档运行以上内容是将sql语句写入到txt文档中引用 2. 将数据写入txt文…

20242214 实验二《Python程序设计》实验报告

20242214 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2422 姓名: 陈冯 学号:20242214 实验教师:王志强 实验日期:2025年3月26日 必修/选修: 公选课 一、实验内容设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善:在VS…