🚀 详解 Helm 部署 Ingress-NGINX:从零到一的全面指南
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
📖 前言
在现代云原生应用架构中,Kubernetes 已成为推动应用容器化的重要平台。随着微服务架构的流行,如何高效地管理和路由外部流量成为了开发者必须面对的挑战。而 Ingress 是 Kubernetes 中用来管理外部访问服务的一种机制,它能够根据 HTTP 和 HTTPS 请求将流量路由到集群内部的不同服务。而在众多 Ingress 控制器中,NGINX 凭借其优秀的性能和灵活性成为了最受欢迎的选择之一。
然而,手动配置和管理 Ingress 控制器可能会非常繁琐,这时 Helm 作为 Kubernetes 的包管理工具,提供了一种更简单、高效的方式来进行部署与管理。在这篇文章中,我们将深入探讨如何通过 Helm 部署 Ingress-NGINX,并分享一些实用的案例和个人心得,希望能够帮助你更好地理解和应用这一技术!
📝 摘要
本文将涵盖以下几个方面:
- Ingress 和 NGINX 的基本概念
- Helm 的工作原理和基本使用
- Helm 安装 Ingress-NGINX 的详细步骤
- 代码示例与测试用例
- 优缺点分析
- 个人总结与寄语
希望通过这篇文章,读者能够掌握 Helm 部署 Ingress-NGINX 的全过程,并在实际项目中灵活应用。
📚 简介
Ingress 是 Kubernetes 中的一种资源,它定义了如何将外部请求路由到内部服务。使用 Ingress,可以通过一个公共的 IP 地址和一个或多个域名来访问不同的服务。NGINX 是一种高性能的反向代理和负载均衡器,在 Kubernetes 中,它可以作为 Ingress 控制器来处理进入集群的流量。
Helm 是 Kubernetes 的一个包管理器,它可以将 Kubernetes 应用打包成 Charts,简化应用的安装、升级和管理。使用 Helm,开发者可以更轻松地部署复杂的 Kubernetes 应用,包括 Ingress-NGINX。
🌐 概述
1. Ingress 和 NGINX
Ingress 控制器是 Kubernetes 的一种功能扩展,它允许用户通过定义 Ingress 资源来管理外部 HTTP/S 流量的路由。NGINX Ingress Controller 是一个强大的解决方案,提供了负载均衡、SSL/TLS 终止、路径和主机名路由等功能。
2. Helm 的工作原理
Helm 通过使用 Charts 使得 Kubernetes 应用的管理更加简单。一个 Chart 可以视为一个包,包含应用所需的所有 Kubernetes 资源和配置。通过 Helm,用户可以快速安装、升级和卸载 Kubernetes 应用。
💻 核心源码解读
Helm Chart 结构
一个典型的 Helm Chart 包含以下几个重要文件和目录:
Chart.yaml
:描述 Chart 的元数据,包括名称、版本和描述等。values.yaml
:定义应用的默认配置值,用户可以在安装时覆盖这些值。templates/
:存放 Kubernetes 资源的模板文件,Helm 会根据这些模板生成实际的 Kubernetes 资源。
以下是一个简单的 Chart.yaml
示例:
apiVersion: v2
name: ingress-nginx
description: A Helm chart for Kubernetes Ingress NGINX
version: 1.0.0
示例 templates
以下是 templates
目录中的一些重要文件示例:
- deployment.yaml:定义 NGINX 控制器的 Deployment。
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-controller
spec:
replicas: {{ .Values.controller.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}-controller
template:
metadata:
labels:
app: {{ .Release.Name }}-controller
spec:
containers:
- name: controller
image: {{ .Values.controller.image.repository }}:{{ .Values.controller.image.tag }}
ports:
- containerPort: 80
- containerPort: 443
args:
- /nginx-ingress-controller
代码解析:
在本次的代码演示中,我将会深入剖析每句代码,详细阐述其背后的设计思想和实现逻辑。通过这样的讲解方式,我希望能够引导同学们逐步构建起对代码的深刻理解。我会先从代码的结构开始,逐步拆解每个模块的功能和作用,并指出关键的代码段,并解释它们是如何协同运行的。通过这样的讲解和实践相结合的方式,我相信每位同学都能够对代码有更深入的理解,并能够早日将其掌握,应用到自己的学习和工作中。
这个 YAML 文件是一个 Helm 模板,用于部署 Kubernetes Deployment
资源,配置了一个 controller
容器实例化的负载均衡控制器。它通过 Helm 模板语法实现动态配置,适合在不同环境中灵活调整参数。
配置解析
-
apiVersion: 定义 Kubernetes API 的版本
apps/v1
。 -
kind: 资源类型是
Deployment
,用于创建和管理controller
容器的副本。 -
metadata:
name
: 使用模板语法{{ .Release.Name }}
将 Deployment 命名为Release
名称加上-controller
,以便在不同的 Helm Release 中生成不同的名称,避免冲突。
-
spec:
replicas
: 副本数量,从 Helm 的Values
文件controller.replicaCount
中动态获取,支持灵活扩展。selector
: 定义标签选择器,确保与模板定义的标签app: {{ .Release.Name }}-controller
匹配,以便 Deployment 可以找到正确的 Pod。
-
template:
-
metadata:
labels
: 配置 Pod 的标签,用于匹配选择器的app
标签。
-
spec:
containers
: 定义容器配置。name
: 容器名称为controller
。image
: 使用 Helm 值文件中的controller.image.repository
和controller.image.tag
来动态设置容器镜像。ports
: 声明容器端口,监听 80 和 443 端口以处理 HTTP 和 HTTPS 请求。args
: 配置启动参数,/nginx-ingress-controller
表示使用 NGINX Ingress 控制器。
-
工作原理
该 Deployment 主要用于管理 Ingress 控制器的实例数和镜像版本,使我们可以轻松地横向扩展控制器,或通过 Values
文件进行镜像更新。
实际应用场景
- 自动化扩展:通过 Helm 的模板化,部署时可以指定不同的
replicaCount
实现自动化扩展。 - 灵活配置镜像:使用
Values
文件中的镜像配置项来控制镜像来源与版本,方便在不同环境(如测试、生产)中快速更新控制器版本。 - 简化管理:基于模板创建的 Deployment 可以结合 Helm 的滚动更新、回滚等功能,提升 Ingress 控制器管理的效率。
小结
此 Helm 模板展示了如何使用 Deployment 配置 NGINX Ingress 控制器的基本操作。通过 Helm 的灵活参数化,不仅能够高效管理控制器的生命周期,还能满足不同环境的需求,使 Kubernetes 集群管理更加高效和便捷。
- service.yaml:定义 NGINX 控制器的 Service。
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}-controller
spec:
type: {{ .Values.controller.service.type }}
ports:
- port: 80
targetPort: 80
- port: 443
targetPort: 443
selector:
app: {{ .Release.Name }}-controller
🔍 案例分析
Helm 部署 Ingress-NGINX
接下来,我们将通过实际操作来演示如何使用 Helm 部署 Ingress-NGINX。
-
安装 Helm:
确保在你的系统上安装了 Helm,可以通过以下命令来安装:curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
-
添加 Helm 仓库:
添加官方的 Ingress-NGINX Helm 仓库,并更新本地仓库信息:helm repo add ingress-nginx https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/helm-chart/ingress-nginx helm repo update
-
安装 Ingress-NGINX:
使用 Helm 安装 Ingress-NGINX,下面的命令会将其安装到 Kubernetes 集群中:helm install my-nginx ingress-nginx/ingress-nginx
-
验证安装:
安装完成后,可以通过以下命令查看 NGINX 控制器的 Pods 状态:kubectl get pods -n ingress-nginx
应用场景演示
通过部署 Ingress-NGINX,我们可以轻松地将外部流量路由到不同的服务。例如,当用户访问 example.com
时,Ingress 控制器可以根据规则将流量路由到 service-a
或 service-b
。
我们可以创建一个简单的 Ingress 资源来演示这个场景:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-a
port:
number: 80
代码分析:
在本次的代码演示中,我将会深入剖析每句代码,详细阐述其背后的设计思想和实现逻辑。通过这样的讲解方式,我希望能够引导同学们逐步构建起对代码的深刻理解。我会先从代码的结构开始,逐步拆解每个模块的功能和作用,并指出关键的代码段,并解释它们是如何协同运行的。通过这样的讲解和实践相结合的方式,我相信每位同学都能够对代码有更深入的理解,并能够早日将其掌握,应用到自己的学习和工作中。
这个 YAML 文件定义了一个 Kubernetes Ingress 资源,用于管理对 example.com
的流量,具体使用了 NGINX Ingress 控制器进行流量转发和路由配置。
配置解析
-
apiVersion: 定义了 Kubernetes API 的版本,这里使用
networking.k8s.io/v1
。 -
kind: 资源类型是
Ingress
,用于定义应用的 HTTP 和 HTTPS 路由规则。 -
metadata:
name
: 设置 Ingress 的名称为example-ingress
。annotations
: 包含一些额外配置项,比如nginx.ingress.kubernetes.io/rewrite-target
设置为/
,用于将请求路径重写为指定的目标路径。
-
spec:
rules
: 定义了路由规则。host
: 指定了该 Ingress 处理的主机名为example.com
。http
: 规定 HTTP 流量的路由。paths
: 定义了访问路径。path
: 设为/
,表示处理所有路径前缀为/
的请求。pathType
: 设置为Prefix
,表示前缀匹配。backend
: 指定服务名称和端口,流量将被路由到该后端服务。service
:name
: 指定目标服务的名称为service-a
。port
: 目标服务的端口设置为80
。
流程解析
通过这个配置,当访问 http://example.com/
时,NGINX Ingress 会将请求重写并转发到 service-a
的 80 端口上。这样,可以方便地实现通过域名和路径来管理不同服务的访问。
实际应用场景
- 重写路径:
nginx.ingress.kubernetes.io/rewrite-target
注解常用于将请求路径重写为指定路径,特别适用于反向代理。 - 多服务支持: 可以在
rules
中添加多个paths
或多个host
来管理更多服务,方便微服务架构中使用。
小结
这个配置文件展示了如何使用 NGINX Ingress 结合 Kubernetes 的服务,实现基本的域名和路径路由。在生产环境中可以通过类似配置来方便地管理流量,提高系统的可扩展性和易维护性。
⚖️ 优缺点分析
优点
- 简化管理:使用 Helm 部署大大减少了手动配置的复杂性。
- 灵活性高:支持多种配置,可以轻松满足不同需求。
- 社区支持:Ingress-NGINX 拥有活跃的社区,可以快速获取帮助和支持。
缺点
- 学习曲线:对于初学者而言,理解 Helm 和 Ingress 的概念可能需要一定时间。
- 依赖管理:在使用 Helm 的过程中,需要注意版本的兼容性和依赖关系。
- 调试困难:当出现问题时,调试 Ingress 控制器可能较为复杂,尤其是在集群规模较大的情况下。
📊 类代码方法介绍及演示
以下是 Helm Chart 安装 Ingress-NGINX 的主要命令示例:
helm install my-nginx ingress-nginx/ingress-nginx \
--set controller.replicaCount=2 \
--set controller.service.type=LoadBalancer
在此命令中,我们可以设置 NGINX 控制器的副本数和服务类型(例如 LoadBalancer、NodePort 或 ClusterIP)。
🧪 测试用例
为了验证 Ingress-NGINX 的正确部署,我们可以使用以下测试代码:
public class IngressTest {
public static void main(String[] args) {
String ingressName = "my-nginx";
// 测试 NGINX 是否正常运行
boolean isRunning = checkIngressStatus(ingressName);
System.out.println("Ingress NGINX 状态: " + (isRunning ? "运行中" : "未运行"));
}
public static boolean checkIngressStatus(String ingressName) {
// 这里可以调用 Kubernetes API 查询 Ingress 状态
// 模拟 API 调用结果
return true; // 假设返回 true 表示运行中
}
}
测试结果预期
运行以上代码后,期望输出应为:
Ingress NGINX 状态: 运行中
🔎 测试代码分析
在本次的代码演示中,我将会深入剖析每句代码,详细阐述其背后的设计思想和实现逻辑。通过这样的讲解方式,我希望能够引导同学们逐步构建起对代码的深刻理解。我会先从代码的结构开始,逐步拆解每个模块的功能和作用,并指出关键的代码段,并解释它们是如何协同运行的。通过这样的讲解和实践相结合的方式,我相信每位同学都能够对代码有更深入的理解,并能够早日将其掌握,应用到自己的学习和工作中。
测试代码中,我们通过 checkIngressStatus
方法来验证 Ingress 的状态。实际应用中,这个方法可以调用 Kubernetes API 来获取 Ingress 的实际状态。如果返回值为 true,表示 Ingress 正在正常运行;否则,说明 Ingress 出运行状态存在问题。
在这个 IngressTest
类中,我们通过模拟 checkIngressStatus
方法来验证 Ingress-NGINX 是否正常运行。
代码解析
-
main
方法:- 设置了
ingressName
为my-nginx
,该名称对应之前通过 Helm 部署的 Ingress 控制器。 - 调用
checkIngressStatus
方法来检查 Ingress 状态,输出运行状态的提示信息。
- 设置了
-
checkIngressStatus
方法:- 该方法在实际应用中可以通过 Kubernetes API 来查询指定 Ingress 的状态(例如使用
kubectl
或者 Kubernetes 的 Java 客户端库)。 - 在这个例子中,
checkIngressStatus
方法返回true
,表示 NGINX 正常运行。在真实环境中,可以替换为 API 调用,判断 Ingress 的实际状态。
- 该方法在实际应用中可以通过 Kubernetes API 来查询指定 Ingress 的状态(例如使用
运行结果示例
假设 checkIngressStatus
方法的返回值为 true
,程序的输出应为:
Ingress NGINX 状态: 运行中
如果返回 false
,则输出:
Ingress NGINX 状态: 未运行
实际环境应用
在生产环境中,可以将 checkIngressStatus
方法替换为一个 API 调用。利用 Kubernetes 的 Java 客户端库,查询 ingressName
是否在指定的命名空间中运行,并根据查询结果返回运行状态。这将为集群管理和监控提供更可靠的支持。
小结
本测试代码通过模拟方式验证 Ingress-NGINX 的运行状态,为测试 NGINX 控制器的运行情况提供了一个简单的方案。在实际应用中,进一步结合 Kubernetes API,可以实现自动化的状态检查与通知,大大提高了系统的可维护性与可用性。
🤔 小结
通过以上案例和代码示例,我们可以看到使用 Helm 部署 Ingress-NGINX 的便利性。利用 Helm,我们只需少量的命令和配置即可快速部署一个可用的 Ingress 控制器,并且可以轻松对其进行管理和扩展。这个流程不仅节省了时间,还极大地降低了手动配置的复杂性,尤其在大规模集群管理中尤为实用。
🎉 总结
在云原生环境中,流量管理始终是一个至关重要的问题。Ingress-NGINX 作为 Kubernetes 中常用的 Ingress 控制器,以其高性能和丰富的功能,帮助开发者更好地管理服务间的流量。通过 Helm 部署 Ingress-NGINX,不仅简化了流程,还提高了可维护性和扩展性,让我们能够更专注于业务逻辑的实现。
在这篇文章中,我们详细介绍了 Ingress 和 NGINX 的基础概念、Helm 的工作原理,逐步引导大家如何使用 Helm 部署 Ingress-NGINX。希望通过这篇文章,大家能够对 Ingress 流量管理和 Helm 部署有一个更清晰的认识,并能够将其应用到自己的项目中。
💬 寄语
虽然 Kubernetes 的配置和管理存在一定的复杂性,但正是通过这些工具的组合和合理的使用,才能够帮助我们构建高可用、高扩展的应用架构。在探索 Kubernetes 的旅程中,愿你始终保持好奇和耐心,不断挑战新的技术领域。希望今天的内容能为你的开发之路增添一点灵感!
…
好啦,这期的内容就基本接近尾声啦,若你想学习更多,可以参考这篇专栏总结《「滚雪球学Java」教程导航帖》,本专栏致力打造最硬核 Java 零基础系列学习内容,🚀打造全网精品硬核专栏,带你直线超车;欢迎大家订阅持续学习。
🌴附录源码
如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。
☀️建议/推荐你
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
📣Who am I?
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。
- 点赞
- 收藏
- 关注作者
评论(0)