当前位置 : 首页 » 文章分类 :  开发  »  Helm

Helm

k8s 包管理工具 Helm 使用笔记

Helm 官网
https://helm.sh/

Helm Hub
https://hub.helm.sh/

helm / helm
https://github.com/helm/helm

helm / charts
https://github.com/helm/charts

Helm User Guide - Helm 用户指南
https://whmzsu.github.io/helm-doc-zh-cn/
https://github.com/whmzsu/helm-doc-zh-cn


Helm 简介

Helm 是一个 Kubernetes 应用的包管理工具,用来管理 chart —— 预先配置好的安装包资源,类似于 Ubuntu 中的 apt,CentOS 中的 yum,或者 Mac 中的 homebrew, nodejs 中的 npm, Python 中的 pip.
2020 年 4 月 30 日,Helm 从 CNCF 中毕业。

Helm chart 用来封装 Kubernetes 原生应用程序的 YAML 文件,可以在你部署应用的时候自定义应用程序的一些 metadata, 便于应用程序的分发。

Helm 和 chart 的主要作用是:

  • 应用程序封装
  • 版本管理
  • 依赖检查
  • 便于应用程序分发

使用Helm管理kubernetes应用
https://jimmysong.io/kubernetes-handbook/practice/helm.html

42 Helm安装使用
https://www.qikqiak.com/k8s-book/docs/42.Helm%E5%AE%89%E8%A3%85.html

Helm 中的一些基本概念

Chart

Helm 软件包,采用 tar 压缩包格式。包括在 k8s 集群运行应用所需的所有资源,类似 yum 的 rpm 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件。

Repository

chart 包仓库,用于 chart 包分享,类似 Docker 的 repository.

Release

使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release.
chart 包在 k8s 集群中跑起来后就是一个 release 实例,同一个 chart 包可以在同一个集群上启动多个不同名的 release 实例。


Helm组成部分

Helm V2 及之前由客户端命令行工具 helm 和服务端 tiller 组成。

Helm客户端命令行工具

Helm Client 是用户命令行工具,其主要负责如下:

  • 本地 chart 开发
  • 仓库管理
  • 与 Tiller sever 交互
  • 发送预安装的 chart
  • 查询 release 信息
  • 要求升级或卸载已存在的 release

Helm服务端Tiller(Helm V2及之前)

Tiller Server 是一个部署在 Kubernetes 集群内部的 server,其与 Helm client, Kubernetes API server 进行交互。Tiller server 主要负责如下:

  • 监听来自 Helm client 的请求
  • 通过 chart 及其配置构建一次发布
  • 安装 chart 到Kubernetes集群,并跟踪随后的发布
  • 通过与Kubernetes交互升级或卸载 chart
  • 简单的说,client 管理 charts,而 server 管理发布 release

Helm V3开始不再需要Tiller组件

从 Helm V3 开始,去掉了部署在 k8s 集群中的 Tiller 组件,或者说相当于把 Tiller 组件从 k8s 集群中移到了 helm 客户端命令行工具中
所以,整个 Helm V3 的安装就只有客户端命令行工具,不再需要在 k8s 集群中安装 tiller 了,简单很多

Tillerless Helm v2
https://rimusz.net/tillerless-helm

Helm V2 到 v3的变更

移除了 Tiller 组件,Helm 的权限通过 kubeconfig 进行配置
改进了upgrade升级策略;
Helm2 中release的默认被安装到了Tiller所在的namespace,在Helm3中默认是Context中指定的名称空间;
Helm2 将数据信息存储在了Configmap上,Helm3中存储在了Secret上;
如果指定安装到新的namespace上,Helm3默认自动创建这个不存在的namespace;
local or stable repositories默认已经被移除;

详见下面的官方文档:
helm v2 到 helm v3 变更说明
https://helm.sh/docs/faq/#changes-since-helm-2


安装Helm v3.3.3

注意:
1、Helm V2 及之前,需要分别安装客户端命令行工具 helm 和服务端组件 tiller
2、Helm V3 及之后,只需安装一个客户端命令行工具 helm,不再需要在 k8s 集群中安装 tiller 了

安装Helm客户端命令行工具

从 Helm release 页面下载最新版 helm, 我这里是 Helm v3.3.3 Linux amd64,解压后将可执行文件拷贝到 /usr/local/bin 即可。
https://github.com/helm/helm/releases

$ wget https://get.helm.sh/helm-v3.3.3-linux-amd64.tar.gz
$ tar -xzvf helm-v3.3.3-linux-amd64.tar.gz
$ sudo mv linux-amd64/helm /usr/local/bin/
$ helm version
version.BuildInfo{Version:"v3.3.3", GitCommit:"55e3ca022e40fe200fbc855938995f40b2a68ce0", GitTreeState:"clean", GoVersion:"go1.14.9"}

Intel/M1 Mac brew 安装 Helm

brew install helm 直接 brew 安装 helm 即可。

Intel Mac 安装目录 /usr/local/Cellar/helm/3.2.4_1
M1 Mac 安装目录 /opt/homebrew/Cellar/helm/3.8.0

Installing Helm
https://helm.sh/docs/intro/install/


安装Helm服务端tiller(Helm V2及之前)

注意:Helm V3 及之后,只需安装一个客户端命令行工具 helm,不再需要在 k8s 集群中安装 tiller 了

要安装 Helm 的服务端程序 tiller, 需要使用到 kubectl 工具,所以先确保 kubectl 工具能够正常的访问 k8s 集群的 apiserver。

1、给 tiller 创建账号并授权
从 Kubernetes 1.6 版本开始,API Server 启用了 RBAC 访问控制。
由于 Helm 的服务端 tiller 负责管理 k8s 集群资源,需要管理权限,而目前的 Tiller 部署时默认没有定义授权的 ServiceAccount,这会导致访问 API Server 时被拒绝。
因此,我们需要向安装在集群 kube-system 命令空间中的 tiller 组件添加必要的权限。

需要两步操作:
1、创建名称为 tiller 的 Service Account
2、给这个 Service Account 绑定角色
可以分别通过 kubectl 命令来操作,也可以写入一个 yaml 配置文件然后 kubectl apply 应用此配置文件。

我这里使用配置文件的形式
创建 helm-rbac.yaml 配置文件

apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system

kubectl apply -f helm-rbac.yaml 根据配置文件创建资源,这里使用 kubectl applykubectl create 都可以,apply 中发现资源不存在也会 create。

$ kubectl apply -f helm-rbac.yaml
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created

2、helm init部署tiller
执行 helm init --service-account tiller --skip-refresh 来部署 tiller
由于 Helm 默认会去 kubernetes-charts.storage.googleapis.com 拉取镜像,如果你当前执行的机器不能访问该域名的话可以使用国内镜像代替。
Helm 服务端正常安装完成后,Tiller 默认被部署在 kubernetes 集群的 kube-system 命名空间下。

5分钟教你在kubernetes集群上安装Helm,并部署应用
https://juejin.im/post/6844904087234805767


Helm Chart 结构

Charts
https://helm.sh/docs/topics/charts/

例如创建名为 matt 的 chart helm create matt,自动生成的文件结构如下:

matt
├── Chart.yaml
├── charts
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

templates/ 目录下是模板文件,当Helm需要生成chart的时,会渲染该目录下的模板文件,将渲染结果发送给kubernetes。Helm template使用go template语法编写
values.yaml 文件保存模板的默认值,用户可以在helm install 或者 helm upgrade可以指定新的值来覆盖默认值。
Chart.yaml 文件保存chart的基本描述信息,这些描述信息也可以在模板中被引用。
_helper.tpl 用于保存一些可以在该chart中复用的模板。


Chart 模板

Chart Template Guide
https://helm.sh/docs/chart_template_guide/getting_started/

Helm template快速入门
https://juejin.cn/post/6844904199818313735

安装 chart 时 templates/ 目录中的模板文件都会被 Helm 渲染后发送给 k8s,大致流程是用 values.yml 中的值填充模板中的变量,再经过模板函数、管道等处理后,生成 k8s 对象,通过 api 创建到 k8s 集群中。

将一个普通 yaml 文件放入 templates/ 目录中也完全没问题,他会被原样发送给 k8s

下面是一个最简单的 ConfigMap 模板

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"

Helm template使用 go template 语法编写,go template 的模板指令由 {{ }} 包裹,例如 {{ .Release.Name }},其中的值是由 . 分割的各个命名空间的元素,最左边的 . 表示当前作用域下最顶层的命名空间。Release 对象是 Helm 的内置对象之一。


Helm 内置对象

Built-in Objects
https://helm.sh/docs/chart_template_guide/builtin_objects/

内置对象可直接通过顶级命名空间 . 引用,例如 .Release.Name

Release

Release 对象描述 release 本身
Release.Name release名称
Release.Namespace 发布到的命名空间(k8s namespace)
Release.IsUpgrade 如果当前操作是upgrade或rollback,则设为true
Release.IsInstall 如果当前操作是install,则为true
Release.Revision 当前release版本,从1开始,每次upgrade或rollback递增。
Release.Service 总是”Helm”

Values

Values 对象代表从 values.yaml 中传给模板的值,或者安装时通过 -set, -f 指定的值

Chart

Chart 对象表示 Chart.yaml 中的值,例如 {{ .Chart.Name }} 是 chart 的名字,{{ .Chart.Version }} 是 chart 的版本。

Files

Files 表示 chart 中的非特殊文件,提供访问 chart 中文件的方法,但不能访问模板文件。
Files.Get 获取指定文件名称的文件内容,例如 .Files.Get config.ini
Files.GetBytes 返回文件的二进制数组,读二进制文件时使用(例如图片)。
Files.Glob 返回符合给定shell glob pattern的文件数组,例: {{ .Files.Glob "*.yaml" }}
Files.Lines 按行遍历读取文件
Files.AsSecrets 返回文件内容的 Base64 编码
Files.AsConfig 返回文件内容对应的YAML map

Capabilities

Capabilities 对象提供 k8s 集群相关信息
Capabilities.APIVersions 集群支持的api version列表。
Capabilities.APIVersions.Has $version 指出当前k8s集群是否支持某个API版本 (例如 batch/v1 ) 或资源 (例如 apps/v1/Deployment )
Capabilities.KubeVersion / Capabilities.KubeVersion.Version Kubernetes版本号
Capabilities.KubeVersion.Major Kubernetes主版本号
Capabilities.KubeVersion.Minor Kubernetes子版本号

Capabilities.HelmVersion Helm 版本号信息,结果和 helm version 命令的输出相同
Capabilities.HelmVersion.Version 当前 Helm 版本号,例如 v3.2.4
Capabilities.HelmVersion.GitCommit Helm git 的 sha1,例如 0ad800ef43d3b826f31a5ad8dfbb4fe05d143688
Capabilities.HelmVersion.GitTreeState Helm git 树状态,例如 dirty
Capabilities.HelmVersion.GoVersion Go 编译器版本,例如 go1.14.3

Template

Template 对象表示当前模板的信息
Template.Name 模板的文件名,包括路径+文件名,例如 mychart/templates/mytemplate.yaml
Template.BasePath 模板文件所在的路径,例如 mychart/templates


Values文件

Values Files
https://helm.sh/docs/chart_template_guide/values_files/


模板函数与管道

下面的模板中,给 drink 和 food 注入 Values 中的字符串值时需要加引号,通过调用 quote 函数来实现。

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ quote .Values.favorite.drink }}
  food: {{ quote .Values.favorite.food }}

模板函数语法为 functionName arg1 arg2...,上面的 quote .Values.favorite.drink 调用了 quote 函数,传了1个参数。

Helm 模板中有 60 多个可用的函数,一些来自 go template 本身,多数来自 Sprig模板库

管道是 go template 提供的一个强大的功能,借鉴自 UNIX 中的管道操作 |,是一种高效的将一系列命令串接起来的工具
下面的例子中,将 drink 的 quote ARGUMENT 函数调用改为管道形式 .Values.favorite.drink | quote,相当于将参数 “发送” 给 quote 函数

管道左侧的值会作为管道右侧函数中的最后一个参数,例如 .Values.favorite.drink | repeat 5 等于 repeat 5 .Values.favorite.drink

管道可串接起来依次作用,例如 .Values.favorite.food | upper | quote

在 go template 中,管道是一种更常见的操作方式,比函数调用更常用


模板函数列表

Template Function List
https://helm.sh/docs/chart_template_guide/function_list/

repeat 函数

repeat count string 将给定的字符串重复 count 次,例如

.Values.favorite.drink | repeat 5 | quote

default 函数

default default_value given_value 如果 given_value 为空则使用 default_value,否则使用 given_value,例如:

drink: {{ .Values.favorite.drink | default "tea" | quote }}

indent 函数

indent count str 给 str 增加 count 个空格的缩进
例如,函数调用方式增加 2 个缩进:{{ indent 2 "mug:true" }}
管道方式增加 8 个缩进:{{ tpl .Values.affinity . | indent 8 }}

操作符函数

比较操作符 eq, ne, lt, gt
逻辑操作符 and, or


控制流程

Flow Control
https://helm.sh/docs/chart_template_guide/control_structures/

if/else 条件分支

if/else 条件块基本结构如下:

{{ if PIPELINE }}
  # Do something
{{ else if OTHER PIPELINE }}
  # Do something else
{{ else }}
  # Default case
{{ end }}

当 PIPELINE 值为以下内容,逻辑判定为false,否则为true

  • 布尔值false
  • 数字零
  • 空字符串
  • nil(空或null)
  • 空的集合(map, slice, tuple, dict, array)

下面是一个带条件控制的 ConfigMap,当 drink 为 coffee 时,增加一个 mug: “true” 字段

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | default "tea" | quote }}
  food: {{ .Values.favorite.food | upper | quote }}
  {{ if eq .Values.favorite.drink "coffee" }}mug: "true"{{ end }}

with 修改作用域

with 用于修改当前作用域。之前提过 . 表示当前作用域,所以 .Values 告诉模板在当前作用域下寻找 Values 对象。

语法:

{{ with PIPELINE }}
  # restricted scope
{{ end }}

使用 with 可以将当前作用域设定到指定的对象上。

假设有如下 values.yaml

favorite:
  drink: coffee
  food: pizza

修改 ConfigMap 为:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  {{- with .Values.favorite }}
  drink: {{ .drink | default "tea" | quote }}
  food: {{ .food | upper | quote }}
  {{- end }}

在 ConfigMap 中将 . 当前作用域修改为 .Values.favorite,之后就可以直接引用 .drink.food 变量了,不需再加 .Values.favorite 前缀。
注意在上面的 with 作用域内,无法再访问 .Release.Name,因为 Release 对象不在当前限定的作用域内。

如果想在限定的内部作用域内访问顶层对象,可以使用 $ 符号,**$ 代表根作用域,且在模板开始执行后不会变化**,例如:

  {{- with .Values.favorite }}
  drink: {{ .drink | default "tea" | quote }}
  food: {{ .food | upper | quote }}
  release: {{ $.Release.Name }}
  {{- end }}

range 循环

range 用于循环遍历数组或是map。

例如 values.yaml 文件中有如下信息:

favorite:
  drink: coffee
  food: pizza
pizzaToppings:
  - mushrooms
  - cheese
  - peppers
  - onions

可通过 {{ range }}...{{ end}} 循环语句循环 pizzaToppings 数组:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  toppings: |-
    {{- range .Values.pizzaToppings }}
    - {{ . | title | quote }}
    {{- end }}

结果为:

apiVersion: v1
kind: ConfigMap
metadata:
  name: edgy-dragonfly-configmap
data:
  toppings: |-
    - "Mushrooms"
    - "Cheese"
    - "Peppers"
    - "Onions"    

range 循环内部作用域内 . 代表每次循环的元素值

在枚举常量数组上做 range 迭代

  sizes: |-
    {{- range tuple "small" "medium" "large" }}
    - {{ . }}
    {{- end }}    

结果为:

  sizes: |-
    - small
    - medium
    - large    

range 循环内还可以通过变量同时访问索引和值(index/value, 或 key/value)
例如

  toppings: |-
    {{- range $index, $topping := .Values.pizzaToppings }}
      {{ $index }}: {{ $topping }}
    {{- end }}    

range 作用域内,$index 是从0开始的索引,$topping 是对应的值,结果是:

  toppings: |-
      0: mushrooms
      1: cheese
      2: peppers
      3: onions     

当用 range 遍历 map 对象时,第一个变量获取的就是 key,第二个变量是 value
例如

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  {{- range $key, $val := .Values.favorite }}
  {{ $key }}: {{ $val | quote }}
  {{- end }}

结果是:

apiVersion: v1
kind: ConfigMap
metadata:
  name: eager-rabbit-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "pizza"

空白处理

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | default "tea" | quote }}
  food: {{ .Values.favorite.food | upper | quote }}
  {{ if eq .Values.favorite.drink "coffee" }}
  mug: "true"
  {{ end }}

渲染后的结果是:

apiVersion: v1
kind: ConfigMap
metadata:
  name: telling-chimp-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"

  mug: "true"

注意到 mug 前有个空行,这是因为 在模板渲染的过程中删除了中的内容,但保留了剩余的空白

yaml 中空白是有含义的,所以空白处理相当重要

go template 模板语法中有专门处理空白的双花括号语法:

  • 中横线在左边 {{- xxx}} 表示消除左边的空白
  • 中横线在右边 {{xxx -}} 表示消除右边的空白

注意:
1、换行也是空白
2、中横线 - 和剩余内容之间必须有空格,如果写成 {{-3 }} 表示输出 -3

将上面的模板改为:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | default "tea" | quote }}
  food: {{ .Values.favorite.food | upper | quote }}
  {{- if eq .Values.favorite.drink "coffee" }}
  mug: "true"
  {{- end }}

渲染的结果就没有多余的空行的,实际被删除的空白有四处:food行末的换行符、mug行末的换行符、mug前一行、mug后一行。

如果想增加空白,可以使用 indent 函数,例如 {{ tpl .Values.affinity . | indent 8 }}


变量

Helm 模板中,变量是对另一个对象的引用。
变量定义格式为 $name,变量赋值操作符是 :=

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  {{- $relname := .Release.Name -}}
  {{- with .Values.favorite }}
  drink: {{ .drink | default "tea" | quote }}
  food: {{ .food | upper | quote }}
  release: {{ $relname }}
  {{- end }}

上面的模板中,在 with 修改作用域前通过 $relname := .Release.Name 定义了变量 $relname,在 with 作用域内可用它访问 .Release.Name

变量定义的位置决定了变量的作用域,比如上面的 $relname 是全局作用域,range 语句中 {{- range $key, $val := .Values.favorite }}$key$val 作用域只在 range 块中
特殊变量 $ 总是全局的,总是代表根作用域


Helm命令

Helm 命令列表
https://helm.sh/docs/helm/

常用的几个命令在下面文档中有结合实例的介绍
Using Helm
https://helm.sh/docs/intro/using_helm/


helm repo add 添加仓库到本地

https://helm.sh/docs/helm/helm_repo_add/
添加仓库到本地,类似 yum 往本地添加 yum 源。

例如添加 https://kubernetes.github.io/ingress-nginx 仓库并命名为 ingress-nginx
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx


helm repo list 查看本地helm仓库

https://helm.sh/docs/helm/helm_repo_list/
查看已添加到本地的 helm 仓库
例如

$ helm repo list
NAME             URL
ingress-nginx    https://kubernetes.github.io/ingress-nginx
k8s-dashboard    https://kubernetes.github.io/dashboard

# helm repo list
NAME    URL
arp     https://iregistry.arp-int.com/chartrepo/arp

helm repo update 更新本地仓库

https://helm.sh/docs/helm/helm_repo_update/
更新本地 repo 仓库
比如之前 add 了这个repo仓库,后来又有新版本的镜像推到这个远程仓库,如果不先 helm repo update 的话本地仓库是找不到这个新镜像版本的。
报错如下

# helm fetch --version 0.1.0-155837913 myrepo/myapp
Error: chart "myapp" matching 0.1.0-155837913 not found in ist index. (try 'helm repo update'): no chart version found for myapp-0.1.0-155837913

https://helm.sh/docs/helm/helm_search/

helm search hub 从HelmHub搜索chart包

helm search hubHelmHub 在线搜索公开的 chart 包

$ helm search hub kubernetes-dashboard
URL                                                   CHART VERSION    APP VERSION    DESCRIPTION
https://hub.helm.sh/charts/banzaicloud-stable/k...    0.9.2            1.10.0         General-purpose web UI for Kubernetes clusters
https://hub.helm.sh/charts/k8s-dashboard/kubern...    2.7.1            2.0.4          General-purpose web UI for Kubernetes clusters

helm search repo 从本地repo搜索chart包

helm search repo 从本地的 repo 仓库中搜索 chart 包,这些仓库是通过 helm repo add 命令添加的。和 yum 很像,先本地安装 repo, 再从 repo 中安装具体的应用。

$ helm search repo kubernetes-dashboard
NAME                                  CHART VERSION    APP VERSION    DESCRIPTION
k8s-dashboard/kubernetes-dashboard    2.7.1            2.0.4          General-purpose web UI for Kubernetes clusters

helm pull 下载chart包

https://helm.sh/docs/helm/helm_pull/
下载 chart 包并解压(可选)

--version string 下载指定版本的 chart, 如果不带此参数则会下载最新版本的 chart
--untar 设为 true 时下载 chart 包后会自动解压,会在当前目录下创建同名目录后解压到此目录中。

例如 helm pull k8s-dashboard/kubernetes-dashboard --untar=true 会在当前目录下创建 kubernetes-dashboard 目录并解压到此目录中。

解压chart包

也可以手动解压 chart 包
tar -xzvf myapp.tgz


helm install 安装chart包

https://helm.sh/docs/helm/helm_install/

helm install [NAME] [CHART] [flags]
安装 chart 包,chart 包安装后会成为一个 release 跑在 k8s 集群中。
helm install 命令的参数必须指定一个 chart 包,可以是压缩后的 chart 包路径,也可以是解压后的 chart 目录,或者一个 URL。
例如 helm install happy-panda stable/mariadb 安装 mariadb 到 k8s 集群,安装后的 release 名是 happy-panda
如果只是检查生成的 release 清单,并不想真的 install, 可以使用 --dry-run 参数进行模拟 install

-n namespace 指定namespace安装

helm 命令不加 -n 参数指定命名空间时,默认安装到 default 命名空间。

可使用 -n 指定命名空间安装,例如安装 myapp 到 k8s my-namespace 命名空间
helm install myapp myapp.tgz -n my-namespace

helm install 命令可以从多种源指定 chart 包

1、指定 chart repository 中的 chart
helm install mymaria example/mariadb

2、一个本地 chart 压缩包
helm install mynginx ./nginx-1.2.3.tgz

3、一个解压后的 chart 目录
helm install mynginx ./nginx
假如当前就在解压后的 chart 目录中,则
helm install mynginx .

4、一个完整 chart 包 URL
helm install mynginx https://example.com/charts/nginx-1.2.3.tgz

5、指定 repo 地址和 chart
helm install --repo https://example.com/charts/ mynginx nginx

覆盖 chart 中值的几种方法

1、使用 -f, --values strings 传入一个 value yaml 文件或 URL 来指定值。
例如 helm install -f myvalues.yaml myredis ./redis

-f, --values 可以指定多次,越往右优先级越高,优先级高的覆盖优先级低的。
例如,如果 myvalues.yaml 和 override.yaml 中都有 Test 这个 key, 则 override.yaml 中的会覆盖 myvalues.yaml 中的
helm install -f myvalues.yaml -f override.yaml myredis ./redis

2、使用 --set stringArray 直接在命令行写配置参数,也可以使用逗号分割值比如 key1=val1,key2=val2.
例如 helm install --set name=prod myredis ./redis

--set 可以指定多次,越往右优先级越高,优先级高的覆盖优先级低的。
例如下面的命令中 foo 的值被设置了两次,靠右的 newbar 优先级更高,覆盖前面的 bar
helm install --set foo=bar --set foo=newbar myredis ./redis

3、使用 --set-string stringArray 会强制使用 String 值,可指定多次,也可以使用逗号分割值比如 key1=val1,key2=val2.
例如 helm install --set-string long_int=1234567890 myredis ./redis

4、使用 --set-file stringArray 读取 value 配置文件。可指定多次,也可以使用逗号分割值比如 key1=path1,key2=path2.
例如 helm install --set-file my_script=dothings.sh myredis ./redis

helm installl 安装到指定命名空间

使用从父命令继承的参数 -n 指定命名空间
-n, --namespace string
例如 helm installl -n new-namespace myapp .

helm安装/更新服务流程

1、更新chart仓库(否则新打的chart包拉取不到)
helm repo update

2、拉取指定版本chart
进入 /charts 目录
helm fetch –version 0.1.0-151201843 myrepo/myapp
tar -xzvf myapp-0.1.0-151201843.tgz
解压后得到 myapp 目录(如果之前已有 myapp 目录,可以先删除,也可以不删除,会覆盖已有的 values.yaml 等文件)

3、删除当前的 myapp 服务
helm 2.x 中 helm del myapp --purge
helm 3.x 中 helm uninstaall myapp
如果不知道已安装的服务具体叫啥,先 helm list 列出所有安装的chart,方便查看
最后的 –purge 表示释放这个release名称,方便后续再次创建

4、安装 myapp (当前在 /charts/myapp/ 目录)
helm 2.x 中 helm install --name myapp --debug . 或不带debug helm install --name myapp .
helm 3.x 中 helm install myapp .


helm list 列出release

https://helm.sh/docs/helm/helm_list/

helm list -n namespace 指定 namespace 查询,默认查询 default 命名空间的 release

# helm list
NAME             REVISION    UPDATED                     STATUS      CHART                                         APP VERSION    NAMESPACE
ass-server           1      Tue Oct 13 22:05:11 2020    DEPLOYED    ass-0.1.0-125840831-1004                      1.0            default
consul-alone         1      Mon Oct 12 10:59:16 2020    DEPLOYED    consul-3.8.1                                  1.5.3          default
gpu-expoter          1      Mon Oct 12 14:07:30 2020    DEPLOYED    gpu-exporter-0.0.4-10638767-0609162318        0.1            default
gw                   1      Mon Oct 12 19:28:15 2020    DEPLOYED    gwadmin-0.1.0-120548028-1599026685732         1.0            default
harbor-postgresql    1      Sat Oct 10 18:14:29 2020    DEPLOYED    postgresql-2.4.0                              10.6.0         default
harbor-redis         1      Sat Oct 10 18:14:54 2020    DEPLOYED    redis-4.2.10                                  4.0.11         default
kafka-alone          1      Mon Oct 12 11:13:48 2020    DEPLOYED    kafka-0.18.0                                  5.0.1          default
mongodb-alone        1      Mon Oct 12 11:04:12 2020    DEPLOYED    mongodb-3.8.1                                 1.5.3          default
mysql-alone          1      Mon Oct 12 11:03:54 2020    DEPLOYED    mysql-1.3.1                                   5.7.14         default
prometheus-operator  1      Sat Oct 10 18:14:24 2020    DEPLOYED    prometheus-operator-0.1.20                    0.25.0         default
public-storage       1      Mon Oct 12 14:16:29 2020    DEPLOYED    public-storage-0.1.0-92157065-1585270527995   1.0            default
redis-alone          1      Mon Oct 12 11:04:25 2020    DEPLOYED    redis-3.7.11                                  5.0.5          default
zookeeper            1      Mon Oct 12 11:10:06 2020    DEPLOYED    zookeeper-2.0.1                               3.5.5          default

helm uninstall(helm 3.x)

https://helm.sh/docs/helm/helm_uninstall/
卸载 release
如果不知道已安装的服务叫啥,先 helm list 列出所有安装的 chart 看 NAME

注意:如果想卸载其他命名空间的 release,必须 -n 指定命名空间,比如 helm uninstall -n my-namespace my-app

helm del(helm 2.x)

helm 2.x 中删除 release 的命令是 helm del, 3.x 中改成 helm uninstall
helm del myapp --purge 最后的 --purge 表示释放这个release名称,方便后续再次创建
如果不知道已安装的服务叫啥,先 helm list 列出所有安装的 chart 看 NAME


helm create

https://helm.sh/docs/helm/helm_create/
helm create NAME [flags] 创建 chart


helm version

查看 helm 版本
2.x 包含 client 和 server

# helm version
Client: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}

3.x 只需要一个服务

# helm version
version.BuildInfo{Version:"v3.0.2", GitCommit:"19e47ee3283ae98139d98460de796c1be1e3975f", GitTreeState:"clean", GoVersion:"go1.13.5"}

上一篇 Expect脚本

下一篇 Java-Net

阅读
评论
6.3k
阅读预计28分钟
创建日期 2020-09-20
修改日期 2022-08-26
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论