← 返回首页
🔧

Kubernetes Helm 包管理器

📂 devops ⏱ 3 min 443 words

Kubernetes Helm 包管理器

什么是 Helm

Helm 是 Kubernetes 的包管理器,类似于 Linux 的 apt 或 yum。它将 Kubernetes 资源打包成 Chart,支持模板化、版本管理和依赖管理,极大简化了应用的部署和管理。

安装 Helm

# macOS
brew install helm

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

# Windows
choco install kubernetes-helm

验证安装:

helm version

Helm 仓库管理

添加仓库

# 添加官方仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

# 更新仓库
helm repo update

# 查看已添加仓库
helm repo list

搜索 Chart

# 搜索 nginx 相关 chart
helm search repo nginx

# 搜索特定版本
helm search repo nginx --versions

安装 Chart

基本安装

# 安装 nginx
helm install my-nginx bitnami/nginx

# 指定命名空间
helm install my-nginx bitnami/nginx -n web --create-namespace

# 查看安装状态
helm list -n web

使用自定义值

# 查看默认值
helm show values bitnami/nginx

# 使用自定义值文件
helm install my-nginx bitnami/nginx -f custom-values.yaml

# 命令行覆盖值
helm install my-nginx bitnami/nginx --set service.type=NodePort

创建 Chart

初始化 Chart 结构

helm create my-chart

生成的目录结构:

my-chart/
├── Chart.yaml
├── values.yaml
├── templates/
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   ├── _helpers.tpl
│   └── NOTES.txt
├── charts/
└── .helmignore

Chart.yaml 配置

apiVersion: v2
name: my-chart
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.0.0"

values.yaml 配置

replicaCount: 2

image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: "latest"

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: false
  className: nginx
  hosts:
    - host: chart-example.local
      paths:
        - path: /
          pathType: Prefix

resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi

模板语法

# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "my-chart.fullname" . }}
  labels:
    {{- include "my-chart.labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      {{- include "my-chart.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      labels:
        {{- include "my-chart.selectorLabels" . | nindent 8 }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          ports:
            - containerPort: {{ .Values.service.port }}

Chart 操作

模板渲染

# 渲染模板
helm template my-nginx bitnami/nginx -f custom-values.yaml

# 渲染并保存
helm template my-nginx bitnami/nginx > rendered.yaml

打包 Chart

# 打包 Chart
helm package my-chart

# 打包并上传到仓库
helm cm-push my-chart-0.1.0.tgz my-repo

更新和回滚

# 更新 release
helm upgrade my-nginx bitnami/nginx -f custom-values.yaml

# 回滚到上一版本
helm rollback my-nginx 1

# 查看历史版本
helm history my-nginx

卸载 release

helm uninstall my-nginx -n web

实践案例:部署 Spring Boot 应用

创建自定义 Chart

helm create spring-boot-app

修改 values.yaml

replicaCount: 3

image:
  repository: my-registry/spring-boot-app
  tag: "1.0.0"
  pullPolicy: Always

service:
  type: ClusterIP
  port: 8080

ingress:
  enabled: true
  className: nginx
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  hosts:
    - host: api.example.com
      paths:
        - path: /
          pathType: Prefix

resources:
  limits:
    cpu: "500m"
    memory: "512Mi"
  requests:
    cpu: "250m"
    memory: "256Mi"

部署应用

# 安装
helm install my-app ./spring-boot-app -n production

# 更新
helm upgrade my-app ./spring-boot-app -n production --set image.tag=1.1.0

# 回滚
helm rollback my-app 1 -n production

Chart 仓库管理

# 启动本地仓库服务
helm serve

# 上传 Chart 到 Harbor
helm push my-chart-0.1.0.tgz oci://harbor.example.com/chartrepo/my-project

总结

Helm 通过 Chart 机制极大简化了 Kubernetes 应用的部署和管理。掌握 Helm 的使用可以提高部署效率,实现应用的版本管理和回滚。