返回归档
🥁k8s

HELM

文章目录

some basic concepts

chart

  • one helm package
  • it containers all resources definitions necessary to run one application, tool, or service inside of a k8s cluster

repository

  • one place where charts can be collected and shared

release

  • one instance of a chart running in k8s clutster

当我们理解这些概念,我们脑海中可以有这样的印象

  • 如果我们想要找charts,可以去chart的仓库,即repository
  • 当我们找到对应的charts后,我们去安装charts,即将charts中的资源部署到 k8s集群中,这样就产生了一个release

quickStart

# 安装helm
brew install helm

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

#从所有的本地repo中查询mysql关键字的charts
helm search repo mysql #查看带有mysql这个key words的charts
helm search bitnami | grep mysql #查看name中有mysql的charts

#从Artifacts Hub中搜索
helm search hub nginx-controller

#安装一个charts
helm repo update
helm install bitnami/mysql --generate-name

#查看helm状态
helm status

#查看release
helm list --all

#卸载charts
helm uninstall mysql-1612624192

#校验helm语法
helm lint

go template语法

简单讲讲 go的template语法,这对后续看helm的chart文件很有帮助

1. 基础语法理解

  • 你需要熟悉 Go Template 的基本语法,例如变量定义、管道、条件判断和循环等,这些是 Helm 模板中最常用的语法。例如:
  • 如何通过 {{ .Values.key }} 访问变量
  • 使用 {{ if }}, {{ range }}, {{ with }} 等控制结构来处理数据和逻辑

2. 管道操作

  • Helm 模板中管道 (|) 用得很多。管道可以将一个表达式的输出传递给下一个函数,这是 Helm 模板中的重要特性。常见用法包括:
  • 使用 default 设置默认值:{{ .Values.image.repository | default “nginx” }}
  • 使用 quote、upper 等内置函数进行字符串处理。

3. 模板嵌套与文件分割

  • 在 Helm 中通常会将模板分散到多个文件,因此了解 template 和 define 的用法很重要。Helm 使用 include 和 required 来嵌套调用模板和判断关键值
{{ include "mychart.labels" . }}

4. 错误处理

  • 了解 required 函数,这在 Helm 中用于确保必需的值被传递进来:
{{ required "A valid .Values.service.name is required" .Values.service.name }}

5. 理解 Helm 特有的扩展

  • 除了 Go Template 的基础语法,Helm 还增加了一些自己定义的模板函数,例如 lookup、tpl 等。这些函数的使用和 Helm 的上下文机制有关,理解这些函数的用途会对编写 Helm 模板有帮助。

深入讲解

customize your Chart before installing

若想在update、install时自定义,可以有以下方式配置(优先级从低到高

  1. Chart自带的value.yaml

    helm install my-release  ./my-chart-0.1.0.tgz
  2. 使用-f 指定的自定义values.yaml 文件,按顺序加载,在后面的文件优先级更高

    helm install my-release ./my-chart -f values1.yaml -f values2.yaml
  3. 命令行—set的参数

    helm install my-release ./my-chart --set service.type=NodePort
  4. 命令行—set-file的参数。当你想倒入一个大文本文件作为配置项时,比—set和values.yaml优先级更高

    helm install my-release ./my-chart --set-file config.json=path/to/config.json

—set的使用

#简答的key-value
--set name=value
#多个简单的key-value
--set a=b,c=d
#嵌套类型
--set outer.innner=value
#数组
--set name={a,b,c}
#数组中的某个字段
--set servers[0].port=80
#数组中的多个字段
--set servers[0].port=80,servers[0].host=example
#转义字符
--set name="values1\,value2"
--set nodeselector."kubernetes\.io/role"=master

Crete your own Charts

#创建一个Chart
  demo helm create my-chart
Creating my-chart
#一个chart的目录结构
  my-chart tree
.
├── Chart.yaml
├── charts 
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

4 directories, 10 files
  • NOTES.txt是chart的帮助文本,helm install的提示信息就是来自这里
  • _helper.tpl描述了chart可以复用的模版对象
  • values.yaml 将记录的值传给chart,进行模版渲染

可以用—debug—dry-run 观察模版是如何渲染的

helm install puppy ./chart-demo --dry-run --debug 

helm install puppy ./chart-demo --dry-run --debug --set favorit.food='noodles' --set favorit.drink='water'
具体内容
  helm helm install --debug puppy ./chart-demo --dry-run
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /Users/Zhuanz/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /Users/Zhuanz/.kube/config
install.go:224: 2024-11-02 13:05:37.9171 +0800 CST m=+0.067566126 [debug] Original chart version: ""
install.go:241: 2024-11-02 13:05:37.917401 +0800 CST m=+0.067867876 [debug] CHART PATH: /Users/Zhuanz/go/helm/chart-demo

NAME: puppy
LAST DEPLOYED: Sat Nov  2 13:05:37 2024
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}

COMPUTED VALUES:
affinity: {}
autoscaling:
  enabled: false
  maxReplicas: 100
  minReplicas: 1
  targetCPUUtilizationPercentage: 80
favorite:
  drink: water
  food: noodles
fullnameOverride: ""
image:
  pullPolicy: IfNotPresent
  repository: nginx
  tag: ""
imagePullSecrets: []
ingress:
  annotations: {}
  className: ""
  enabled: false
  hosts:
  - host: chart-example.local
    paths:
    - path: /
      pathType: ImplementationSpecific
  tls: []
livenessProbe:
  httpGet:
    path: /
    port: http
nameOverride: ""
nodeSelector: {}
podAnnotations: {}
podLabels: {}
podSecurityContext: {}
readinessProbe:
  httpGet:
    path: /
    port: http
replicaCount: 1
resources: {}
securityContext: {}
service:
  port: 80
  type: ClusterIP
serviceAccount:
  annotations: {}
  automount: true
  create: true
  name: ""
tolerations: []
volumeMounts: []
volumes: []

HOOKS:
MANIFEST:
---
# Source: chart-demo/templates/config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: cm-demo
data:
  myvalue: puppy-configmap
  food: noodles
  drink: water
#打包helm Chart,结果为一个tgz压缩包
  charts helm package my-chart
Successfully packaged chart and saved it to: /Users/Zhuanz/go/charts/my-chart-0.1.0.tgz
#安装Chart
  charts helm install my-charts ./my-chart-0.1.0.tgz

NAME: my-charts
LAST DEPLOYED: Mon Oct 28 21:59:19 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=my-chart,app.kubernetes.io/instance=my-charts" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT

#根据上面的提示,我们设置一下环境变量
  charts kubectl --namespace default port-forward my-charts-69dc4c4678-nvbtf 8080:$CONTAINER_PORT
  charts export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=my-chart,app.kubernetes.io/instance=my-charts" -o jsonpath="{.items[0].metadata.name}")
  charts export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  charts kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
Handling connection for 8080
Handling connection for 8080

访问

image

版本迭代控制

chart的每次安装或升级都会创建新的release版本,可以看chart.yaml 的描述,看到就的版本信息。

回滚到指定版本

#查看历史版本
helm history myapp
#回滚到指定版本 helm rollback [release] [version]
helm rollback myapp 1 #回滚到版本1

版本历史数据保留

#配置最大历史的版本数
helm install myapp ./mychart --history-max 10
#清理历史版本
helm delete myapp --purge

备份恢复

#导出当前配置
helm get values myapp >myapp-values.yaml
#使用备份配置进行重新部署
helm upgrade myapp ./mychart -f myapp-values.yaml

helm的资源构建顺序

具体顺序 - Namespace - NetworkPolicy - ResourceQuota - LimitRange - PodSecurityPolicy - PodDisruptionBudget - ServiceAccount - Secret - SecretList - ConfigMap - StorageClass - PersistentVolume - PersistentVolumeClaim - CustomResourceDefinition - ClusterRole - ClusterRoleList - ClusterRoleBinding - ClusterRoleBindingList - Role - RoleList - RoleBinding - RoleBindingList - Service - DaemonSet - Pod - ReplicationController - ReplicaSet - Deployment - HorizontalPodAutoscaler - StatefulSet - Job - CronJob - Ingress - APIService

ref

  • some tricks to use helm

bookmark

  • quick-start helm

bookmark

  • detailed Explanation in chart

bookmark