k8s 包管理器 Helm
Posted 笨小孩@GF 知行合一
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s 包管理器 Helm相关的知识,希望对你有一定的参考价值。
- Helm 介绍
- 官网:
https://v3.helm.sh/zh/docs/
https://helm.sh/
helm 官方的 chart 站点:
https://hub.kubeapps.com/- Helm 是 kubernetes 的包管理工具,相当于 linux 环境下的 yum/apg-get 命令。
- Helm 的首要目标一直是让“从零到 Kubernetes”变得轻松。无论是运维、开发人员、经验丰富的DevOps 工程师,还是刚刚入门的学生,Helm 的目标是让大家在两分钟内就可以在 Kubernetes 上安装应用程序。
- Helm 可以解决的问题:
运维人员写好资源文件模板,交给开发人员填写参数即可- Helm 中的一些概念:
(1)helm:命令行客户端工具,主要用于 Kubernetes 应用中的 chart 的创建、打包、发布和管理。
(2)Chart:helm 程序包,一系列用于描述 k8s 资源相关文件的集合,比方说我们部署 nginx,需要 deployment 的 yaml,需要 service 的 yaml,这两个清单文件就是一个 helm 程序包,在 k8s 中把这些 yaml 清单文件叫做 chart 图表。
vlues.yaml 文件为模板中的文件赋值,可以实现我们自定义安装,如果是 chart 开发者需要自定义模板,如果是 chart 使用者只需要修改 values.yaml 即可
repository:存放 chart 图表的仓库,提供部署 k8s 应用程序需要的那些 yaml 清单文件chart--->通过 values.yaml 这个文件赋值-->生成 release 实例
helm 是 go 语言开发
(3)Release:基于 Chart 的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个release,将在 k8s 中创建出真实运行的资源对象。
总结:
helm 把 kubernetes 资源打包到一个 chart 中,制作并完成各个 chart 和 chart 本身依赖关系并利用 chart 仓库实现对外分发,而 helm 还可通过 values.yaml 文件完成可配置的发布,如果 chart 版本更新了,helm 自动支持滚更更新机制,还可以一键回滚,但是不是适合在生产环境使用,除非具有定义自制 chart 的能力。- helm 属于 kubernetes 一个项目:
下载地址:
https://github.com/helm/helm/releases- Helm v3 版本变化
2019 年 11 月 13 日,Helm 团队发布 Helmv3 的第一个稳定版本。 该版本主要变化如下:
架构变化:
1、Helm 服务端 Tiller 被删除
2、Release 名称可以在不同命名空间重用
3、支持将 Chart 推送至 Docker 镜像仓库中
4、使用 JSONSchema 验证 chartvalues- 安装 Helm v3
K8s 版本支持的各个 helm 版本对照表:
https://helm.sh/zh/docs/topics/version_skew/- tar xf helm-v3.7.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/ 配置国内存放 chart 仓库的地址
阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts)
官方仓库(https://hub.kubeapps.com/charts/incubator)官方 chart 仓库,国内可能无法访问。
微软仓库(http://mirror.azure.cn/kubernetes/charts/)这个仓库推荐,基本上官网有的 chart这里都有,国内可能无法访问。
#添加阿里云的 chart 仓库
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
"aliyun" has been added to your repositories
#添加 bitnami 的 chart 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
#更新 chart 仓库
helm repo update
#查看配置的 chart 仓库有哪些
helm repo list #删除 chart 仓库地址
helm repo remove aliyun
"aliyun" has been removed from your repositories
Helm 基本使用
- 搜索和下载 Chart
#查看阿里云 chart 仓库中的 memcached
helm search repo aliyun |grep memcached
#查看 chart 信息
helm show chart aliyun/memcached #下载 chart 包到本地
helm pull aliyun/memcached
Chart.yaml: chart 的基本信息,包括版本名字之类
templates: 存放 k8s 的部署资源模板,通过渲染变量得到部署文件
values.yaml:存放全局变量,templates 下的文件可以调用
_helpers.tpl 存放能够复用的模板
NOTES.txt 为用户提供一个关于 chart 部署后使用说明的文件部署 chart
- helm 部署 memcached 服务
#修改 statefulset.yaml 文件
cd memcached
vim templates/statefulset.yaml- helm install memcached ./
测试 memecached 服务是否正常:
yum install nc -y
export POD_NAME=$(kubectl get pods --namespace default -l "app=memcached-memcached" -o jsonpath=".items[0].metadata.name")
kubectl port-forward $POD_NAME 11211
另外打开一个终端
echo -e 'set mykey 0 60 5\\r\\nhello\\r' | nc localhost 11211
release 相关操作
- 查看 release 发布状态
helm list #删除 release
helm delete memcached
release "memcached" uninstalled
#删除 release 会把 release 下对应的资源也删除,memecached 的 pod 也会被删除
自定义 Chart 模板
- 自定义一个 Chart
安装好 helm 之后可以开始自定义 chart,那么需要先创建出一个模板如下:
helm create myapp ./
├── charts #用于存放所依赖的子 chart
├── Chart.yaml # 描述这个 Chart 的相关信息、包括名字、描述信息、版本等
├── templates #模板目录,保留创建 k8s 的资源清单文件
│ ├── deployment.yaml #deployment 资源的 go 模板文件
│ ├── _helpers.tpl # # 模板助手文件,定义的值可在模板中使用
│ ├── hpa.yaml #水平 pod 自动扩缩容 go 模板文件
│ ├── ingress.yaml #七层代理 go 模板文件
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml #service 的 go 模板文件
│ └── tests
│ └── test-connection.yaml
└── values.yaml #模板的值文件,这些值会在安装时应用到 GO 模板生成部署文件- Chart.yaml 编写规则
vim Chart.yaml
解释说明:
Chart.yaml 文件主要用来描述对应 chart 的相关属性信息,其中 apiVersion 字段用于描述对应 chart 使用的 api 版本,默认是 v2 版本;
name 字段用于描述对应 chart 的名称;
description 字段用于描述对应 chart 的说明简介;
type 字段用户描述对应 chart 是应用程序还是库文件,应用程序类型的 chart,它可以运行为一个 release,但库类型的 chart 不能运行为 release,它只能作为依赖被 application 类型的 chart 所使用;
version 字段用于描述对应 chart 版本;
appVersion 字段用于描述对应 chart 内部程序的版本信息- go 模板文件渲染
cat templates/deployment.yaml
解释·:该部署清单模板文件,主要用 go 模板语言来写的,其中 include "myapp.fullname" . 就表示取 myapp 的全名;
.Values.image.repository 这段代码表示读取当前目录下的 values 文件中的 image.repository 字段的值;
.Values.image.tag | default .Chart.AppVersion 表示对于values 文件中 image.tag 的值或者读取 default.chart 文件中的 AppVersion 字段的值;
简单讲 go 模板就是应用对应 go 模板语法来定义关属性的的值;
一般都是从 values.yaml 文件中加载对应字段的值作为模板文件相关属性的值。
nindent 4:表示首行缩进 4 个字母
TRUNC(NUMBER)表示截断数字values.yaml 文件编写
- cat values.yaml
解释:比如我们要引用 values.yaml 文件中的 image 字段下的 tag 字段的值,我们可以在模板文件中写成 .Values.image.tag ;
如果在命令行使用--set 选项来应用我们可以写成 image.tag;
修改对应的值可以直接编辑对应 values.yaml 文件中对应字段的值,也可以直接使用--set 指定对应字段的对应值即可;
默认情况在命令行使用--set 选项给出的值,都会直接被替换,没有给定的值,默认还是使用 values.yaml 文件中给定的默认值;部署 release
- helm install myapp .
Helm 常用命令演示
- 检查 values 语法格式
helm lint /root/myapp/
- upgrade 升级 release
kubectl get svc
helm upgrade --set service.type="NodePort" myapp .回滚 release
- 查看历史版本
helm history myapp
#把 myapp 回滚到版本 1
helm rollback myapp 1- 打包 Chart
helm package /root/myapp/
以上是关于k8s 包管理器 Helm的主要内容,如果未能解决你的问题,请参考以下文章