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 apply
和 kubectl 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,则设为trueRelease.IsInstall
如果当前操作是install,则为trueRelease.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.4Capabilities.HelmVersion.GitCommit
Helm git 的 sha1,例如 0ad800ef43d3b826f31a5ad8dfbb4fe05d143688Capabilities.HelmVersion.GitTreeState
Helm git 树状态,例如 dirtyCapabilities.HelmVersion.GoVersion
Go 编译器版本,例如 go1.14.3
Template
Template
对象表示当前模板的信息Template.Name
模板的文件名,包括路径+文件名,例如 mychart/templates/mytemplate.yamlTemplate.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-nginxhelm 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
helm search
https://helm.sh/docs/helm/helm_search/
helm search hub 从HelmHub搜索chart包
helm search hub
从 HelmHub 在线搜索公开的 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 中的 charthelm 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 包 URLhelm install mynginx https://example.com/charts/nginx-1.2.3.tgz
5、指定 repo 地址和 charthelm 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 优先级更高,覆盖前面的 barhelm 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
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: