Helm完全指南:Kubernetes包管理器

Helm完全指南:Kubernetes包管理器


前言

本教程专为以下读者编写:

目标读者

  • 想使用Helm简化Kubernetes应用部署的运维人员
  • 需要管理多环境配置的DevOps工程师
  • 想复用社区Chart的开发者
  • 正在搭建CI/CD流水线的工程师
  • 学完本教程后,你将能够: 1. 使用Helm搜索、安装、升级和回滚应用 2. 创建和定制自己的Chart 3. 管理Chart依赖和版本 4. 使用Helm部署生产级应用 5. 搭建私有Chart仓库


1. Helm基础

1.1 安装Helm


# Linux安装
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# 验证安装
helm version
helm repo list

# 添加常用仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add prometheus https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update

1.2 常用命令


# 搜索应用
helm search repo nginx
helm search repo prometheus --versions

# 安装应用
helm install my-release bitnami/nginx
helm install my-release bitnami/nginx --set replicaCount=3

# 升级和回滚
helm upgrade my-release bitnami/nginx
helm rollback my-release 1

# 查看状态
helm list
helm status my-release
helm get values my-release

# 卸载
helm uninstall my-release

2. 自定义Chart

2.1 创建Chart


# 创建新Chart
helm create mychart
tree mychart/

# Chart目录结构
mychart/
├── Chart.yaml          # Chart元数据
├── values.yaml       # 默认配置值
├── values.schema.json # 值验证模式
├── charts/           # 依赖Chart
├── templates/        # Kubernetes模板
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── _helpers.tpl  # 辅助函数
│   └── NOTES.txt     # 使用说明
└── crds/           # 自定义资源定义

2.2 Chart.yaml详解


apiVersion: v2
name: my-application
description: A production-ready Kubernetes application
type: application
version: 1.0.0
appVersion: "1.0.0"

dependencies:
- name: postgresql
  version: "12.x.x"
  repository: "https://charts.bitnami.com/bitnami"
  condition: postgresql.enabled
  alias: database

keywords:
- application
- web

2.3 values.yaml详解


# 副本配置
replicaCount: 3

# 镜像配置
image:
  repository: myregistry/myapp
  pullPolicy: IfNotPresent
  tag: "v1.0.0"

# 服务配置
service:
  type: ClusterIP
  port: 80

# 资源限制
resources:
  requests:
    cpu: "100m"
    memory: "128Mi"
  limits:
    cpu: "500m"
    memory: "512Mi"

3. 模板开发

3.1 deployment.yaml模板


apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "mychart.fullname" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ include "mychart.name" . }}
  template:
    metadata:
      labels:
        app: {{ include "mychart.name" . }}
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        ports:
        - containerPort: {{ .Values.service.port }}
        resources:
          {{- toYaml .Values.resources | nindent 12 }}

3.2 辅助函数


{{- define "mychart.name" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 -}}
{{- end -}}

{{- define "mychart.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 -}}
{{- else }}
{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 -}}
{{- end -}}
{{- end -}}

4. 依赖管理

4.1 依赖配置


# Chart.yaml dependencies
dependencies:
- name: postgresql
  version: "12.x.x"
  repository: "https://charts.bitnami.com/bitnami"
  condition: postgresql.enabled

- name: redis
  version: "18.x.x"
  repository: "https://charts.bitnami.com/bitnami"

4.2 依赖管理命令


# 更新依赖
helm dependency update ./mychart

# 查看依赖
helm dependency list ./mychart

# 构建依赖
helm dependency build ./mychart

# 打包Chart
helm package ./mychart

5. 测试和验证

5.1 测试Chart


# 模板渲染测试
helm template ./mychart

# 安装测试
helm install --dry-run ./mychart

# kubeconform验证
helm template ./mychart | kubeconform

# 运行测试
helm test ./mychart

5.2 发布Chart


# 打包
helm package ./mychart

# 发布到私有仓库
curl -u user:password \
  https://chartmuseum.example.com/api/charts \
  --data-binary "@mychart-1.0.0.tgz"

6. 最佳实践

6.1 Chart开发规范


# values.yaml最佳实践
image:
  repository: myregistry/myapp
  pullPolicy: IfNotPresent
  tag: "v1.0.0"

resources:
  requests:
    cpu: "100m"
    memory: "128Mi"
  limits:
    cpu: "500m"
    memory: "512Mi"

autoscaling:
  enabled: true
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 70

6.2 安全配置


podSecurityContext:
  runAsNonRoot: true
  runAsUser: 1000

securityContext:
  allowPrivilegeEscalation: false
  readOnlyRootFilesystem: true
  capabilities:
    drop:
      - ALL

总结

核心要点: 1. Helm简化了Kubernetes应用部署和管理 2. Chart模板化配置提高了复用性 3. 依赖管理简化了复杂应用的部署 4. OCI仓库便于Chart分发和版本管理

进阶学习

  • 学习Helm插件开发
  • 搭建私有Chart仓库
  • 集成到CI/CD流水线
  • 参考资源

  • 官方文档:https://helm.sh/docs/
  • Chart仓库:https://artifacthub.io/

发表回复

后才能评论