🚀 详解 Helm 部署 Ingress-NGINX:从零到一的全面指南

举报
bug菌 发表于 2024/10/30 21:48:34 2024/10/30
【摘要】   咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!环境说明:Windows 10 +...

  咦咦咦,各位小可爱,我是你们的好伙伴——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 目录中的一些重要文件示例:

  1. 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.repositorycontroller.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 集群管理更加高效和便捷。

  1. 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。

  1. 安装 Helm
    确保在你的系统上安装了 Helm,可以通过以下命令来安装:

    curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
    
  2. 添加 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
    
  3. 安装 Ingress-NGINX
    使用 Helm 安装 Ingress-NGINX,下面的命令会将其安装到 Kubernetes 集群中:

    helm install my-nginx ingress-nginx/ingress-nginx
    
  4. 验证安装
    安装完成后,可以通过以下命令查看 NGINX 控制器的 Pods 状态:

    kubectl get pods -n ingress-nginx
    

应用场景演示

通过部署 Ingress-NGINX,我们可以轻松地将外部流量路由到不同的服务。例如,当用户访问 example.com 时,Ingress 控制器可以根据规则将流量路由到 service-aservice-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 方法:

    • 设置了 ingressNamemy-nginx,该名称对应之前通过 Helm 部署的 Ingress 控制器。
    • 调用 checkIngressStatus 方法来检查 Ingress 状态,输出运行状态的提示信息。
  • checkIngressStatus 方法:

    • 该方法在实际应用中可以通过 Kubernetes API 来查询指定 Ingress 的状态(例如使用 kubectl 或者 Kubernetes 的 Java 客户端库)。
    • 在这个例子中,checkIngressStatus 方法返回 true,表示 NGINX 正常运行。在真实环境中,可以替换为 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电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。