• k8s-14_helm介绍以及使用


    k8s-14_helm介绍以及使用

    1.helm基础

    一、helm功能

    1. Helm就是Kubernetes的应用程序包管理器,类似于Linux系统之上的yum或apt-get等,可用于实现帮助用户查找、分享及使用Kubernetes应用程序。它的核心打包功能组件称为chart,可以帮助用户创建、安装及升级复杂应用。Helm将Kubernetes的资源(如Deployments、Services或ConfigMap等)打包到一个Charts中,制作并测试完成的各个Charts将保存到Charts仓库进行存储和分发。另外,Helm实现了可配置的发布,它支持应用配置的版本管理,简化了Kubernetes部署应用的版本控制、打包、发布、删除和更新等操作。
    2. Helm是一个基于Kubernetes的程序包(资源包)管理器,它将一个应用的相关资源组织成为Charts,并通过Charts管理程序包,其使用优势可简单总结为如下几个方面:
    • 管理复杂应用:Charts能够描述哪怕是最复杂的程序结构,其提供了可重复使用的应用安装的定义。
    • 易于升级:使用就地升级和自定义钩子来解决更新的难题。
    • 简单分享:Charts易于通过公共或私有服务完成版本化、分享及主机构建。
    • 回滚:可使用“helm rollback”命令轻松实现快速回滚。

    二、helm核心术语

    1. Helm将Kubernetes应用的相关配置组织为Charts,并通过它完成应用的常规管理操作。使用Charts管理应用的流程包括:
    • 从0开始创建Charts
    • 将Charts及其相关的文件打包为归档格式
    • 将Charts存储于仓库(repository)中并与之交互
    • 在Kubernetes集群中安装或卸载Charts以及管理经Helm安装的应用的版本发行周期
    1. 对Helm来说,它具有以下几个关键概念。
    • Charts:即一个Helm程序包,它包含了运行一个Kubernetes应用所需要的镜像、依赖关系和资源定义等,必要时还会包含Service的定义;它类似于yum的rpm文件。
    • Repository:Charts仓库,用于集中存储和分发Charts,类似于Python的PyPI。
    • Config:应用程序实例化安装运行时使用的配置信息。
    • Release:应用程序实例化配置后运行于Kubernetes集群中的一个Charts实例;从V3开始,Release
      不再是全局资源,而是存储在各自命名空间内。

    三、helm架构

    Helm主要由Helm客户端、Tiller服务器和Charts仓库(repository)组成

    image-20220816150125693

    1. Helm客户端是命令行客户端工具,采用Go语言编写,基于gRPC协议与Tiller
      server交互。它主要完成如下任务。
    • 本地Charts开发。
    • 管理Charts仓库。
    • 与Tiller服务器交互:发送Charts以安装、查询Release的相关信息以及升级或卸载已有的Release。
    1. Tiller
      server(V3已将Tiller的删除,通过ApiServer与k8s交互)是托管运行于Kubernetes集群之中的容器化服务应用,它接收来自Helm客户端的请求,并在必要时与Kubernetes API Server进行交互。它主要完成以下任务。
    • 监听来自于Helm客户端的请求。
    • 合并Charts和配置以构建一个Release。
    • 向Kubernetes集群安装Charts并对相应的Release进行跟踪。
    • 升级和卸载Charts。
    1. 通常,用户于Helm客户端本地遵循其格式编写Charts文件,而后即可部署于Kuber-netes集群之上运行为一个特定的Release。仅在有分发需求时,才应该将同一应用的Charts文件打包成归档压缩格式提交到特定的Charts仓库。

    四、Helm工作原理

    image-20220816150330579

    1. Chart Install 过程:
    - Helm从指定的目录或者tgz文件中解析出Chart结构信息
    - Helm将指定的Chart结构和Values信息通过gRPC传递给Tiller
    - Tiller根据Chart和Values生成一个Release
    - Tiller将Release发送给Kubernetes用于生成Release
    
    • 1
    • 2
    • 3
    • 4
    1. Chart Update过程:
    - Helm从指定的目录或者tgz文件中解析出Chart结构信息
    - Helm将要更新的Release的名称和Chart结构,Values信息传递给Tiller
    - Tiller生成Release并更新指定名称的Release的History
    - Tiller将Release发送给Kubernetes用于更新Release
    
    • 1
    • 2
    • 3
    • 4
    1. Chart Rollback过程:
    - Helm将要回滚的Release的名称传递给Tiller
    - Tiller根据Release的名称查找History
    - Tiller从History中获取上一个Release
    - Tiller将上一个Release发送给Kubernetes用于替换当前Release
    
    • 1
    • 2
    • 3
    • 4

    2.helm安装

    一、安装Helm

    • 官方参考文档:

      https://helm.sh/docs/intro/quickstart/
      
      • 1
      • Helm的安装方式有两种:预编译的二进制程序和源码编译安装。
      • Helm项目托管在GitHub之上,项目地址为https://github.com/helm/helm/releases。
      • Helm的运行依赖于本地安装并配置完成的kubectl方能与运行于Kubernetes集群之上的Tiller服务器进行通信,因此,运行Helm的节点也应该是可以正常使用kubectl命令的主机,或者至少是有着可用kubeconfig配置文件的主机。
    下载合用版本的压缩包并将其展开。
    wget https://get.helm.sh/helm-v3.0.2-linux-amd64.tar.gz 
    tar -xvf helm-v3.0.2-linux-amd64.tar.gz 
    
    • 1
    • 2

    image-20220816151613530

    将其二进制程序文件复制或移动到系统PATH环境变量指向的目录中
    cp linux-amd64/helm /usr/local/bin/
    
    • 1
    以添加自动完成的代码:
    source <(helm completion bash) 
    
    • 1
    Helm客户端安装完成后,进行验证。
    root@k8s-master:~/heml# helm version
    
    • 1

    image-20220816151915198

    二、添加Helm的官方仓库

    添加官方Charts仓库

    若遇到Unable to get an update from the “stable” chart repository (https://kubernetes-charts.storage.googleapis.com) 错误
    手动更换stable 存储库为阿里云的存储库

    helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    
    • 1
    更新仓库信息
    helm repo update
    
    • 1
    查看官方Charts仓库
    helm search repo stable 
    
    • 1

    image-20220816153315736

    3.helm常用命令

    一、helm管理命令

    查看版本
    helm version 
    
    • 1
    增加repo
    `#helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts` 
    
    • 1
    `#helm repo add --username admin --password password myharbor https://harbor.qing.cn/chartrepo/charts` 
    
    • 1
    更新repo仓库资源
    `#helm repo update` 
    
    • 1

    二、charts管理

    查看当前安装的charts
    `#helm list` 
    
    • 1
    将helm search hub显示所有可用图表。
    `#helm search hub redis` 
    
    • 1
    使用helm search repo,您可以在已添加的存储库中找到charts的名称:
    `#helm search repo redis` 
    
    • 1
    打印出指定的Charts的详细信息
    `#helm show chart stable/redis` 
    
    • 1

    image-20220816154119617

    下载charts到本地
    `#helm fetch redis` 
    
    • 1
    安装charts
    `#helm install redis stable/redis` 
    
    • 1
    查看charts状态
    `#helm status redis` 
    
    • 1
    删除charts
    `#helm uninstall redis` 
    
    • 1

    三、自定义charts

    1. 创建charts

      `#helm create helm_charts` 
      
      • 1
    2. 检查chart语法正确性

      `# helm lint myapp` 
      
      • 1
    3. 打包自定义的chart

      `# helm package myapp` 
      
      • 1
    4. 查看生成的yaml文件

      `#helm template myapp-1.tgz` 
      
      • 1
    5. #使用默认chart部署到k8s

      `helm install myapp myapp-1.tgz` 
      
      • 1
    6. #使用包去做release部署

      `helm install --name example2 helm-chart-0.1.0.tgz --set  service.type=NodePort`
      
      • 1

    四、更新与回滚

    1. 查看当前chart信息

      `#helm list` 
      
      • 1
    2. 更新images

      `#helm upgrade myapp myapp-2.tgz` 
      
      • 1
    3. 查看版本信息

      `#helm history myapp` 
      
      • 1
    4. 回滚指定版本

      `#helm rollback myapp 1` 
      
      • 1

    4.Helm Charts

    一、Charts文件组织结构

    一个Charts就是按特定格式组织的目录结构,目录名即为Charts名,目录名称本身不包含版本信息。目录结构中除了charts/和templates/是目录之外,其他的都是文件。它们的基本功用如下。

    1. Chart.yaml:当前Charts的描述信息,yaml格式的文件。
    2. LICENSE:当前Charts的许可证信息,纯文本文件;此为可选文件。
    3. README.md:易读格式的README文件;可选。
    4. requirements.yaml:当前Charts的依赖关系描述文件;可选。
    5. values.yaml:当前Charts用到的默认配置值。
    6. charts/:目录,存放当前Charts依赖到的所有Charts文件。
    7. templates/:目录,存放当前Charts用到的模板文件,可应用于Charts生成有效的Kuber-netes清单文件。
    8. templates/NOTES.txt:纯文本文件,Templates简单使用注解
    ● 尽管Charts和Templates目录均为可选,但至少应该存在一个Charts依赖文件或一个模板文件。另外,Helm保留使用charts/和templates/目录以及上面列出的文件名称,其他文件都将被忽略。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    二、Chart.yaml文件组织格式

    Chart.yaml用于提供Charts相关的各种元数据,如名称、版本、关键词、维护者信息、使用的模板引擎等,它是一个Charts必备的核心文件,主要包含以下字段

    1. name:当前Charts的名称,必选字段。
    2. version:遵循语义化版本规范第2版的版本号,必选字段。
    3. description:当前项目的单语句描述信息,可选字段。
    4. keywords:当前项目的关键词列表,可选字段。
    5. home:当前项目的主页URL,可选字段。
    6. sources:当前项目用到的源码的来源URL列表,可选字段。
    7. maintainers:项目维护者信息,主要嵌套name、email和URL几个属性组成;可选字段。
    8. engine:模板引擎的名称,默认为gotpl,即go模板。
    9. icon:URL,指向当前项目的图标,SVG或PNG格式的图片;可选字段。
    10. appVersion:本项目用到的应用程序的版本号,可选字段,且不必为语义化版本。
    11. tillerVersion:当前Charts依赖的Tiller版本号,可以是语义化版本号的范围,如“>2.4.0”;可选字段。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    三、Charts中的依赖关系

    Helm中的一个Charts可能会依赖不止一个其他的Charts,这种依赖关系可经requirements.yaml进行动态链接,也可直接存储于charts/目录中进行手动管理。

    1. requirements.yaml文件
    requirements.yaml文件本质上只是一个简单的依赖关系列表,可用字段具体如下。
    2. name:被依赖的Charts的名称。
    3. version:被依赖的Charts的版本。
    4. repository:被依赖的Charts所属的仓库及其URL;如果是非官方的仓库,则需要先用helm
    repo add命令将其添加进本地可用仓库。
    5. alias:为被依赖的Charts创建一个别名,从而让当前Charts可以将所依赖的Charts对应到新名称,即别名;可选字段。
    6. tags:默认情况下所有的Charts都会被装载,若给定了tags,则仅装载那些匹配到的Charts。
    7. condition:类似于tags字段,但需要通过自定义的条件来指明要装载的charts。
    8. import-values:导入子Charts中的的值;被导入的值需要在子charts中导出。
    9. Charts目录
    ● 若需要对依赖关系进行更多的控制,则所有被依赖到的Charts都能以手工方式直接复制到Charts目录中。一个被依赖到的Charts既可以是归档格式,也可以是展开的目录格式,不过,其名称不能以下划线(_)或点号(.)开头,此类文件会被Charts装载器自动忽略。
    例如,Wordpress Charts依赖关系在其Charts目录中的反映类似如下所示:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    image-20220816155341546

    • Helm
      Charts模板(template)遵循Go模板语言格式,并支持50种以上的来自Spring库的模板函数附件,以及为数不少的其他专用函数。所有的模板文件都存储于Templates目录中,在当前Charts被Helm引用时,此目录中的所有模板文件都会传递给模板引擎进行处理。模板文件中用到的值(value)有如下两种提供方式。‰□通过Charts的values.yaml文件提供,通常用于提供默认值。‰□在运行“helm
      install”命令时传递包含所需要的自定义值的YAML文件;此处传递的值会覆盖默认值。

    5.自定义Charts

    一、创建Chart

    1. 执行命令helm create myapp,会创建一个myapp目录

      `# helm create myapp` 
      
      • 1
    2. 查看myapp目录结构

    root@k8s-master:~/heml# tree myapp/
    
    • 1

    image-20220816155547175

    二、修改配置文件

    编辑自描述文件 Chart.yaml , 修改version和appVersion信息
    root@k8s-master:~/heml/myapp# ls
    charts	Chart.yaml  templates  values.yaml
    root@k8s-master:~/heml/myapp# vim Chart.yaml
    
    • 1
    • 2
    • 3

    image-20220816160448973

    编辑values.yaml配置文件

    image-20220816160642557

    三、打包安装chart

    1. 检查chart语法正确性

      `# helm lint myapp` 
      
      • 1
    2. 打包自定义的chart

      `# helm package myapp` 
      
      • 1
    3. 安装chart

      `# helm install myapp myapp-1.tgz` 
      
      • 1
    4. 验证

    root@k8s-master:~/heml# kubectl get pod
    
    • 1

    image-20220816161543232

    image-20220816161730051

    四、更新

    编辑自描述文件 Chart.yaml , 修改version和appVersion信息

    image-20220816161850189

    1. 重新打包charts
    • 检查chart语法正确性

      `# helm lint myapp` 
      
      • 1
    • 打包自定义的chart

      `# helm package myapp` 
      
      • 1
    1. 更新chart

      `# helm upgrade myapp myapp-2.tgz` 
      
      • 1
    2. 验证

    root@k8s-master:~/heml# kubectl get svc
    
    • 1

    image-20220816162141804

    image-20220816162234917

    五、回滚

    查看当前版本信息
    root@k8s-master:~/heml# helm list
    
    • 1

    image-20220816162321393

    查看历史版本信息
    root@k8s-master:~/heml# helm history myapp
    
    • 1

    image-20220816162424036

    回滚到指定版本
    oot@k8s-master:~/heml# helm rollback myapp 1
    
    • 1

    image-20220816162652015

    验证
    root@k8s-master:~/heml# kubectl get svc
    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   28d
    myapp        ClusterIP   10.103.95.175   <none>        80/TCP    10m
    root@k8s-master:~/heml# curl 10.103.95.175
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    hell
    oot@k8s-master:~/heml# helm rollback myapp 1

    
    [外链图片转存中...(img-NP4XSauU-1660638458806)]
    
    ###### 验证
    
    ```shell
    root@k8s-master:~/heml# kubectl get svc
    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   10.96.0.1               443/TCP   28d
    myapp        ClusterIP   10.103.95.175           80/TCP    10m
    root@k8s-master:~/heml# curl 10.103.95.175
    Hello MyApp | Version: v1 | Pod Name
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    image-20220816162531379

  • 相关阅读:
    机器学习笔记之隐马尔可夫模型(一)概率模型背景的阶段性介绍
    web中间件漏洞-Jenkins漏洞-弱口令、反弹shell
    设计模式:适配器模式
    SpringSecurity-基于Web的认证与权限访问
    MongoDB实验——MongoDB配置用户的访问控制
    Vue3 如何实现一个全局搜索框
    微信小程序自定义导航
    二进制搭建以太坊节点
    计算机毕业设计ssm+vue基本微信小程序的健康食谱交流共享平台
    快排(霍尔排序实现+前后指针实现)(递归+非递归)
  • 原文地址:https://blog.csdn.net/tianmingqing0806/article/details/126369025