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的主要内容,如果未能解决你的问题,请参考以下文章

Helm 使用介绍(K8s 包管理器)

k8s 包管理器 Helm

k8s 包管理器 Helm

k8s 包管理器 Helm

Helm介绍(基本使用架构简介Hook机制)

k8s/Kubernetes常用组件Helm的部署