【架构实战】Helm Chart应用部署最佳实践

简介: Helm是Kubernetes的包管理器:核心概念:Chart:应用包Repository:Chart仓库Release:部署实例

一、Helm 概述

Helm是Kubernetes的包管理器:

核心概念:

  • Chart:应用包
  • Repository:Chart仓库
  • Release:部署实例

二、Chart结构

mychart/
├── Chart.yaml          # 元数据
├── values.yaml         # 默认配置
├── values.schema.json  # 配置校验
├── templates/          # K8s资源模板
│   ├── deployment.yaml
│   ├── service.yaml
│   └── _helpers.tpl    # 辅助函数
└── charts/             # 依赖Chart

1. Chart.yaml

apiVersion: v2
name: myapp
description: My Application
type: application
version: 1.0.0
appVersion: "1.0"
keywords:
  - myapp
  - web
maintainers:
  - name: developer
    email: dev@example.com
dependencies:
  - name: redis
    version: "17.1.0"
    repository: "https://charts.bitnami.com/bitnami"

2. values.yaml

replicaCount: 3

image:
  repository: myapp/web
  tag: latest
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 80

resources:
  limits:
    cpu: 500m
    memory: 512Mi
  requests:
    cpu: 200m
    memory: 256Mi

ingress:
  enabled: true
  className: nginx
  hosts:
    - host: myapp.example.com
      paths:
        - path: /
          pathType: Prefix

三、 模板 语法

1. 变量引用

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {
   {
    .Release.Name }}-{
   {
    .Chart.Name }}
spec:
  replicas: {
   {
    .Values.replicaCount }}
  selector:
    matchLabels:
      app: {
   {
    .Chart.Name }}

2. 条件判断

{
   {
   - if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {
   {
    .Release.Name }}
spec:
  {
   {
   - end }}

3. 循环

{
   {
   - range .Values.ingress.hosts }}
- host: {
   {
    .host }}
  http:
    paths:
      {
   {
   - range .paths }}
      - path: {
   {
    .path }}
        pathType: {
   {
    .pathType }}
        backend:
          service:
            name: {
   {
    $.Release.Name }}
            port:
              number: 80
      {
   {
   - end }}
{
   {
   - end }}

4. 辅助函数

# _helpers.tpl
{
   {
   /*
Expand the name of the chart.
*/}}
{
   {
   - define "myapp.name" -}}
{
   {
   - default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{
   {
   - end }}

{
   {
   /*
Create a default fully qualified app name.
*/}}
{
   {
   - define "myapp.fullname" -}}
{
   {
   - if .Values.fullnameOverride }}
{
   {
   - .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{
   {
   - else }}
{
   {
   - $name := default .Chart.Name .Values.nameOverride }}
{
   {
   - if contains $name .Release.Name }}
{
   {
   - .Release.Name | trunc 63 | trimSuffix "-" }}
{
   {
   - else }}
{
   {
   - printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{
   {
   - end }}
{
   {
   - end }}
{
   {
   - end }}

四、Helm 命令

1. 基础命令

# 创建Chart
helm create mychart

# 打包Chart
helm package mychart

# 安装Chart
helm install myapp ./mychart

# 升级
helm upgrade myapp ./mychart

# 回滚
helm rollback myapp 1

# 卸载
helm uninstall myapp

2. 调试和验证

# 渲染模板
helm template myapp ./mychart

# 本地调试
helm install --dry-run --debug myapp ./mychart

# 验证Chart
helm lint ./mychart

3. 仓库管理

# 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami

# 更新仓库
helm repo update

# 搜索Chart
helm search repo nginx

# 列出已安装
helm list

五、最佳实践

1. 版本管理

# Chart.yaml
apiVersion: v2
name: myapp
version: 1.0.0      # Semantic Versioning
appVersion: "1.0"   # 应用版本

2. 配置 分离

# 生产环境配置
helm install myapp ./mychart -f production-values.yaml

# 开发环境配置
helm install myapp ./mychart -f dev-values.yaml

3. 密钥管理

# 使用SealedSecret或ExternalSecrets
apiVersion: v1
kind: Secret
metadata:
  name: {
   {
    include "myapp.fullname" . }}-secret
type: Opaque
stringData:
  password: {
   {
    .Values.db.password | b64enc }}

六、总结

Helm Chart最佳实践:

  • 结构清晰:合理组织Chart
  • 模板化:使用辅助函数
  • 版本管理:遵循语义化版本
  • 配置分离:环境差异化配置

个人观点,仅供参考

目录
相关文章
|
5月前
|
数据采集 人工智能 数据挖掘
一个人如何完成一个部门的工作?AI智能体工作流搭建教程
本文详解如何用AI智能体搭建“一人部门”工作流:将运营、客服、销售等岗位工作拆解为五层流程(目标→输入→处理→审核→输出→复盘),结合知识库、4类核心智能体、低代码编排工具与人工审核机制,实现可复用、可迭代的自动化协作。零基础也能3天跑通。
|
6月前
|
存储 JSON Kubernetes
【架构实战】Kubernetes日志收集:EFK/Loki架构
Kubernetes日志是排查问题的关键: 日志类型: 容器日志(stdout/stderr) 宿主机日志 应用日志 K8s组件日志
279 0
|
6月前
|
人工智能 Rust 运维
qwen3.6-27b批处理掉Token后,​D​М‌X​Α‌РΙ补偿重试
Qwen3.6-27B是270亿参数稠密多模态模型,兼顾强大智能体编程能力与工程落地性:百万上下文、原生多模态、家用显卡可跑,API友好,稳定可控,完美平衡性能、成本与可运维性,成为中文业务场景首选生产级大模型。(239字)
|
6月前
|
存储 安全 Java
【Java基础】String不可变性、String vs StringBuffer vs StringBuilder、常量池、intern()方法(附《思维导图》+《面试考点背诵版》)
本文系统解析Java字符串核心机制:String不可变性(`final char[]`实现)、String/StringBuffer/StringBuilder三者对比(可变性/线程安全/性能)、字符串常量池(JDK7+移至堆)及`intern()`方法(JDK7+直接存堆引用)。
|
6月前
|
人工智能 监控 安全
Gemini API 生产限流治理:从单点调用到企业网关
企业接入 Gemini API,技术难点不是发出请求,而是把模型调用变成可治理的基础设施。网关、限流、审计、成本和供应弹性做好之后,AI 能力才适合长期运行。
330 0
|
6月前
|
机器学习/深度学习 人工智能 算法
用好 Codex Goal,关键就这三步
Codex 新增 /goal 命令,支持目标驱动的Agent式循环:设定可量化目标(如“运行时间降20%且测试全通过”)、构建短反馈闭环、用PLAN/EXPERIMENTS等Markdown文件持久化记忆。三要素缺一不可,方能真正释放长任务自动化潜力。
1627 2
用好 Codex Goal,关键就这三步
|
6月前
|
数据采集 存储 自动驾驶
数据治理是什么?数据治理与数据要素、数据资源、数据资产、数据管理的区别
本文厘清“数据要素、资源、资产、管理、治理”五大易混淆概念:要素是国家层面的新型生产要素;资源是原始数据集合;资产是确权入表的价值形态;管理是全生命周期执行;治理是顶层设计与权责体系。五者层层递进,构成数据价值闭环。
|
6月前
|
人工智能 缓存 自然语言处理
阿里云百炼平台提供Token Plan团队版订阅是否值得选,有哪些优势?
阿里云百炼Token Plan团队版是面向企业/团队的AI大模型订阅服务,以统一Credits计量,支持Qwen、Kimi、GLM等十余款多模态模型及Cursor等主流工具;提供标准/高级/尊享三档坐席,预算可控、多租户隔离、数据安全,仅限华北2地域。(239字)
|
6月前
|
人工智能 API Python
办公Agent如何真正提效?用数据对比说明:介入前后团队时间消耗变化
这是一份真实办公提效实验报告:20人团队引入办公Agent后,事务与沟通时间骤降56%,人均每周多出9小时有效工作时间。数据揭示——AI不替代人,而是接管填表、催办、写纪要等低价值衔接工作,让人回归核心创造。(239字)
507 7
|
7月前
|
存储 运维 监控
互成软件终端智能告警体系(SIEM)设计与实施:从多源采集到多渠道通知的闭环方案
互成软件终端智能告警体系,覆盖违规外联、设备使用、安全风险、硬件/软件/配置/磁盘/性能等八大风险维度;支持动态模板通知、邮件短信双通道触达、多级关联聚合与降噪,并兼顾合规隐私。实现从事件检测到闭环处置的全链路安全运营。(239字)