• 【云原生--Kubernetes】Helm 工具安装


    一. Helm 概述

    1.1 Helm 简介

    在没使用 helm 之前,向 kubernetes 部署应用,我们要依次部署 deployment、svc 等,步骤较繁琐。 况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm 通过打包的方式,支持发布的版本管理和控制, 很大程度上简化了 Kubernetes 应用的部署和管理。

    Helm 本质就是让 K8s 的应用管理(Deployment、Service 等)可配置,可以通过类似于传递环境变量的方式能动态生成。通过动态生成 K8s 资源清单文件(deployment.yaml、service.yaml)。然后调用 Kubectl 自动执行 K8s 资源部署。

    我们可以将Helm看作Kubernetes下的apt-get/yum。Helm是Deis (https://deis.com/) 开发的一个用于kubernetes的包管理器。每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tgz格式的单一文件,方便传输和存储)。

    1.2 Helm重要概念

    Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。Helm 有三个重要的概念:Chart 、Repository 和 Release

    • Chart:Helm 的软件包,采用 TAR 格式。类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件。
    • Repository(仓库):Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。
    • Release:使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。可以理解为 Helm 使用 Chart 包部署的一个应用实例。一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 release。

    PS:以 MySQL chart 为例,如果你想在你的集群中运行两个数据库,你可以安装该 chart 两次。每一个数据库都会拥有它自己的 release 和 release name。可以将 release 想象成应用程序发布的版本号。

    1.3Helm2 组件

    在 Helm 中有两个主要的组件,即 Helm 客户端和 Tiller 服务器

    • Helm客户端
      是一个供终端用户使用的命令行工具
      客户端负责如下的工作:

    • 本地 chart 开发

    • 管理仓库

    • 与 Tiller 服务器交互(发送需要被安装的 charts、请求关于发布版本的信息、请求更新或者卸载已安装的发布版本)

    • Tiller服务端
      Tiller 是 helm 的服务器端,一般运行于 kubernetes 集群之上,定义 tiller 的 ServiceAccount,并通过 ClusterRoleBinding 将其绑定至集群管理员角色 cluster-admin,从而使得它拥有集群级别所有的最高权限

    Tiller 服务器负责如下的工作:

    • 监听来自于 Helm 客户端的请求
    • 组合 chart 和配置来构建一个发布
    • 在 Kubernetes 中安装,并跟踪后续的发布
    • 通过与 Kubernetes 交互,更新或者 chart

    1.4Helm2 工作原理

    在这里插入图片描述

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

    1.5 Helm2与Helm3区别

    Helm2 是 C/S 架构,主要分为客户端 helm 和服务端 Tiller。在 Helm 2 中,Tiller 是作为一个 Deployment 部署在 kube-system 命名空间中,很多情况下,我们会为 Tiller 准备一个 ServiceAccount ,这个 ServiceAccount 通常拥有集群的所有权限。
    用户可以使用本地 Helm 命令,自由地连接到 Tiller 中并通过 Tiller 创建、修改、删除任意命名空间下的任意资源。
    在 Helm 3 中,Tiller 被移除了新的 Helm 客户端会像 kubectl 命令一样,读取本地的 kubeconfig 文件,使用我们在 kubeconfig 中预先定义好的权限来进行一系列操作
    Helm3使得我们在使用的时候更加的方便,无需另外为Helm配置任何k8s的权限

    二.Helm部署

    官方手册:https://helm.sh/zh/docs/

    下载二进制 Helm client 安装包:https://github.com/helm/helm/releases?page=2
    我这儿使用的是3.6.0的版本

    tar -zxvf helm-v3.6.0-linux-amd64.tar.gz
    mv linux-amd64/helm /usr/local/bin/helm
    helm version
    #命令补全
    source <(helm completion bash)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    三.Helm常用命令

    3.1 chart仓库管理

    #添加常用的 chart 仓库
    helm repo add bitnami https://charts.bitnami.com/bitnami
    helm repo add stable http://mirror.azure.cn/kubernetes/charts
    helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    helm repo add incubator https://charts.helm.sh/incubator
    
    #更新仓库、列表
    helm repo update  
    helm repo list
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    #查看 stable 仓库可用的 charts 列表,类似于yum list
    helm search repo stable
    
    #删除 incubator 仓库
    helm repo remove incubator
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    3.2 查看 chart信息

    
    helm show chart stable/mysql     #查看指定 chart 的基本信息
    
    helm show all stable/mysql		 #获取指定 chart 的所有信息
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    在这里插入图片描述

    3.3 安装chart

    helm install my-redis bitnami/redis [-n default]   
    #指定 release 的名字为 my-redis,-n指定部署到k8s的namespace,若不指定则为默认名称空间
    
    helm install bitnami/redis --generate-name    
    #不指定 release 的名字时,需使用 –generate-name 随机生成一个名字
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    #查看安装信息
     kubectl get pod,svc
    
    • 1
    • 2

    在这里插入图片描述

    3.4 查询release

    #查询所有release
    helm ls 
    helm list
    #查看指定的 release 状态
    helm status my-redis         
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    在这里插入图片描述

    3.5 删除 release

    helm uninstall my-redis 
    
    • 1

    在这里插入图片描述

    四.Heml自定义模板

    4.1 chart包

    charts 除了可以在 repo 中下载,还可以自己自定义,创建完成后通过 helm 部署到 k8s。

    mkdir /opt/helm
    cd /opt/helm
    
    • 1
    • 2
    helm pull stable/mysql
    tar xf mysql-1.6.9.tgz
    yum install -y tree
    tree mysql
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    可以看到,一个 chart 包就是一个文件夹的集合,文件夹名称就是 chart 包的名称。
    chart 是包含至少两项内容的helm软件包

    1. 软件包自描述文件 Chart.yaml,这个文件必须有 name 和 version(chart版本) 的定义
    2. 一个或多个模板,其中包含 Kubernetes 清单文件:
    • NOTES.txt:chart 的“帮助文本”,在用户运行 helm install 时显示给用户
    • deployment.yaml:创建 deployment 的资源清单文件
    • service.yaml:为 deployment 创建 service 的资源清单文件
    • ingress.yaml: 创建 ingress 对象的资源清单文件
    • _helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用

    4.2 创建自定义chart

    4.2.1 chart文件介绍

    helm create nginx
    tree nginx
    
    • 1
    • 2

    在这里插入图片描述
    查看deploment

    cat nginx/templates/deployment.yaml
    
    • 1

    在这里插入图片描述
    在 templates 目录下 yaml 文件模板中的变量(go template语法)的值默认是在 nginx/values.yaml 中定义的,只需要修改 nginx/values.yaml 的内容,也就完成了 templates 目录下 yaml 文件的配置。

    查看values

    cat nginx/values.yaml | grep repository
    
    • 1

    在这里插入图片描述
    以上变量值是在 create chart 的时候就自动生成的默认值,你可以根据实际情况进行修改。

    4.2.2 修改 chart

    vim nginx/Chart.yaml
    在这里插入图片描述
    vim nginx/values.yaml
    在这里插入图片描述
    在这里插入图片描述

    4.2.3 打包chart

    #检查依赖和模板配置是否正确
    helm lint nginx
    #打包
    helm package nginx 
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    4.2.4 部署chart

    #使用 --dry-run 参数验证 Chart 的配置,并不执行安装
    helm install nginx ./nginx --dry-run --debug 
    #安装,若需指定名称空间,使用-n
    helm install nginx ./nginx-0.1.0.tgz
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    测试:
    需要安装ingress-nginx,具提操作请看上篇文章

    wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
    wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
    kubectl apply -f mandatory.yaml
    kubectl apply -f service-nodeport.yaml
    
    • 1
    • 2
    • 3
    • 4

    编写测试文件

    kubectl get pod
    kubectl exec -it nginx-657bdbb8d4-st4x6 bash
    echo "this is helm chart" > /usr/share/nginx/html/index.html
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    主机域名映射

    echo "192.168.48.14 www.xiayan.com" >> /etc/hosts
    
    • 1

    访问测试:

    #获取ingress映射的端口
    kubectl get svc -n ingress-nginx
    
    • 1
    • 2

    在这里插入图片描述

    4.3 升级chart

    再次修改values.yaml,测试升级
    vim nginx/values.yaml
    在这里插入图片描述
    vim nginx/templates/service.yaml
    在这里插入图片描述
    升级

    helm upgrade nginx nginx
    
    • 1

    在这里插入图片描述
    访问测试:
    在这里插入图片描述

    4.4 回滚

    #查看指定chart的历史版本
    helm history nginx
    #回滚到指定版本
    helm rollback nginx 1 
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    通常情况下,在配置好 templates 目录下的 kubernetes 清单文件后,后续维护一般只需要修改 Chart.yaml 和 values.yaml 即可。

    在命令行使用 --set 指定参数来部署(install,upgrade)release
    :此参数值会覆盖掉在 values.yaml 中的值,如需了解其它的预定义变量参数,可查看 helm 官方文档。

    helm upgrade nginx nginx --set image.tag='1.15'
    
    • 1

    在这里插入图片描述

    五.Helm仓库

    helm 可以使用 harbor 作为本地仓库,将自定义的 chart 推送至 harbor 仓库。

    • 安装harbor
    #上传 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件到 /opt 目录
    cd /opt
    cp docker-compose /usr/local/bin/
    chmod +x /usr/local/bin/docker-compose
    tar zxf harbor-offline-installer-v1.9.1.tgz
    cd harbor
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    vim harbor.yml

    hostname: 192.168.48.14
    harbor_admin_password: Harbor12345
    data_volume: /data                     #数据存储路径,自动创建
    chart:
      absolute_url: enabled                #在chart中启用绝对url
    log:
      level: info
      local:
        rotate_count: 50
        rotate_size: 200M
        location: /var/log/harbor          #日志路径
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    #安装带有 Clair service 和 chart 仓库服务的 Harbor
    ./install.sh --with-clair --with-chartmuseum
    
    • 1
    • 2

    安装 push 插件

    #在线安装
    helm plugin install https://github.com/chartmuseum/helm-push
    
    #离线安装
    wget https://github.com/chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz
    
    mkdir ~/.local/share/helm/plugins/helm-push
    tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/helm-push
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    登录 Harbor WEB UI 界面,创建一个新项目
    浏览器访问:http://192.168.48.14 ,默认的管理员用户名和密码是 admin/Harbor12345
    点击 “+新建项目” 按钮
    填写项目名称为 “chart_repo”,访问级别勾选 “公开”,点击 “确定” 按钮,创建新项目
    在这里插入图片描述

    添加仓库

    helm repo add harbor http://192.168.48.14/chartrepo/chart_repo --username=admin --password=Harbor12345
    #这里的 repo 的地址是/chartrepo/<项目名称>,Harbor 中每个项目是分开的 repo。如果不提供项目名称, 则默认使用 library 这个项目。
    #查看仓库地址
    helm repo ls
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    推送 chart 到 harbor 中

    cd /opt/helm
    helm push nginx harbor
    
    • 1
    • 2

    在这里插入图片描述
    在Harbor仓库查看 chart_repo 项目中的 Helm Charts
    在这里插入图片描述

  • 相关阅读:
    visual studio解决bug封装dll库
    时间复杂度与空间复杂度
    java毕业生设计在线多媒体学习社区的设计与实现计算机源码+系统+mysql+调试部署+lw
    面试:听说你用过 MQ,能具体说说吗?
    Python的内置函数(十七)、replace()
    杭州高职画室哪家好?如何选择高职画室?高职美术学习选哪家画室?
    【全志T113-S3_100ask】15-2 linux系统gpio模拟spi驱动屏幕——ILI9341
    『无为则无心』Python面向对象 — 55、多层继承和继承中的私有成员
    计算机服务器中了faust勒索病毒怎么解密,faust勒索病毒解密工具流程
    CANAPE中加载DBC后,如何在脚本中获取到DBC内的信号量
  • 原文地址:https://blog.csdn.net/weixin_44175418/article/details/126277112