新闻详情

新闻详情

首页 / 资讯中心 / 详情

使用 Helm 在裸金属 Kubernetes 集群上部署 Nginx 应用:Chart 模板、占位符与 Ingress 暴露全流程实战

发布时间:2026/9/25 2:54:53来源:尧图网络
使用 Helm 在裸金属 Kubernetes 集群上部署 Nginx 应用:Chart 模板、占位符与 Ingress 暴露全流程实战
云原生CI/CD运维【免费下载链接】DevOps-GuideDevOps Guide - Development to Production all configurations with basic notes to debug efficiently.项目地址https://gitcode.com/gh_mirrors/de/DevOps-Guide点击查看免费下载导读本文以 package-managers/helm/helm-demo.md 中的实战演示为核心完整还原「用 Helm 将 Nginx 应用部署到裸金属 Kubernetes 集群」的端到端流程从Chart.yaml元数据、templates/三件套Deployment、Service、Ingress的编写到helm install一键发布、{{ .Values.scale }}占位符实现配置化、helm upgrade --set动态扩缩容以及helm list/helm uninstall的发布管理。场景使用 Nginx Ingress Controller 与 MetalLB 在裸金属环境暴露服务读完本文你将具备用 Helm 封装并管理一个可复现、可配置 Kubernetes 应用发布的最小工程能力。实战背景裸金属集群上的「Helm Ingress MetalLB」组合本演示面向裸金属bare-metalKubernetes 集群没有云厂商托管的负载均衡器因此需要借助两个组件打通外部访问链路MetalLB为裸金属集群提供 LoadBalancer 类型的 Service 支持分配外部 IPNginx Ingress Controller作为集群入口根据 Ingress 规则将外部流量路由到内部 Service。而 Helm 的作用则是把 Deployment、Service、Ingress 这些原本需要逐个kubectl apply的资源打包成一个可版本化、可参数化的 Chart实现「一条命令部署整个应用」。整个工程位于helm-demo目录结构如下k8s-mastermaster:~/helm-demo$ ls Chart.yaml templates values.yaml一个标准 Chart 由三部分构成描述自身的Chart.yaml、渲染资源模板的templates/目录、以及提供默认参数值的values.yaml。关于 Chart 文件结构的基本约定可参考仓库中的 helm 概念文档。第一步用 Chart.yaml 描述发布元数据Chart 的元数据集中在Chart.yaml中它定义了 Chart 的名称、版本、用途说明和维护者信息是 Helm 识别和版本化管理每个发布的基础# helm-demo/Chart.yaml name: my-first-demo version: 1.0.0 description: easy helm demo maintainers: - name: Siwar各字段含义字段作用nameChart 名称同时也是安装后 Release 默认名称的一部分versionChart 版本号遵循语义化版本升级 Chart 时递增description对该 Chart 的简要说明maintainers维护者列表帮助使用者了解该 Chart 的负责人这份元数据不仅用于描述还会在模板渲染阶段通过内置对象Chart暴露给模板使用——例如{{ .Chart.Name }}-{{ .Chart.Version }}会渲染出my-first-demo-1.0.0。更多内置对象说明见 Helm 模板内置对象清单。第二步编写 templates/ 下的三类核心资源templates/目录是 Chart 的灵魂里面每个 YAML 文件都会被 Helm 渲染后提交到集群。本演示包含三个文件k8s-mastermaster:~/helm-demo/templates$ ls deployment.yaml ingress.yaml service.yaml2.1 deployment.yaml声明 Nginx 工作负载# helm-demo/templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx-deployment spec: selector: matchLabels: app: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80关键点selector.matchLabels与template.metadata.labels必须一致此处均为app: nginx这是 Deployment 关联 Pod 的依据replicas: 3声明期望副本数由 ReplicaSet 保证任何时刻都有 3 个 Pod 可用若 Pod 意外死亡会自动重建相关机制可参考 Kubernetes 概念文档 中的 Deployment / ReplicaSet 说明容器镜像固定为nginx:1.14.2暴露容器端口 80。2.2 service.yaml为 Pod 提供稳定访问入口# helm-demo/templates/service.yaml apiVersion: v1 kind: Service metadata: name: my-nginx-service spec: selector: app: nginx ports: - name: main protocol: TCP port: 80Service 通过selector: app: nginx收集后端 Pod为它们提供一个稳定的 ClusterIP 与 DNS 名称。注意Pod 会随调度变动 IP而 Service 的访问入口是固定的——这正是 Kubernetes Service 抽象的核心价值。2.3 ingress.yaml将流量按路径路由进集群# helm-demo/templates/ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-nginx-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / http.port: 443 spec: ingressClassName: nginx rules: - http: paths: - path: /testpath pathType: Prefix backend: service: name: my-nginx-service port: number: 80Ingress 是集群外部流量进入内部 Service 的「路由表」本示例要点ingressClassName: nginx指定由Nginx Ingress Controller处理该 Ingress对应裸金属环境的入口组件path: /testpathpathType: Prefix表示所有以/testpath开头的请求都会被转发到后端my-nginx-service的 80 端口注解nginx.ingress.kubernetes.io/rewrite-target: /会把请求路径重写为/后再转发这样后端 Nginx 就能正确响应根路径演示中通过http.port: 443注解在 Ingress 上暴露了443 端口HTTPS 入口这也是裸金属场景下由 MetalLB 分配外部 IP、Nginx Ingress Controller 监听对外端口完成流量接入的体现。至此三个模板文件已经构成了「Deployment运行→ Service内部寻址→ Ingress外部路由」的完整链路Helm 将按模板逐个创建这些资源。第三步helm install 一键部署并验证3.1 执行安装模板写好后无需逐个kubectl apply一条命令即可完成整套资源的创建k8s-mastermaster:~$ helm install --generate-name helm-demo/ NAME: helm-demo-1660310990 LAST DEPLOYED: Fri Aug 12 06:29:50 2022 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None--generate-name会为 Release 自动生成唯一名称此处为helm-demo-1660310990。输出信息解读输出项含义NAMERelease 名称后续upgrade/uninstall/rollback都以它为目标NAMESPACE部署到的命名空间默认defaultSTATUSdeployed表示发布成功REVISION发布修订号首次安装为 1每次 upgrade/rollback 递增TEST SUITE若 Chart 定义了测试钩子会显示本示例为None上述REVISION等字段也对应模板内置对象Release.Revision的取值来源详见 Helm 模板内置对象清单。3.2 用 kubectl get all 核对集群状态部署后立刻检查集群内的全部资源k8s-mastermaster:~$ kubectl get all NAME READY STATUS RESTARTS AGE pod/my-nginx-deployment-9456bbbf9-c74rs 0/1 ContainerCreating 0 11s pod/my-nginx-deployment-9456bbbf9-k4cdb 0/1 ContainerCreating 0 11s pod/my-nginx-deployment-9456bbbf9-mm7dm 0/1 ContainerCreating 0 11s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 none 443/TCP 22m service/my-nginx-service ClusterIP 10.100.146.193 none 80/TCP 11s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/my-nginx-deployment 0/3 3 0 11s NAME DESIRED CURRENT READY AGE replicaset.apps/my-nginx-deployment-9456bbbf9 3 3 0 11s可以看到 Helm 已一次性创建出3 个 Pod状态ContainerCreating正在拉取 nginx 镜像1 个 Servicemy-nginx-serviceClusterIP10.100.146.193暴露 80/TCP1 个 Deployment期望 3、当前 31 个 ReplicaSetmy-nginx-deployment-9456bbbf9由 Deployment 自动生成。待 Pod 变为Running后就可以通过 Ingress 分配到的外部 IP示例中为192.168.1.240在浏览器中访问http://192.168.1.240/testpath验证 Nginx 页面。3.3 对比传统方式kubectl apply 逐个提交回顾整个部署过程如果不用 Helm就需要对 Deployment、Service、Ingress 三个 YAML 文件分别执行kubectl apply -f deployment.yaml、kubectl apply -f service.yaml、kubectl apply -f ingress.yaml且没有版本管理与回滚能力。而 Helm 用一个 Chart 封装了「一组相关资源」一次helm install即可完成发布——这正是「Helm 是 Kubernetes 的包管理器」这一说法的直观体现。第四步用 values.yaml 与占位符实现配置化4.1 {{ .Values.scale }} 占位符Helm 最实用的能力之一就是模板占位符把写死在 YAML 里的数值替换为模板表达式运行时由values.yaml或命令行参数注入。改造后的 Deployment 模板如下# helming-once-more/templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx-deployment spec: selector: matchLabels: app: nginx replicas: {{.Values.scale}} template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80{{ .Values.scale }}表示「取 values.yaml 中scale键的值」其效果是修改配置时无需改动模板文件本身只要调整values.yaml即可改变最终生成的清单。对应的values.yaml内容k8s-mastermaster:~/helming-once-more$ cat values.yaml scale: 34.2 占位符背后的内置对象体系Values只是 Helm 模板内置对象之一。完整的可用对象还包括Release描述当前发布如Release.Name发布名、Release.Namespace目标命名空间、Release.IsUpgrade/Release.IsInstall当前操作类型、Release.Revision修订号、Release.Service固定为 HelmValues来自values.yaml与用户-f/--set传入的值默认空ChartChart.yaml的全部内容Files访问 Chart 内非模板文件提供Get、GetBytes、Glob、Lines、AsSecrets、AsConfig等方法Capabilities探测集群能力如Capabilities.KubeVersion.Version、Capabilities.APIVersions.HasTemplate当前模板信息Name、BasePath。详细字段说明见 Helm 模板内置对象清单。4.3 用新值重新安装带占位符的 Chart 安装方式与之前一致k8s-mastermaster:~$ helm install another-demo helming-once-more/ NAME: another-demo LAST DEPLOYED: Fri Aug 12 11:48:53 2022 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None验证 Pod 数量是否与values.yaml中的scale: 3一致k8s-mastermaster:~$ kubectl get pods NAME READY STATUS RESTARTS AGE my-nginx-deployment-9456bbbf9-mx45n 1/1 Running 0 3m9s my-nginx-deployment-9456bbbf9-rqkmw 1/1 Running 0 3m9s my-nginx-deployment-9456bbbf9-tl4wj 1/1 Running 0 3m9s正如预期由于values.yaml中scale: 3集群中正好运行着3 个 Pod——模板与配置解耦的价值在此体现同一套模板改一个参数即可复用。第五步helm upgrade --set 动态扩缩容当业务需要调整规模时不必改文件、更不必卸载重装使用helm upgrade配合--set直接覆盖参数k8s-mastermaster:~$ helm upgrade --set scale5 another-demo ./helming-once-more/ Release another-demo has been upgraded. Happy Helming! NAME: another-demo LAST DEPLOYED: Fri Aug 12 11:55:14 2022 NAMESPACE: default STATUS: deployed REVISION: 2 TEST SUITE: None注意REVISION已从 1 变为2——这是一次新的发布修订。随后查看 Podk8s-mastermaster:~$ kubectl get pod NAME READY STATUS RESTARTS AGE my-nginx-deployment-9456bbbf9-7ddlm 1/1 Running 0 95s my-nginx-deployment-9456bbbf9-mx45n 1/1 Running 0 8m9s my-nginx-deployment-9456bbbf9-rqkmw 1/1 Running 0 8m9s my-nginx-deployment-9456bbbf9-tl4wj 1/1 Running 0 8m9s my-nginx-deployment-9456bbbf9-tpsqv 1/1 Running 0 96sPod 数量由 3 平滑扩容到5新 Pod7ddlm、tpsqv已就绪全程无需人工编辑任何 YAML。--set的优先级高于values.yaml适合临时性调整若要固化配置应把值写回values.yaml再升级。模板层面对这类动态渲染还提供了配套能力quote函数用于给从Values注入的字符串加引号以避免类型歧义if/else、with、range分别用于条件渲染、作用域限定与循环遍历lookup函数可查询集群中已存在的资源。这些语法细节可继续阅读 Helm 模板指南。第六步helm list 与 helm uninstall 清理发布管理同样围绕 Release 展开。先列出集群中已安装的 Releasek8s-mastermaster:~$ helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION another-demo default 2 2022-08-12 11:55:14.913503686 -0700 PDT deployed another-demo-1.0.0可以看到another-demo当前为修订 2、状态deployed。不再需要该应用时一条helm uninstall即可连同其管理的全部资源一并删除k8s-mastermaster:~$ helm uninstall another-demo release another-demo uninstalled对比手工方式——若用kubectl删除需要分别找到 Deployment、ReplicaSet、Service、Pod 逐个清理且容易遗漏而 Helm 通过 Release 记录「这个发布创建了哪些资源」卸载时按记录统一回收这也是 Helm 管理应用生命周期的核心优势。附录围绕本演示的 Helm 生态延伸A. 前置安装 Helm CLI本演示假设环境已具备helm命令。若尚未安装可参考仓库中的 Helm 安装指南支持多种方式下载官方二进制 release 解压后放入PATH如tar -zxvf helm-v3.x.x-linux-amd64.tar.gz后mv linux-amd64/helm /usr/local/bin/helm、使用官方安装脚本curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3后执行以及brew install helmmacOS、choco install kubernetes-helmWindows、Apt/SnapLinux等包管理器途径。B. 进阶Chart Hooks 介入发布生命周期生产环境往往需要在发布的关键节点执行额外动作如备份数据库、迁移数据、优雅下线。Helm 通过Hooks机制支持在 Release 生命周期的特定时点介入常用钩子如下完整列表见 helm 概念文档Hook触发时机pre-install模板渲染后、资源创建前post-install所有资源加载进集群后pre-delete删除请求发起后、资源删除前post-delete所有资源删除后pre-upgrade升级请求模板渲染后、资源更新前post-upgrade所有资源升级完成后pre-rollback回滚请求模板渲染后、资源回滚前post-rollback回滚完成后test执行helm test子命令时例如升级前执行一个 Job 备份数据库、删除前优雅摘除服务流量都是 Hooks 的典型用法。它们与普通模板写法一致仅通过特殊注解让 Helm 以不同方式调度。C. 原理延伸模板渲染与内置对象本演示中的{{ .Values.scale }}只是 Helm 模板引擎的冰山一角。深入 Helm 模板指南 可系统掌握内置对象Release / Values / Chart / Files / Capabilities / Template、lookup运行时查询、quote引用、以及if/else、with、range三类流程控制结构。理解这些机制后你就能把本演示的最小 Chart 演进为可处理条件分支、循环渲染与动态配置的完整生产级 Chart。至此从 Chart 骨架搭建、三模板编写、一键安装、参数化占位、动态升级到最终卸载一条完整的 Helm 发布流水线已在裸金属集群上跑通。你可以基于helm-demo目录结构Chart.yamltemplates/values.yaml把它复制为任何新应用的起点替换镜像、调整values.yaml参数、增加 Hooks即可获得一套可版本化、可回滚、可参数化的 Kubernetes 发布方案。赞分享云原生CI/CD运维【免费下载链接】DevOps-GuideDevOps Guide - Development to Production all configurations with basic notes to debug efficiently.项目地址https://gitcode.com/gh_mirrors/de/DevOps-Guide点击查看免费下载相关推荐如何在裸金属 Kubernetes 集群用 MetalLB L2 模式为 ingress-nginx 分配外部 LoadBalancer IP如何在裸金属 Kubernetes 集群用 MetalLB L2 模式为 ingress nginx 分配外部 LoadBalancer IP 裸金属或裸 V后端API网关负载均衡云原生Meshery 实战使用 NGINX Ingress 在 Kubernetes 中暴露应用Catalog 设计全解析Meshery 实战使用 NGINX Ingress 在 Kubernetes 中暴露应用Catalog 设计全解析 Meshery Catalog 是社云原生微服务运维DevOpskubeasz 实战使用 Helm Chart 在 Kubernetes 上部署 MariaDB 主从复制集群kubeasz 实战使用 Helm Chart 在 Kubernetes 上部署 MariaDB 主从复制集群 本篇指南以 kubeasz 仓库 manife云原生集群管理运维上一篇WireMock JSON模式匹配验证请求数据结构下一篇告别繁琐标注Sketch Measure与Runner集成的3分钟效率革命创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

CiLocks ADB连接问题排查:unauthorized、no devices等8个常见报错速查 2026/9/25 4:09:25

CiLocks ADB连接问题排查:unauthorized、no devices等8个常见报错速查

CiLocks ADB连接问题排查:unauthorized、no devices等8个常见报错速查 【免费下载链接】CiLocks Crack Interface lockscreen, Metasploit and More Android/IOS Hacking 项目地址: https://gitcode.com/GitHub_Trending/ci/CiLocks CiLocks 是一款免费的 An…

阅读更多 →
AI客服系统响应时长从50分钟到2分半:Token管理、幻觉治理与多模态处理实战 2026/9/25 4:09:19

AI客服系统响应时长从50分钟到2分半:Token管理、幻觉治理与多模态处理实战

1. 项目背景与核心目标拆解1.1 为什么响应时长是客服系统的生死线50分钟到2分半,这个数字对比放在任何一家做客服业务的公司里,都足够让技术负责人心跳加速。我所在的项目组从零搭建了一套AI客服系统,上线前三个月,平均首次响应时…

阅读更多 →
ng-zorro-antd Code Editor 组件全指南:在 Angular 中集成 monaco-editor 的加载模式、配置与实战 2026/9/25 4:09:19

ng-zorro-antd Code Editor 组件全指南:在 Angular 中集成 monaco-editor 的加载模式、配置与实战

UI组件前端 【免费下载链接】ng-zorro-antd Angular UI Component Library based on Ant Design 项目地址: https://gitcode.com/gh_mirrors/ng/ng-zorro-antd 点击查看 免费下载 导读 nz-code-editor 是 ng-zorro-antd 基于微软 monaco-editor 封装的开箱即用型 …

阅读更多 →
Hypothesis 策略适配指南:用 map、filter 与 assume 精确控制测试数据生成 2026/9/25 4:09:19

Hypothesis 策略适配指南:用 map、filter 与 assume 精确控制测试数据生成

测试开发工具 【免费下载链接】hypothesis The property-based testing library for Python 项目地址: https://gitcode.com/gh_mirrors/hy/hypothesis 点击查看 免费下载 本篇指南聚焦 Hypothesis(Python 属性基测试库)中"适配策略&qu…

阅读更多 →
金融AI审计落地:风险矩阵、证据链与FDE实操指南 2026/9/25 4:09:13

金融AI审计落地:风险矩阵、证据链与FDE实操指南

1. 金融AI落地的审计困境与破局思路金融行业对AI的态度一直很拧巴。业务部门想要更快的审批速度、更准的风险定价、更低的运营成本,技术团队手里也有大模型和机器学习工具,但每次项目推进到合规审查环节,就会被一连串问题卡住:这个…

阅读更多 →
HR效率革命:WorkBuddy加Skill实战,从简历筛选到薪酬核算全自动化 2026/9/25 4:09:13

HR效率革命:WorkBuddy加Skill实战,从简历筛选到薪酬核算全自动化

1. 从HR的日常痛点说起:为什么WorkBuddy加Skill能让人“爽爆”HR这个岗位,外行看着光鲜,内行才知道有多琐碎。招聘季一天筛几百份简历,眼睛都快看瞎;员工入职要收集身份证、学历证、银行卡、体检报告,少一样…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉