| name | helm |
| description | Helm 包管理 |
| version | 1.0.0 |
| author | terminal-skills |
| tags | ["kubernetes","helm","k8s","package","chart"] |
Helm 包管理
概述
Helm Chart 开发、仓库管理、版本升级等技能。
基础命令
仓库管理
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add stable https://charts.helm.sh/stable
helm repo update
helm repo list
helm search repo nginx
helm search hub nginx
helm repo remove bitnami
安装与卸载
helm install my-release bitnami/nginx
helm install my-release bitnami/nginx -n namespace --create-namespace
helm install my-release bitnami/nginx -f values.yaml
helm install my-release bitnami/nginx --set replicaCount=3
helm install my-release bitnami/nginx --dry-run
helm template my-release bitnami/nginx
helm uninstall my-release
helm uninstall my-release -n namespace
查看与管理
helm list
helm list -A
helm list -n namespace
helm status my-release
helm history my-release
helm get values my-release
helm get values my-release --all
helm get manifest my-release
helm get notes my-release
升级与回滚
helm upgrade my-release bitnami/nginx
helm upgrade my-release bitnami/nginx -f values.yaml
helm upgrade my-release bitnami/nginx --set replicaCount=5
helm upgrade --install my-release bitnami/nginx
helm rollback my-release
helm rollback my-release 2
helm history my-release
Chart 开发
创建 Chart
helm create mychart
mychart/
├── Chart.yaml
├── values.yaml
├── charts/
├── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── _helpers.tpl
│ ├── NOTES.txt
│ └── tests/
└── .helmignore
Chart.yaml
apiVersion: v2
name: mychart
description: A Helm chart for my application
type: application
version: 0.1.0
appVersion: "1.0.0"
keywords:
- app
- web
maintainers:
- name: Your Name
email: your@email.com
dependencies:
- name: postgresql
version: "12.x.x"
repository: https://charts.bitnami.com/bitnami
condition: postgresql.enabled
values.yaml
replicaCount: 1
image:
repository: nginx
tag: "latest"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
ingress:
enabled: false
className: nginx
hosts:
- host: example.com
paths:
- path: /
pathType: Prefix
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
postgresql:
enabled: true
模板语法
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "mychart.fullname" . }}
labels:
{{- include "mychart.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "mychart.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "mychart.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: 80
{{- if .Values.resources }}
resources:
{{- toYaml .Values.resources | nindent 10 }}
{{- end }}
模板助手
{{- define "mychart.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- define "mychart.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- define "mychart.labels" -}}
helm.sh/chart: {{ include "mychart.chart" . }}
app.kubernetes.io/name: {{ include "mychart.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
Chart 打包与发布
helm lint mychart/
helm package mychart/
helm repo index . --url https://example.com/charts
helm push mychart-0.1.0.tgz oci://registry.example.com/charts
依赖管理
helm dependency update mychart/
helm dependency build mychart/
helm dependency list mychart/
常见场景
场景 1:多环境部署
helm upgrade --install my-release ./mychart \
-f values.yaml \
-f values-prod.yaml \
-n production
场景 2:条件渲染
{{- if .Values.ingress.enabled -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ include "mychart.fullname" . }}
spec:
{{- end }}
场景 3:循环渲染
{{- range .Values.ingress.hosts }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ .path }}
pathType: {{ .pathType }}
backend:
service:
name: {{ include "mychart.fullname" $ }}
port:
number: {{ $.Values.service.port }}
{{- end }}
{{- end }}
场景 4:调试模板
helm template my-release ./mychart -f values.yaml
helm template my-release ./mychart --show-only templates/deployment.yaml
helm install my-release ./mychart --dry-run --debug
故障排查
| 问题 | 排查方法 |
|---|
| 模板渲染错误 | helm template --debug |
| 安装失败 | helm status, kubectl describe |
| 升级失败 | helm history, helm rollback |
| 依赖问题 | helm dependency update |
helm get manifest my-release
helm get hooks my-release
helm upgrade my-release ./mychart --force