Helm

本文档只有简单的使用入门,详细文档还需参考官方。

安装

helm和kubectl一样就是个go的二进制包,

  • 直接到官方仓库找二进制下载
  • 解压(tar -zxvf helm-v3.0.0-linux-amd64.tar.gz)
  • 在解压目录中找到helm程序,移动到需要的目录中(mv linux-amd64/helm /usr/local/bin/helm)

当然闲麻烦也能用包管理器安装:

mac:

brew install helm

windows:

choco install kubernetes-helm
# or
scoop install helm

apt包:

curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm

名称解释及概念

  • Chart 代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。你可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在Kubernetes 中的等价物。
  • Repository仓库。是用来存放和共享 charts 的地方。其实远端就是存储一个tar压缩包。
  • Release是运行在 Kubernetes 集群中的 chart 的实例。

常用包命令

# 添加远端仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
# 或者带有密码的私有仓库
helm repo add --username=xxx --password=xxxx myrepo https://xx.repo.cn/repo

# 搜索包
helm search repo bitnami/nginx
# 搜索并且列出可用versions
helm search repo bitnami/nginx -l

# 安装包
helm install <name> bitnami/nginx -n <namespace> [-f your-values.yaml]

创建包

使用前需要简单了解下k8s的资源

部署类型:

  • Deployment: 部署无状态服务
  • Statefullset: 部署有状态服务
  • Daemonset: 守护进程部署
  • CronJob: 定时任务

其它常用类型:

  • Service: 定义集群内部或者外部vip
  • ServiceAccount: 服务账号
  • HorizontalPodAutoscaler: 自动扩缩容配置
  • Configmap: 配置文件
  • Secret: 秘钥

下面来创建一个示例项目:

# 创建一个模板包,模板是部署一个简单的nginx服务。
helm create chartname

直接创建会发现已经填充了很多文件内容,下面是文件内容解释:

chartname/
  Chart.yaml          # 包含 Chart 基本信息(例如版本和名称)的 YAML 文件。
  LICENSE             # (可选)包含 Chart 许可证的纯文本文件。
  README.md           # (可选)应用说明和使用指南。
  values.yaml         # 该 Chart 的默认配置值。
  values.schema.json  # (可选)向 values.yaml 文件添加结构的 JSON Schema。
  charts/             # 一个目录,包含该 Chart 所依赖的任意 Chart。
  crds/               # 定制资源定义。
  templates/          # 模板的目录,若提供相应值便可以生成有效的 Kubernetes 配置文件。
  templates/NOTES.txt # (可选)包含使用说明的纯文本文件。

Chart.yaml 文件

您必须为 Chart 提供 chart.yaml 文件。下面是一个示例文件,每个字段都有说明。

apiVersion: (必需)Chart API 版本。 
name: (必需)Chart 名称。
version: (必需)版本,遵循 SemVer 2 标准。 
kubeVersion: (可选)兼容的 Kubernetes 版本,遵循 SemVer 2 标准。
description: (可选)对应用的一句话说明。
type: (可选)Chart 的类型。
keywords:
  - (可选)关于应用的关键字列表。
home: (可选)应用的 URL。
sources:
  - (可选)应用源代码的 URL 列表。
dependencies: (可选)Chart 必要条件的列表。
  - name: Chart 的名称,例如 nginx。
    version: Chart 的版本,例如 "1.2.3"。
    repository: 仓库 URL ("https://example.com/charts") 或别名 ("@repo-name")。
    condition: (可选)解析为布尔值的 YAML 路径,用于启用/禁用 Chart (例如 subchart1.enabled)。
    tags: (可选)
      - 用于将 Chart 分组,一同启用/禁用。
    import-values: (可选)
      - ImportValues 保存源值到待导入父键的映射。每一项可以是字符串或者一对子/父子列表项。
    alias: (可选)Chart 要使用的别名。当您要多次添加同一个 Chart 时,它会很有用。
maintainers: (可选)
  - name: (必需)维护者姓名。
    email: (可选)维护者电子邮件。
    url: (可选)维护者 URL。
icon: (可选)要用作图标的 SVG 或 PNG 图片的 URL。
appVersion: (可选)应用版本。不需要是 SemVer。
deprecated: (可选,布尔值)该 Chart 是否已被弃用。
annotations:
  example: (可选)按名称输入的注解列表。

Values.yaml 和模板

Helm Chart 模板采用 Go 模板语言编写并存储在 Chart 的 templates 文件夹。有两种方式可以为模板提供值:

在 Chart 中创建一个包含可供引用的默认值的 values.yaml 文件。 创建一个包含必要值的 YAML 文件,通过在命令行使用 helm install 命令来使用该文件。 下面是 templates 文件夹中模板的示例。

replicaCount: 1
image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: ""

template文件示例:

这里面讲引用上面value.yaml文件定义的变量。

...
spec:
  {{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.replicaCount }}
  {{- end }}
  ...
  selector:
    matchLabels:
      {{- include "xx.selectorLabels" . | nindent 6 }}
    ...
    spec:
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}

就是这么简单朴实,我们只要理解{{}}这里面的变量是哪来的就可以。

本地测试

# 生成最终模板并输出到终端
helm template ./chartname --debug
# 测试在集群中的变量是否正确,但是不安装到集群
helm install ./chartname --dry-run

根据报错修改自己的模板配置。

部署完后的操作

# 显示已经安装的包
helm list -n <namspace>
# 显示部署状态
helm status RELEASE_NAME -n <namspace>
# 卸载包
helm uninstall RELEASE_NAME -n <namspace>
# 获取当前不是使用的values变量
helm get values RELEASE_NAME -n <namspace>
# 升级安装
helm upgrade <name> bitnami/nginx -n <namespace> [-f your-values.yaml]