Ingress:k8s集群进出流量的总管

news2025/1/19 3:15:56

Ingress:k8s集群进出流量的总管

Service 对象,它是 Kubernetes 内置的负载均衡机制,使用静态 IP 地址代理动态变化的 Pod,支持域名访问和服务发现,是微服务架构必需的基础设施。

Service 很有用,但也只能说是“基础设施”,它对网络流量的管理方案还是太简单,离复杂的现代应用架构需求还有很大的差距,所以 Kubernetes 就在 Service 之上又提出了一个新的概念:Ingress

为什么要有 Ingress?

下图是Service 的功能和运行机制,它本质上就是一个由 kube-proxy 控制的四层负载均衡,在 TCP/IP 协议栈上转发流量(Service 工作原理示意图):

但在四层上的负载均衡功能还是太有限了,只能够依据 IP 地址和端口号做一些简单的判断和组合,而我们现在的绝大多数应用都是跑在七层的 HTTP/HTTPS 协议上的,有更多的高级路由条件,比如主机名、URI、请求头、证书等等,而这些在 TCP/IP 网络栈里是根本看不见的。

该怎么解决这个问题呢?

Kubernetes 还是沿用了 Service 的思路,既然 Service 是四层的负载均衡,那么我再引入一个新的 API 对象,在七层上做负载均衡是不是就可以了呢?

不过除了七层负载均衡,这个对象还应该承担更多的职责,也就是作为流量的总入口,统管集群的进出口数据,让外部用户能够安全、顺畅、便捷地访问内部服务。

所以,这个 API 对象就顺理成章地被命名为 Ingress,意思就是集群内外边界上的入口。

怎么使用 Ingress?

Ingress 的功能其实很容易理解:所谓 Ingress,就是 Service 的“Service”。

举个例子,假如现在有这样一个站点:https://cafe.example.com。其中,https://cafe.example.com/coffee,对应的是“咖啡点餐系统”。而,https://cafe.example.com/tea,对应的则是“茶水点餐系统”。

这两个系统,分别由名叫 coffee 和 tea 这样两个 Deployment 来提供服务。那么现在,我如何能使用 Kubernetes 的 Ingress 来创建一个统一的负载均衡器,从而实现当用户访问不同的域名时,能够访问到不同的 Deployment 呢?上述功能,在 Kubernetes 里就需要通过 Ingress 对象来描述,如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: cafe-ingress
spec:
  tls:
  - hosts:
    - cafe.example.com
    secretName: cafe-secret
  rules:
  - host: cafe.example.com
    http:
      paths:
      - path: /tea
        backend:
          serviceName: tea-svc
          servicePort: 80
      - path: /coffee
        backend:
          serviceName: coffee-svc
          servicePort: 80

在上面这个名叫 cafe-ingress.yaml 文件中,最值得我们关注的,是 rules 字段。

在 Kubernetes 里,这个字段叫作:IngressRule。IngressRule 的 Key,就叫做:host。它必须是一个标准的域名格式,而不能是 IP 地址,而 host 字段定义的值,就是这个 Ingress 的入口。

这也就意味着,当用户访问 cafe.example.com 的时候,实际上访问到的是这个 Ingress 对象。

而接下来 IngressRule 规则的定义,则依赖于 path 字段。你可以简单地理解为,这里的每一个 path 都对应一个后端 Service。

在这个例子里,定义了两个 path,它们分别对应 coffee 和 tea 这两个 Deployment 的 Service(即:coffee-svc 和 tea-svc)。

通过上面的例子,不难看到,所谓 Ingress 对象,其实就是 Kubernetes 项目对“反向代理”的一种抽象。一个 Ingress 对象的主要内容,实际上就是一个“反向代理”服务(比如:Nginx)的配置文件的描述,而这个代理服务对应的转发规则,就是 IngressRule。

这其实跟 Nginx、HAproxy 等项目的配置文件的写法是一致的,而有了 Ingress 这样一个统一的抽象,Kubernetes 的用户就无需关心 Ingress 的具体细节了。

Ingress 可以说是在七层上另一种形式的 Service,它同样会代理一些后端的 Pod,也有一些路由规则来定义流量应该如何分配、转发,只不过这些规则都使用的是 HTTP/HTTPS 协议。

你知道Service 本身是没有服务能力的,它只是一些 iptables 规则,真正配置、应用这些规则的实际上是节点里的 kube-proxy 组件。如果没有 kube-proxy,Service 定义得再完善也没有用。

同样的,Ingress 也只是一些 HTTP 路由规则的集合,相当于一份静态的描述文件,真正要把这些规则在集群里实施运行,还需要有另外一个东西,这就是 Ingress Controller,它的作用就相当于 Service 的 kube-proxy,能够读取、应用 Ingress 规则,处理、调度流量。

一键部署Ingress Controller

按理来说,Kubernetes 应该把 Ingress Controller 内置实现,作为基础设施的一部分,就像 kube-proxy 一样。

不过 Ingress Controller 要做的事情太多,与上层业务联系太密切,所以 Kubernetes 把 Ingress Controller 的实现交给了社区,任何人都可以开发 Ingress Controller,只要遵守 Ingress 规则就好。

在实际的使用中,你只需要从社区里选择一个具体的 Ingress Controller,把它部署在 Kubernetes 集群里即可。然后,这个 Ingress Controller 会根据你定义的 Ingress 对象,提供对应的代理能力。目前,业界常用的各种反向代理项目,比如 Nginx、HAProxy、Envoy等。

因为 Nginx 是开源的,谁都可以基于源码做二次开发,所以它又有很多的变种,比如社区的 Kubernetes Ingress Controller(https://github.com/kubernetes/ingress-nginx)、Nginx 公司自己的 Nginx Ingress Controller(https://github.com/nginxinc/kubernetes-ingress)、还有基于 OpenResty 的 Kong Ingress Controller(https://github.com/Kong/kubernetes-ingress-controller)等等

下面的这张图就来自 Nginx 官网,比较清楚地展示了 Ingress Controller 在 Kubernetes 集群里的地位:

部署 Nginx Ingress Controller 的方法非常简单,如下所示:

1、 下载一键部署yaml文件

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.1/deploy/static/provider/cloud/deploy.yaml

2、处理国内无法下载k8s.io上的镜像

sed -i s#registry.k8s.io/ingress-nginx/controller:v1.3.1@sha256:54f7fe2c6c5a9db9a0ebf1131797109bb7a4d91f56b9b362bde2abd237dd1974#registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.3.1#g deploy.yaml

sed -i s#registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.3.0@sha256:549e71a6ca248c5abd51cdb73dbc3083df62cf92ed5e6147c780e30f7e007a47#registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.3.0#g deploy.yaml

3、用 NodePort service 暴露 Nginx Ingress Controller

在这里插入图片描述

4、部署Nginx Ingress Controller

kubectl apply -f deploy.yaml

上述操作完成后,可以查看下 Service 的访问入口,即:宿主机的地址和 NodePort 的端口,如下所示:

在 Ingress Controller 和它所需要的 Service 部署完成后,我们就可以使用它了。

如何在 k8s里使用 Ingress Controller

备注:这个“咖啡厅”Ingress 的所有示例文件,都在这里。

https://github.com/resouer/kubernetes-ingress/tree/master/examples/complete-example

首先,我在集群里部署我们的应用咖啡厅 Pod 和它们对应的 Service:

$ kubectl create -f cafe.yaml

然后,我们需要创建 Ingress 所需的 SSL 证书(tls.crt)和密钥(tls.key),这些信息都是通过 Secret 对象定义好的,如下所示:

$ kubectl create -f cafe-ingress.yaml

这一步完成后,就可以创建在本篇文章一开始定义的 Ingress 对象了:

$ kubectl create -f cafe-ingress.yaml

然后,我们就可以查看一下这个 Ingress 对象的信息:

可以看到,这个 Ingress 对象最核心的部分,正是 Rules 字段。其中,我们定义的 Host 是cafe.example.com,它有两条转发规则(Path),分别转发给 tea-svc 和 coffee-svc。

接下来,我们就可以通过访问这个 Ingress 的地址和端口,访问到我们前面部署的应用了,比如,当我们访问https://cafe.example.com:443/coffee时,应该是 coffee 这个 Deployment 负责响应我的请求。

我们在 curl 发测试请求的时候需要注意,因为 Ingress 的路由规则是 HTTP 协议,所以就不能用 IP 地址的方式访问,必须要用域名, 你可以修改 /etc/hosts 来手工添加域名解析,也可以使用 --resolve 参数,指定域名的解析规则。

要访问该应用程序,请求 tea-svc 和 coffee-svc。 我们将使用 curl 的 --insecure 选项来关闭自签名证书的证书验证,并使用 --resolve 选项来设置 域名cafe.example.com 和IP的映射

#设置环境变量
[root@k8s-master1 deployments]# IC_IP=192.168.2.129
[root@k8s-master1 deployments]# IC_HTTPS_PORT=32043

# 请求 coffee:
[root@k8s-master1 deployments]# curl --resolve cafe.example.com:$IC_HTTPS_PORT:$IC_IP https://cafe.example.com:$IC_HTTPS_PORT/coffee --insecure
Server address: 10.244.36.77:8080
Server name: coffee-6f4b79b975-d4dwp
Date: 16/May/2023:11:41:12 +0000
URI: /coffee
Request ID: 55722fd73ebb8ff0981251fe42406ca7

# 请求 tea:
[root@k8s-master1 deployments]# curl --resolve cafe.example.com:$IC_HTTPS_PORT:$IC_IP https://cafe.example.com:$IC_HTTPS_PORT/tea --insecure
Server address: 10.244.36.79:8080
Server name: tea-6fb46d899f-bxdqj
Date: 16/May/2023:11:45:21 +0000
URI: /tea
Request ID: 688de602d9894b2316cd5d95dc9f417f

可以看到,Nginx Ingress Controller 为我们创建的 Nginx 负载均衡器,已经成功地将请求转发给了对应的后端 Service。

以上,就是 Kubernetes 里 Ingress 的设计思想和使用方法了。

小结

我们学习了 Kubernetes 里七层的反向代理和负载均衡对象,包括 Ingress、Ingress Controller它们联合起来管理了集群的进出流量,是集群入口的总管。

  • Service 是四层负载均衡,能力有限,所以就出现了 Ingress,它基于 HTTP/HTTPS 协议定义路由规则。

  • Ingress 只是规则的集合,自身不具备流量管理能力,需要 Ingress Controller 应用 Ingress 规则才能真正发挥作用。

  • Ingress Class 解耦了 Ingress 和 Ingress Controller,我们应当使用 Ingress Class 来管理 Ingress 资源。

  • 最流行的 Ingress Controller 是 Nginx Ingress Controller,它基于经典反向代理软件 Nginx。

好了,以上就是今天分享的全部内容,enjoy 欢迎吐槽、交流~微信公众号【AI黑板报】

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

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

相关文章

分享一个国内可用的ChatGPT网站,免费无限制,支持AI绘画 - AI 百晓生

背景 ChatGPT作为一种基于人工智能技术的自然语言处理工具,近期的热度直接沸腾🌋。 作为一个AI爱好者,翻遍了各大基于ChatGPT的网站,终于找到一个免费!免登陆!手机电脑通用!国内可直接对话的C…

使用apisix代理静态文件

前言 最近公司考虑用apisix作为公司网关并且部署到k8s上,我这边收到一个小任务:使用apisix代理静态文件 通过apisix官网了解到它构建于 NGINX ngx_lua 的技术基础之上,所以按理应该和nginx代理静态资源是一样的。因为是通过docker容器部署…

STM32-内部温度传感器实验

STM32内部是有温度传感器的,以F1为例,它的温度采集范围是-40度到125度,精度为正负2度,采样通道为ADC1_INI6,上电控制位为TSVREFE位。 温度计算方式为:T(摄氏度) (V25 - Vsense) / Avg_Slope 25&#xff…

数据库管理-第七十六期 如何升级19c RAC(20230516)

数据库管理 2023-05-16 第七十六期 如何升级19c RAC1 回头处理2 升级AHF3 升级GI及DB3.1 拷贝所需文件3.2 升级OPatch3.3 升级GI与DB3.4 应用SQL变更 4 升级OJVM4.1 解压补丁4.2执行补丁冲突检查:4.3 升级OJVM4.4 应用SQL变更 5 最终验证总结 第七十六期 如何升级19…

NC 人力薪酬管理怎么结账?

NC 人力薪酬管理结账流程 1、先在【薪资发放】节点选择相应的薪资方案进行查询操作,然后进行计算操作; 2、计算操作完后,再进行审核操作; 3、如果薪资方案勾选了“发放数据需要审批”属性,则需要在【发放申请】节点…

【NB 2023】从一般蛋白质语言模型中高效进化人类抗体

Efficient evolution of human antibodies from general protein language models 哈佛大学化学与化学生物学系和圣路易斯华盛顿大学的研究人员共同完成的一篇论文,发表在Nature Biotechnology上。 抗体是一种大分子,属于免疫球蛋白家族,它…

springboot 启动后,调用接口时报错404问题汇总(层层推进、超全面)

线上环境 确保项目启动成功 看到这条日志才能判定项目是启动成功的 确保controller类被成功注册到了springboot容器中 首先,按springboot的类扫描规则来说,启动类和被扫描的组件类应该要在同一包下的 验证策略 从springboot容器中尝试去获取到contro…

【Springboot】yaml配置文件多环境切换

关于配置文件的详细说明可以看官方文档: 24. Externalized Configuration 以下是个人学习过程中的笔记,如有错误,请多指教! 目录 (一)配置文件 (二)yaml的概述及基本使用 yaml基本…

TCP与UDP相关知识(详细)

目录 一、UDP 和 TCP 的特点与区别 二、UDP 与TCP 首部格式 三、TCP 的三次握手和四次挥手 四、TCP 短连接和长连接的区别 五、TCP粘包、拆包及解决办法 六、TCP 可靠传输 七、TCP 滑动窗口 八、TCP 流量控制 九、TCP 拥塞控制 十、提供网络利用率 一、UDP 和 TCP 的特…

yolov8 pycharm运行(predict,不用command line)

yolov8就不介绍了,见主页 这里说下用pycharm运行。 代码参考segment页 from ultralytics import YOLO# Load a model model YOLO(yolov8n-seg.pt) # load an official model# Predict with the model results model(test_img.jpg) # predict on an image不通过…

Cube Map 系列之:手把手教你 实现 环境光贴图

什么是环境光贴图 下面先看两个例子: 使用左侧的纹理 渲染茶壶,得到茶壶对真实空间的反射效果 同样使用左侧的纹理,得到中心的球对四周物体的反射效果 所以,环境光贴图指的是通过构建物体周围世界的纹理,使用纹理贴…

25的大学生转行学云计算,能拿到10k+的月薪,是真的吗?

25的大学生转行学云计算,能拿到10k的月薪,是真的吗? 对于IT行业来说,月薪上万并不少见,毕竟互联网常年占据行业薪资排行榜首。作为技术行业,由于其发展的前沿性,引导性,也是作为其他…

26-2 vue-router

原始的方式好多东西需要我们自己去写,vue-router是一个集成好了的路由包,vue-router 官网 Vue Router | Vue.js 的官方路由 并非原始的东西就不好,只要是包就可能存在版本兼容问题,如果是简单的需求就建议用原始的方法 目录 1 …

如何进行远程控制电脑

电脑在我们日常生活中的作用是非常大的,尤其是在信息时代地位非常高。 其中,最常见、最具代表性的功能是实现远程控制功能。它可以直接解决一些问题,而不需要去现场,在一定程度上提高了工作效率。但是有很多朋友不知道如何实现远…

边缘计算盒子有哪些?边缘计算应用场景

边缘计算(Edge Computing)是一种分布式计算模型,旨在将数据处理和计算功能从中心数据中心移到数据源附近的边缘设备上。它的目标是在接近数据生成的地方进行实时数据处理和分析,减少数据传输延迟和网络拥塞,提高应用程…

计算机图形学-GAMES101-2

Vectors向量 一、向量的介绍 表示一个方向。计算向量的方法:AB (B-A)。向量对应的单位向量 AB / ||AB|| 。向量具有平移性,我们不关心它的开始位置。向量求和:三角形法则和平行四边形法则。在代数上计算直接把向量的…

如何防止网站被黑客攻击?黑客是怎样炼成的?

现在的黑客网站可谓是多如牛毛,不管在哪里只要你愿意学,都可以学到一招半式。看过别人的个性签名:卖菜的王大妈是黑客,烤红薯的李大爷也是黑客,对面成人用品店的老板,挖日,还是黑客-_-~!..黑客还真多啊!!!据…

关于对自动化测试的理解:目的与本质!(新手必看)

其实自动化测试很好理解,由两部分组成,“自动化”和“测试”,所以我们要理解自动化测试,就必须理解“自动化”和“测试”,只有理解了这些概念,才能更轻松的做好的自动化测试。其中“自动化”可以想象成通过…

晶飞FLA5000光谱仪.FlaSpec格式解析批处理导出CSV文件

引言 首先说明下晶飞上位机软件存在的问题,实验所采用的FLA5000型号光谱仪,光谱波段从280-970nm,FWHM值为2.4nm。 1、上位机软件中的光谱数据复制功能基本是废的,最多只能到599.9nm,后面的数据全部消失。 2、上位机软…

2023系统分析师---软件工程、系统规划高频错题

系统规划---成本效益分析 评价信息系统经济效益常用的方法主要有成本效益分析法,投入产出分析法和价值工程方法。盈亏平衡法常用于销售定价; 可行性分析 系统规划是信息系统生命周期的第一个阶段,其任务是对企业的环境、目标以及现有系统的状况进行初步调查,根据企业目标…