文章目录
helm 安装
#从官网下载最新版本的二进制安装包到本地:https://github.com/kubernetes/helm/releases
https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz
tar -zxvf helm-v2.13.1.tar.gz # 解压压缩包
# 把 helm 指令放到bin目录下
mv helm-v2.13.1/helm /usr/local/bin/helm
helm help # 验证
注意:先在 K8S 集群上每个节点安装 socat 软件(yum install -y socat )
helm初始化
由于 Helm 默认会去 storage.googleapis.com 拉取镜像,如果你当前执行的机器不能访问该域名的话可以使用以下命令来安装:
helm init \
--client-only \
--stable-repo-url https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts/
helm repo add incubator https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
helm repo update
# 创建服务端
helm init \
--service-account tiller \
--upgrade \
-i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.13.1 \
--stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 创建TLS认证服务端,参考地址:https://github.com/gjmzj/kubeasz/blob/master/docs/guide/helm.md
helm init \
--service-account tiller \
--upgrade \
-i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.13.1 \
--tiller-tls-cert /etc/kubernetes/ssl/tiller001.pem \
--tiller-tls-key /etc/kubernetes/ssl/tiller001-key.pem \
--tls-ca-cert /etc/kubernetes/ssl/ca.pem \
--tiller-namespace kube-system \
--stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
给tiller授权
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
# 使用 kubectl patch 更新 API 对象
$ kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
helm使用
# 先移除原先的仓库
helm repo remove stable
# 添加新的仓库地址,name为stable
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 更新仓库
helm repo update
#列出仓库
helm repo list
#下载依赖包到charts目录
helm dependency update
#自建helm源
helm serve
#更新helm源索引文件
helm repo index --url https://code.aliyun.com/liuqx_N/helm-page.git ./
#渲染chart包的部署yaml
helm install --dry-run --debug mychart
#查看在存储库中可用的所有 Helm charts
helm search
#更新charts列表
helm repo update
#安装服务
helm install stable/nginx-ingress --set controller.hostNetwork=true,rbac.create=true
# chart包方式
helm install -f grafana.yaml ./grafana
helm install ./grafana
# 查看使用helm已经安装的服务
helm list
# 查看helm部署的服务传入的参数
helm get values <release-name>
# 删除已经安装的服务
helm delete coredns
# 验证chart包配置
helm install --dry-run --debug chart-dir
# 指定helm部署chart的名字
helm install --name my-release monocular/monocular
# 查看升级的列表
helm history ops-prometheus
# 回滚chats
helm rollback <release-name> <revision>
chats包传参
- -f 指定values文件,指定一个替换值的YAML文件可以指定多次,最右边的文件将优先使用
- –set 命令行传参,–set值合并到–values更高的优先级中
- -set选项使用零个或多个名称/值对,最简单的用法:-set name = value.YAML体现是:
name:value
- 多个值由,字符分隔。因此-set a = b,c = d变成:
a: b
c: d
- 支持更复杂的表达式。例如,-set outer.inner = value变成这样:
outer:
inner: value
- 列表可以通过在{和}中包含值来表示。例如,-set name = {a,b,c}转化为:
name:
- a
- b
- c
- 可以使用数组索引语法访问列表项。例如,-set servers [0] .port = 80变成:
servers:
- port: 80
- 可以通过这种方式设置多个值。该行-set servers [0] .port = 80,servers [0] .host = example变成:
servers:
- port: 80
host: example
- 有时候需要在–set行中使用特殊字符可以使用反斜杠来转义字符。-set name = value1 \,value2会变成:
name: "value1,value2"
- 也可以转义点序列,这可能在图中使用toYaml函数解析注释,标签和节点选择器时派上用场。-set nodeSelector。“kubernetes.io/role”= master变为的语法:
nodeSelector:
kubernetes.io/role: master
helm 中chart包目录结构
examples/
Chart.yaml # Yaml文件,用于描述Chart的基本信息,包括名称版本等
LICENSE # [可选] 协议
README.md # [可选] 当前Chart的介绍
values.yaml # Chart的默认配置文件
requirements.yaml # [可选] 用于存放当前Chart依赖的其它Chart的说明文件
charts/ # [可选]: 该目录中放置当前Chart依赖的其它Chart
templates/ # [可选]: 部署文件模版目录,模版使用的值来自values.yaml和由Tiller提供的值
templates/NOTES.txt # [可选]: 放置Chart的使用指南
Chart.yaml 文件
name: [必须] Chart的名称
version: [必须] Chart的版本号,版本号必须符合 SemVer 2:http://semver.org/
description: [可选] Chart的简要描述
keywords:
- [可选] 关键字列表
home: [可选] 项目地址
sources:
- [可选] 当前Chart的下载地址列表
maintainers: # [可选]
- name: [必须] 名字
email: [可选] 邮箱
engine: gotpl # [可选] 模版引擎,默认值是gotpl
icon: [可选] 一个SVG或PNG格式的图片地址
requirements.yaml 和 charts目录
Chart支持两种方式表示依赖关系,可以使用requirements.yaml或者直接将依赖的Chart放置到charts目录中
dependencies:
- name: example
version: 1.2.3
repository: http://example.com/charts
- name: Chart名称
version: Chart版本
repository: 该Chart所在的仓库地址
templates 目录
templates目录存放的是kubernetes部署文件的模板
# db.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: deis-database
namespace: deis
labels:
heritage: deis
spec:
replicas: 1
selector:
app: deis-database
template:
metadata:
labels:
app: deis-database
spec:
serviceAccount: deis-database
containers:
- name: deis-database
image: {{.Values.imageRegistry}}/postgres:{{.Values.dockerTag}}
imagePullPolicy: {{.Values.pullPolicy}}
ports:
- containerPort: 5432
env:
- name: DATABASE_STORAGE
value: {{default "minio" .Values.storage}}
templates 语法-循环写法
#模板1:
values.yaml:
image:
repository: nginx
tag: 1.7.9
pullPolicy: IfNotPresent
envs:
- NET_NAME : "SZ_328"
- NET_PORT : "5678"
---
templates/deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
...
env:
{{- range .Values.envs }}
{{- range $key,$val := . }}
- name : {{ $key }}
value : {{ $val }}
{{- end}}
{{- end}}
---
#结果:
imagePullPolicy: IfNotPresent
env:
- name : NET_NAME
value : SZ_328
- name : NET_PORT
value : 5678
----------------------------------
#模板2:
values.yaml
image:
repository: nginx
tag: 1.7.9
pullPolicy: IfNotPresent
envs:
- name : NET_NAME
value : SZ_328
- name : NET_PORT
value : 5678
---
templates/deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
...
env:
{{- range .Values.envs }}
{{- with . }}
- name : {{ .name }}
value : {{ .value }}
{{- end}}
{{- end}}
---
#结果:
apiVersion: extensions/v1beta1
...
imagePullPolicy: IfNotPresent
env:
- name : NET_NAME
value : SZ_328
- name : NET_PORT
value : 5678
templates 语法-map写法
values.yaml
server:
##extraArgs: {}
extraArgs:
storage.local.checkpoint-dirty-series-limit: 5000
query.max-concurrency: 20
---
templates/deployment.yaml
- name: test
image: busybox:latest
args:
- --web.console.templates=/etc/prometheus/consoles
{{- range $key, $value := .Values.server.extraArgs }}
- --{{ $key }}={{ $value }}
{{- end }}
templates 语法-数组写法
values.yaml
server:
#extraHostPathMounts: []
extraHostPathMounts:
- name: certs-dir-1
mountPath: /etc/kubernetes/certs
hostPath: /etc/kubernetes/certs
readOnly: true
- name: certs-dir-2
mountPath: /etc-2/kubernetes/certs
hostPath: /etc-2/kubernetes/certs
readOnly: true
---
templates/deployment.yaml
volumeMounts:
{{- range .Values.server.extraHostPathMounts }}
- name: {{ .name }}
mountPath: {{ .mountPath }}
readOnly: {{ .readOnly }}
{{- end }}
volumes:
{{- range .Values.server.extraHostPathMounts }}
- name: {{ .name }}
hostPath:
path: {{ .hostPath }}
{{- end }}
templates 技巧
delete不删除资源
kind: Secret
metadata:
annotations:
"helm.sh/resource-policy": keep //helm delete的时候不删除该资源
[...]
Hooks
apiVersion: ...
kind: ....
metadata:
annotations:
"helm.sh/hook": "pre-install"
预安装pre-install:在模板渲染后,kubernetes 创建任何资源之前执行
安装后post-install:在所有 kubernetes 资源安装到集群后执行
预删除pre-delete:在从 kubernetes 删除任何资源之前执行删除请求
删除后post-delete:删除所有 release 的资源后执行
升级前pre-upgrade:在模板渲染后,但在任何资源升级之前执行
升级后post-upgrade:在所有资源升级后执行
预回滚pre-rollback:在模板渲染后,在任何资源回滚之前执行
回滚后post-rollback:在修改所有资源后执行回滚请求
crd-install:在运行其他检查之前添加 CRD 资源,只能用于 chart 中其他的资源清单定义的 CRD 资源。
删除资源的策略可供选择的注释值:
hook-succeeded:表示 Tiller 在 hook 成功执行后删除 hook 资源
hook-failed:表示如果 hook 在执行期间失败了,Tiller 应该删除 hook 资源
before-hook-creation:表示在删除新的 hook 之前应该删除以前的 hook
详解:https://blog.csdn.net/hxpjava1/article/details/86647706
helm执行的过程
默认情况是:
- 用户运行helm install foo
- chart 被加载到服务端 Tiller Server 中
- 经过一些验证,Tiller Server 渲染 foo 模板
- Tiller 将产生的资源加载到 kubernetes 中去
- Tiller 将 release 名称和其他数据返回给 Helm 客户端
- Helm 客户端退出
如果开发人员在 install 的生命周期中定义了两个 hook:pre-install和post-install:
- 用户运行helm install foo
- chart 被加载到服务端 Tiller Server 中
- 经过一些验证,Tiller Server 渲染 foo 模板
- Tiller 将 hook 资源加载到 kubernetes 中,准备执行pre-install hook
- Tiller 会根据权重对 hook 进行排序(默认分配权重0,权重相同的 hook 按升序排序)
- Tiller 然后加载最低权重的 hook
- Tiller 等待,直到 hook 准备就绪
- Tiller 将产生的资源加载到 kubernetes 中
- Tiller 执行post-install hook
- Tiller 等待,直到 hook 准备就绪
- Tiller 将 release 名称和其他数据返回给客户端
- Helm 客户端退出