K8s 中 Ingress-Nginx 结合负载均衡器(Ingress nginx combined with load balancer)
K8s 中 Ingress-Nginx 结合负载均衡器(LB)的部署全解析
在 K8s的世界里,有效地管理和路由进入集群的外部流量是至关重要的。Ingress-Nginx 作为一款强大的 Ingress 控制器,搭配负载均衡器(LB),可以为我们的应用服务提供高效、灵活且可靠的流量接入和分发机制。本章详细介绍如何在 K8s 环境中部署 Ingress-Nginx 并结合 LB 发挥其强大功能。
一、Ingress 与 Ingress-Nginx 概述
(一)什么是 Ingress
Ingress 是 K8s 中的一个 API 对象,它的核心作用在于将集群外部的 HTTP 和 HTTPS 流量路由到集群内部的不同服务上。简单来说,它就像是集群对外的“大门”和“交通指挥员”,能够根据配置的规则,把请求精准地引导到对应的后端服务实例中,避免了我们为每个服务都单独去配置外部访问方式的繁琐操作。
(二)Ingress-Nginx 的优势
Ingress-Nginx 则是众多 Ingress 控制器实现中的佼佼者。它基于 Nginx 服务器构建,Nginx 本身就有着高性能、高并发处理能力以及丰富的功能模块等优势。Ingress-Nginx 继承了这些优点,并且与 K8s 生态深度集成,可以方便地通过配置 Ingress 资源来动态地更新 Nginx 的路由规则,轻松应对复杂多变的业务场景,例如实现基于域名、路径等多维度的流量路由策略。
二、负载均衡器(LB)在 K8s 中的作用
(一)负载均衡的基本概念
在分布式系统中,尤其是像 K8s 这样的容器编排平台里,往往会有多个相同服务的副本在运行,以提高系统的可用性和处理能力。负载均衡器(LB)的任务就是将进入的客户端请求合理地分配到这些后端的服务副本上,避免某个副本负载过重而其他副本闲置的情况,从而优化整个系统资源的利用效率,提升服务的响应速度和稳定性。
(二)LB 类型及选择
在 K8s 环境中,常见的负载均衡器类型有多种,比如云服务商提供的云负载均衡器(例如阿里云的 SLB、腾讯云的 CLB 等),这类负载均衡器依托云平台强大的资源和功能,能够无缝对接 K8s 集群,并且提供诸如健康检查、自动扩缩容等高级特性;还有软件定义的负载均衡器(像 MetalLB 等),适用于在没有云服务商原生 LB 支持的自建数据中心等环境下,通过软件配置来模拟实现类似云 LB 的功能。我们需要根据自身的部署环境、成本预算以及业务需求等来选择合适的负载均衡器。
三、部署前的准备工作
(一)K8s 集群环境搭建
首先,自然是要有一个正常运行的 Kubernetes 集群啦。可以通过诸如 kubeadm、Minikube 等工具来搭建不同规模和用途的集群。确保集群的各个节点状态正常,网络通信顺畅,K8s 的核心组件(如 API Server、Controller Manager、Scheduler、kubelet 等)都稳定运行,这是后续部署 Ingress-Nginx 和配置 LB 的基础前提。
(二)确定负载均衡器选型及配置
根据前面提到的原则选定了具体的负载均衡器后,要按照相应的文档说明进行基础配置。例如使用云负载均衡器时,需要在云平台控制台创建对应的负载均衡实例,配置监听端口(一般对于 HTTP 和 HTTPS 流量常用的 80、443 端口等),设置后端服务的关联规则等;若是采用软件定义的 LB,则要安装和配置相应的软件组件,使其能够与 K8s 集群进行有效的交互。
(三)安装必要的命令行工具和插件
我们还需要安装一些在部署过程中会用到的命令行工具,比如 kubectl,它可是操作 K8s 集群的得力助手,通过它可以创建、修改、删除各种 K8s 资源对象。另外,如果选择的是特定的 Ingress-Nginx 版本或者有相关依赖的插件(比如用于自动配置证书的 Cert-Manager 插件等,在处理 HTTPS 流量时可能会用到),也要提前进行安装和配置妥当。
四、部署 Ingress-Nginx
(一)获取 Ingress-Nginx 部署文件
Ingress-Nginx 官方提供了多种方式来获取部署所需的文件,常见的是通过 helm 包管理器或者直接下载官方提供的 YAML 配置文件模板。
-
• 使用
helm方式: 首先需要安装helm工具(如果还未安装的话),然后添加 Ingress-Nginx 的 helm 仓库,例如执行如下命令:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
接着就可以通过 helm 命令来安装 Ingress-Nginx 了,比如使用默认配置安装的命令大致如下:
helm install ingress-nginx ingress-nginx/ingress-nginx
-
• 使用 YAML 文件方式: 可以从 Ingress-Nginx 官方 GitHub 仓库(https://github.com/kubernetes/ingress-nginx)下载对应的部署 YAML 文件,一般会有包含不同资源对象(如 Deployment、Service、ConfigMap 等)配置的多个文件。下载好后,使用
kubectl依次应用这些文件来部署 Ingress-Nginx,例如:
kubectl apply -f <namespace>-ingress-nginx-deployment.yaml
kubectl apply -f <namespace>-ingress-nginx-service.yaml
kubectl apply -f <namespace>-ingress-nginx-configmap.yaml
(这里的 要替换为实际计划部署的命名空间名称,若采用默认命名空间则可省略此项)
(二)配置 Ingress-Nginx 参数
部署好基础的 Ingress-Nginx 后,往往还需要根据实际业务情况对其进行参数配置。例如,通过修改 ConfigMap 资源对象来调整 Nginx 的一些基础设置,像缓存策略、超时时间、日志格式等内容。以下是一个简单的修改 ConfigMap 中日志格式的示例操作:
首先,获取当前 Ingress-Nginx 的 ConfigMap 内容:
kubectl get configmap <ingress-nginx-configmap-name> -o yaml
(这里的 是实际部署后的 ConfigMap 名称,可以通过查看之前部署的资源来确定)
然后在获取到的 YAML 文件内容中找到对应日志格式相关的配置字段,进行修改,比如将日志格式修改为包含更多详细信息的格式,修改完成后再使用 kubectl 应用更新后的 ConfigMap:
kubectl apply -f updated-configmap.yaml
这样就能让 Ingress-Nginx 按照新的配置来运行了。
五、将负载均衡器(LB)与 Ingress-Nginx 集成
(一)配置 LB 指向 Ingress-Nginx 服务
不同类型的负载均衡器有不同的配置方式来关联到 Ingress-Nginx 的服务。
-
• 对于云负载均衡器来说,在云平台控制台中,需要将负载均衡实例的后端服务设置为指向 Ingress-Nginx 对应的 Service 资源。一般会根据 Ingress-Nginx 服务暴露的端口(通常是 80 和/或 443 端口)以及所在的命名空间等信息进行准确关联,同时配置好健康检查机制,让 LB 能够实时监测 Ingress-Nginx 服务的健康状态,确保只将流量转发到可用的实例上。
-
• 如果是使用软件定义的负载均衡器(如 MetalLB),则要通过其自身的配置文件或者命令行参数等方式,指定将外部流量转发到 Ingress-Nginx 服务所在的节点和端口上。例如 MetalLB 可能需要配置 IP 地址池,并将这些 IP 分配给 Ingress-Nginx 的服务,使其能够接收来自外部网络的请求。
(二)验证集成效果
配置完成后,我们要进行一系列的验证操作来确保 LB 和 Ingress-Nginx 集成成功并且流量能够正确路由。
-
• 首先,可以通过查看 LB 的监控数据或者状态页面(云 LB 一般在云平台控制台有相应展示,软件 LB 也会有自己的状态查看方式),确认是否有流量进入并且成功转发到 Ingress-Nginx 服务,查看请求的数量、成功率等指标是否符合预期。
-
• 然后,在集群内部创建一些简单的测试服务和对应的 Ingress 资源,定义好基于域名、路径等的路由规则,尝试从集群外部通过 LB 的公开发布地址访问这些测试服务,查看是否能够按照配置准确地访问到对应的后端服务内容。例如,创建一个简单的
nginx示例服务,配置 Ingress 规则将/testpath路径的请求路由到该nginx服务,通过在浏览器中输入http:///testpath(这里的 是负载均衡器对外的访问地址),看是否能正确返回nginx的默认页面,如果能,则说明整体的集成和路由配置是有效的。
六、基于 Ingress-Nginx 和 LB 的流量路由策略配置
(一)基于域名的路由
在实际业务中,往往有多个不同的域名对应不同的业务应用。通过 Ingress-Nginx 结合 LB,我们可以轻松实现基于域名的流量路由。例如,我们有 app1.example.com 和 app2.example.com 两个域名,分别对应两个不同的后端服务 service1 和 service2。我们可以在 Ingress 资源配置中如下设置:
apiVersion:networking.k8s.io/v1
kind:Ingress
metadata:
name:domain-based-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target:/
spec:
rules:
-host:app1.example.com
http:
paths:
-path:/
backend:
service:
name:service1
port:
number:80
-host:app2.example.com
http:
paths:
-path:/
backend:
service:
name:service2
port:
number:80
这样,当外部用户通过浏览器访问 app1.example.com 时,LB 会将请求转发到 Ingress-Nginx,Ingress-Nginx 再依据配置将请求路由到 service1 服务;同理,访问 app2.example.com 会路由到 service2 服务。
(二)基于路径的路由
有时候,我们希望在同一个域名下,根据不同的路径来访问不同的服务,这也是完全可以实现的。比如对于 example.com 域名,我们想让 /api 路径的请求访问后端的 API 服务,/web 路径的请求访问前端网页服务。配置示例如下:
apiVersion:networking.k8s.io/v1
kind:Ingress
metadata:
name:path-based-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target:/$2
spec:
rules:
-host:example.com
http:
paths:
-path:/api(/|$)(.*)
backend:
service:
name:api-service
port:
number:80
-path:/web(/|$)(.*)
backend:
service:
name:web-service
port:
number:80
通过这样的配置,Ingress-Nginx 就能根据请求路径的不同,准确地将流量分发到对应的后端服务上了,再借助 LB 的负载均衡能力,保证服务的高效运行。
七、常见问题及解决办法
(一)Ingress-Nginx 无法启动或频繁重启
-
• 可能原因:配置文件错误,比如
ConfigMap中的某些参数设置不符合要求导致 Nginx 启动失败;资源不足,所在节点的 CPU、内存等资源不够支撑 Ingress-Nginx 的运行;镜像拉取问题,可能是无法正常从镜像仓库拉取到 Ingress-Nginx 所需的镜像。 -
• 解决办法:仔细检查配置文件,对照官方文档核对各个参数设置是否正确,特别是一些关键的 Nginx 配置参数;查看节点资源使用情况,适当增加节点资源或者调整 Ingress-Nginx 的资源请求和限制配置;排查镜像拉取问题,检查网络连接是否正常,镜像仓库的权限是否正确等。
(二)LB 转发的流量无法正确路由到后端服务
-
• 可能原因:LB 与 Ingress-Nginx 服务的关联配置有误,没有准确地将流量指向 Ingress-Nginx 的对应端口和服务实例;Ingress 资源的路由规则配置错误,导致 Ingress-Nginx 按照错误的规则处理请求,无法找到正确的后端服务;网络策略限制,集群内部可能存在网络策略限制了从 Ingress-Nginx 到后端服务的流量传输。
-
• 解决办法:重新核对 LB 与 Ingress-Nginx 的关联配置,确保端口、IP 等信息准确无误;检查并修正 Ingress 资源的路由规则配置,通过
kubectl查看 Ingress 资源的详细状态以及日志信息来排查问题;检查集群网络策略,根据需要适当放宽对相关流量的限制,确保从 Ingress-Nginx 到后端服务的网络通路顺畅。
八、总结与展望
通过以上详细的步骤,我们成功地在 K8s 集群中部署了 Ingress-Nginx 并结合负载均衡器(LB)实现了高效灵活的外部流量管理和路由功能。这一组合在实际的生产环境中有着广泛的应用,可以满足各种复杂的业务需求,无论是多域名、多服务的复杂架构,还是应对高并发的流量场景,都能发挥重要作用。
随着 Kubernetes 生态的不断发展以及业务需求的持续变化,Ingress-Nginx 和 LB 的功能也在不断完善和扩展,比如在安全性方面进一步强化(更好的 HTTPS 支持、认证授权机制等),在性能优化上持续迭代(更高的并发处理能力、更低的延迟等)。我们需要不断学习和跟进这些新技术、新特性,以便更好地利用它们为我们的应用服务保驾护航,构建更加稳定、高效的云原生架构。
相关文章:
K8s 中 Ingress-Nginx 结合负载均衡器(Ingress nginx combined with load balancer)
K8s 中 Ingress-Nginx 结合负载均衡器(LB)的部署全解析 在 K8s的世界里,有效地管理和路由进入集群的外部流量是至关重要的。Ingress-Nginx 作为一款强大的 Ingress 控制器,搭配负载均衡器(LB),…...
MATLAB中savefig函数用法
目录 语法 说明 示例 将当前图窗保存到 FIG 文件 将多个图窗保存到 FIG 文件 使用 compact 选项保存图窗 savefig函数的功能是将图窗和内容保存到 FIG 文件。 语法 savefig(filename) savefig(H,filename) savefig(H,filename,compact) 说明 savefig(filename) 将当前…...
Windows系统中Docker可视化工具对比分析,Docker Desktop,Portainer,Rancher
Docker可视化工具对比分析,Docker Desktop,Portainer,Rancher Windows系统中Docker可视化工具对比分析1. 工具概览2. Docker Desktop官网链接:主要优点:主要缺点:版本更新频率: 3. Portainer官网…...
创业项目怎么找?
寻找创业项目需要系统的方法和策略,以下是一些有效的途径和方法,帮助你找到合适的创业项目: 1. 从自身出发 兴趣爱好:选择自己感兴趣的领域,更容易坚持并投入热情。例如,如果你对网络购物感兴趣࿰…...
【机器学习】自定义数据集,使用scikit-learn 中K均值包 进行聚类
一、K 均值算法简介 K 均值算法的目标是将数据集划分为 K 个簇,使得每个数据点属于离它最近的簇中心(centroid)所代表的簇。 K均值聚类算法步骤 ① 初始化: 随机选择原始数据的K个数据点作为初始质心(聚类中心&…...
RocketMQ 系列文章
目录 使用RocketMQ 的业务系统怎么处理消息的重试? 使用RocketMQ 的业务系统怎么保证消息处理的幂等性? 使用RocketMQ 的业务系统怎么处理消息的积压? RocketMQ 怎么保证消息的可靠性? RocketMQ 怎么保证消息的顺序性的? RocketMQ 的 Topic 和消息队列MessageQueue信…...
进阶数据结构——高精度运算
目录 前言一、高精度运算的定义与背景二、高精度运算的实现方式三、高精度运算的算法实现四、高精度运算的应用场景五、代码模版(c)六、经典例题1.[高精度加法](https://www.lanqiao.cn/problems/1516/learning/?page1&first_category_id1&name…...
42【语言的编码架构】
不同语言采用的编码架构不一样 火山采用:UTF-16 易语言采用:GBK php采用:UTF-8 这个编码架构指的就是文本所代表的字节集,比如易语言中“你好”表示的就是{196,227,186,195} 窗口程序集名保 留 保 留备 注窗口程序集_启动窗口 …...
设计模式Python版 原型模式
文章目录 前言一、原型模式二、原型模式示例三、原型管理器 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:关注类和对…...
用 JavaScript 打造交互式表格:添加与删除行功能
前言 在网页开发中,创建交互式表格是很常见的。今天我们通过一个示例,来展示如何使用 HTML、CSS 和 JavaScript 实现一个能够动态添加和删除行的表格,并详细解释其中 JavaScript 部分的代码逻辑。 功能展示 初始状态:页面加载后…...
Linux02——Linux的基本命令
目录 ls 常用选项及功能 综合示例 注意事项 cd和pwd命令 cd命令 pwd命令 相对路径、绝对路径和特殊路径符 特殊路径符号 mkdir命令 1. 功能与基本用法 2. 示例 3. 语法与参数 4. -p选项 touch-cat-more命令 1. touch命令 2. cat命令 3. more命令 cp-mv-rm命…...
服务器虚拟化实战:架构、技术与最佳实践
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 服务器虚拟化是现代 IT 基础设施的重要组成部分,通过虚拟化技术可以提高服务器资源利用率、降低硬件成本&am…...
.Net WebAPI -[HttpPut(“{fileServiceId:int}“)]
[HttpPut("{fileServiceId:int}")] 这个写法是 ASP.NET Core 中的一个路由特性,用于定义一个 HTTP PUT 请求的路由,并指定路由参数的类型。 解析 HttpPut [HttpPut]: 这是一个 ASP.NET Core 的路由特性,用于标记一个方…...
AI大模型开发原理篇-1:语言模型雏形之N-Gram模型
N-Gram模型概念 N-Gram模型是一种基于统计的语言模型,用于预测文本中某个词语的出现概率。它通过分析一个词语序列中前面N-1个词的出现频率来预测下一个词的出现。具体来说,N-Gram模型通过将文本切分为长度为N的词序列来进行建模。 注意:这…...
[250201] isd v0.3.0 发布:全新快捷键逻辑及其他改进 | Puma 6.6.0 版本发布
目录 isd v0.3.0 发布:全新快捷键逻辑及其他改进Puma 6.6.0 版本发布🆕 新特性🛠️Bug 修复💪 性能改进🔄 代码重构 isd v0.3.0 发布:全新快捷键逻辑及其他改进 isd (Interactive Systemd) 是一款文本用户…...
修改题注标签
为了防止原博主删帖,故转到自己账号中,出处如下 转载:(152条消息) 修改题注标签_Z_shsf的博客-CSDN博客_seq图arabic怎么解决 问题:论文中存在 标签图1- 和标签图 ,如何合并两种标签 成为图 并一起计数 按 AltF9 查…...
pytorch实现循环神经网络
人工智能例子汇总:AI常见的算法和例子-CSDN博客 PyTorch 提供三种主要的 RNN 变体: nn.RNN:最基本的循环神经网络,适用于短时依赖任务。nn.LSTM:长短时记忆网络,适用于长序列数据,能有效解决…...
Python从零构建macOS状态栏应用(仿ollama)并集成AI同款流式聊天 API 服务(含打包为独立应用)
在本教程中,我们将一步步构建一个 macOS 状态栏应用程序,并集成一个 Flask 服务器,提供流式响应的 API 服务。 如果你手中正好持有一台 MacBook Pro,又怀揣着搭建 AI 聊天服务的想法,却不知从何处迈出第一步,那么这篇文章绝对是你的及时雨。 最终,我们将实现以下功能: …...
leetcode 2080. 区间内查询数字的频率
题目如下 数据范围 示例 这题十分有意思一开始我想对每个子数组排序二分结果超时了。 转换思路:我们可以提前把每个数字出现的位置先记录下来形成集合, 然后拿着left和right利用二分查找看看left和right是不是在集合里然后做一个相减就出答案了。通过…...
深入了解 SSRF 漏洞:原理、条件、危害
目录 前言 SSRF 原理 漏洞产生原因 产生条件 使用协议 使用函数 漏洞影响 防御措施 结语 前言 本文将深入剖析 SSRF(服务端请求伪造)漏洞,从原理、产生原因、条件、影响,到防御措施,为你全面梳理相关知识&am…...
11.QT控件:输入类控件
1. Line Edit(单行输入框) QLineEdit表示单行输入框,用来输入一段文本,但是不能换行。 核心属性: 核心信号: 2. Text Edit(多行输入框) QTextEdit表示多行输入框,也是一个富文本 & markdown编辑器。并且能在内容超…...
Cesium+Vue3教程(011):打造数字城市
文章目录 Cesium打造数字城市创建项目加载地球设置底图设置摄像头查看具体位置和方向添加纽约建筑模型并设置样式添加纽约建筑模型设置样式划分城市区域并着色地图标记显示与实现实现飞机巡城完整项目下载Cesium打造数字城市 创建项目 使用vite创建vue3项目: pnpm create v…...
Windows系统本地部署deepseek 更改目录
本地部署deepseek 无论是mac还是windows系统本地部署deepseek或者其他模型的命令和步骤是一样的。 可以看: 本地部署deepsek 无论是ollama还是部署LLM时候都默认是系统磁盘,对于Windows系统,我们一般不把应用放到系统盘(C:)而是…...
基于Python的药物相互作用预测模型AI构建与优化(下.代码部分)
四、特征工程 4.1 分子描述符计算 分子描述符作为量化分子性质的关键数值,能够从多维度反映药物分子的结构和化学特征,在药物相互作用预测中起着举足轻重的作用。RDKit 库凭借其强大的功能,为我们提供了丰富的分子描述符计算方法,涵盖了多个重要方面的分子性质。 分子量…...
[Python学习日记-79] socket 开发中的粘包现象(解决模拟 SSH 远程执行命令代码中的粘包问题)
[Python学习日记-79] socket 开发中的粘包现象(解决模拟 SSH 远程执行命令代码中的粘包问题) 简介 粘包问题底层原理分析 粘包问题的解决 简介 在Python学习日记-78我们留下了两个问题,一个是服务器端 send() 中使用加号的问题,…...
origin如何在已经画好的图上修改数据且不改变原图像的画风和格式
例如我现在的.opju文件长这样 现在我换了数据集,我想修改这两个图表里对应的算法里的数据,但是我还想保留这图像现在的形式,可以尝试像下面这样做: 右击第一个图,出现下面,选择Book[sheet1] 选择工作簿 出…...
OPENGLPG第九版学习
文章目录 一、OpenGL概述二、着色器基础三、OpenGL绘制方式四、颜色、像素和片元五、视口变换、裁减、剪切与反馈六、纹理与帧缓存七、光照与阴影八、程序式纹理 skip九、细分着色器 skip十、几何着色器 skip十一、内存十二、计算着色器 skip附录 A 第三方支持库附录 B OpenGL …...
5.3.2 软件设计原则
文章目录 抽象模块化信息隐蔽与独立性衡量 软件设计原则:抽象、模块化、信息隐蔽。 抽象 抽象是抽出事物本质的共同特性。过程抽象是指将一个明确定义功能的操作当作单个实体看待。数据抽象是对数据的类型、操作、取值范围进行定义,然后通过这些操作对数…...
【ArcGIS遇上Python】批量提取多波段影像至单个波段
本案例基于ArcGIS python,将landsat影像的7个波段影像数据,批量提取至单个波段。 相关阅读:【ArcGIS微课1000例】0141:提取多波段影像中的单个波段 文章目录 一、数据准备二、效果比对二、python批处理1. 编写python代码2. 运行代码一、数据准备 实验数据及完整的python位…...
Spring Security(maven项目) 3.0.2.9版本 --- 改
前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…...
