Helm从入门到实践

Helm从入门到实践

Helm 是 Kubernetes 的软件包管理工具。本文需要读者对 Docker、Kubernetes 等相关知识有一定的了解。 本文将介绍 Helm 中的相关概念和基本工作原理,并通过一些简单的示例来演示如何使用Helm来安装、升级、回滚一个 Kubernetes 应用。

Helm 是什么??

Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一样,能快速查找、下载和安装软件包。Helm 由客户端组件 helm 和服务端组件 Tiller 组成, 能够将一组K8S资源打包统一管理, 是查找、共享和使用为Kubernetes构建的软件的最佳方式。

Helm 解决了什么痛点?

在 Kubernetes中部署一个可以使用的应用,需要涉及到很多的 Kubernetes 资源的共同协作。比如你安装一个 WordPress 博客,用到了一些 Kubernetes (下面全部简称k8s)的一些资源对象,包括 Deployment 用于部署应用、Service 提供服务发现、Secret 配置 WordPress 的用户名和密码,可能还需要 pv 和 pvc 来提供持久化服务。并且 WordPress 数据是存储在mariadb里面的,所以需要 mariadb 启动就绪后才能启动 WordPress。这些 k8s 资源过于分散,不方便进行管理,直接通过 kubectl 来管理一个应用,你会发现这十分蛋疼。
所以总结以上,我们在 k8s 中部署一个应用,通常面临以下几个问题:

  • 如何统一管理、配置和更新这些分散的 k8s 的应用资源文件
  • 如何分发和复用一套应用模板
  • 如何将应用的一系列资源当做一个软件包管理

Helm 相关组件及概念

Helm 包含两个组件,分别是 helm 客户端 和 Tiller 服务器:

  • helm 是一个命令行工具,用于本地开发及管理chart,chart仓库管理等
  • Tiller 是 Helm 的服务端。Tiller 负责接收 Helm 的请求,与 k8s 的 apiserver 交互,根据chart
    来生成一个 release 并管理 release
  • chart Helm的打包格式叫做chart,所谓chart就是一系列文件, 它描述了一组相关的 k8s 集群资源
  • release 使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release
  • Repoistory Helm chart 的仓库,Helm 客户端通过 HTTP 协议来访问存储库中 chart 的索引文件和压缩包

Helm 原理

下面两张图描述了 Helm 的几个关键组件 Helm(客户端)、Tiller(服务器)、Repository(Chart 软件仓库)、Chart(软件包)之间的关系以及它们之间如何通信

helm 组件通信
helm 组件通信
在这里插入图片描述
helm 架构

创建release

  • helm 客户端从指定的目录或本地tar文件或远程repo仓库解析出chart的结构信息
  • helm 客户端指定的 chart 结构和 values 信息通过 gRPC 传递给 Tiller
  • Tiller 服务端根据 chart 和 values 生成一个 release
  • Tiller 将install release请求直接传递给 kube-apiserver

删除release

  • helm 客户端从指定的目录或本地tar文件或远程repo仓库解析出chart的结构信息
  • helm 客户端指定的 chart 结构和 values 信息通过 gRPC 传递给 Tiller
  • Tiller 服务端根据 chart 和 values 生成一个 release
  • Tiller 将delete release请求直接传递给 kube-apiserver

更新release

  • helm 客户端将需要更新的 chart 的 release 名称 chart 结构和 value 信息传给 Tiller
  • Tiller 将收到的信息生成新的 release,并同时更新这个 release 的 history
  • Tiller 将新的 release 传递给 kube-apiserver 进行更新

chart 的基本结构

Helm的打包格式叫做chart,所谓chart就是一系列文件, 它描述了一组相关的 k8s 集群资源。Chart中的文件安装特定的目录结构组织, 最简单的chart 目录如下所示:

在这里插入图片描述

  • charts 目录存放依赖的chart
  • Chart.yaml 包含Chart的基本信息,包括chart版本,名称等
  • templates 目录下存放应用一系列 k8s 资源的 yaml 模板
  • _helpers.tpl 此文件中定义一些可重用的模板片断,此文件中的定义在任何资源定义模板中可用
  • NOTES.txt 介绍chart 部署后的帮助信息,如何使用chart等
  • values.yaml 包含了必要的值定义(默认值), 用于存储 templates 目录中模板文件中用到变量的值

helm安装

环境要求

  • 可用的 Kubernetes 集群
  • 正确的可用的 kubectl config

简单做法

只要一个简单的 helm init 命令,就可以自动完成 Tiller 的安装,以及 Helm 本地设置。

安装docker

安装Kubernetes单节点

kubernetes单节点与集群唯一不一样的就是不需要其他node加入集群,然后把master节点的污点去掉,因为默认master是不允许被调度启动pods的

# kubectl taint nodes --all node-role.kubernetes.io/master-

Helm-cli

Helm Client 是用户命令行工具,其主要负责如下:

  • 本地 chart 开发
  • 仓库管理
  • 与 Tiller sever 交互
  • 发送预安装的 chart
  • 查询 release 信息
  • 要求升级或卸载已存在的 release

在安装Helm之前要保证有一个完整的Kubernetes集群在正常运行。

安装方式有很多,具体参考官网安装文档,这里只是tar的安装方法。

下载helm的安装包

在该链接的Installation and Upgrading部分的链接是下载tar.gz包的链接,我这里选则的版本是这个

# tar zxf helm-v3.4.2-linux-amd64.tar.gz

安装helm,其实主要就是要这个命令的脚本即可,所以解压缩之后,将helm命令脚本复制到系统中的命令可执行环境变量的目录中即可

大多数情况下,安装只需要简单地获取一个构建好的helm二进制包

# mv linux-amd64/helm /usr/local/bin/helm

Helm-tiller(服务端)

Tiller Server是一个部署在Kubernetes集群内部的 server,其与 Helm client、Kubernetes API server 进行交互。Tiller server 主要负责如下:

  • 监听来自 Helm client 的请求
  • 通过 chart 及其配置构建一次发布
  • 安装 chart 到Kubernetes集群,并跟踪随后的发布
  • 通过与Kubernetes交互升级或卸载 chart
  • 简单的说,client 管理 charts,而 server 管理发布 release

本身服务端需要运行命令helm init进行部署安装,但在3.x之后被移除,如果使用的helm版本为2.x,请参考Helm初始化文档

Helm的使用

仓库

helm的使用是需要使用仓库的,就像docker和kubernetes一样,需要从仓库中拉取作者创建好的模板文件为己用

仓库 是归集和分享chart的地方。只针对于Kubernetes包。

添加chart仓库,常见的选择是helm的官方仓库,如下:

格式:

​ 添加:helm repo add [NAME] [URL]

​ 删除: helm repo remove [NAME]

# helm repo add stable https://charts.helm.sh/stable
"stable" has been added to your repositories

阿里云:https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

微软:http://mirror.azure.cn/kubernetes/charts

helm search

Helm有强大的搜索命令。可以搜索两类不同资源:

helm search hub
搜索 Artifact Hub,该仓库列出了来自不同仓库的大量chart。

# helm search hub
URL                                         CHART VERSION                APP VERSION                        DESCRIPTION                                       
https://hub.helm.sh/charts/gabibbo97/389ds  0.1.0                        fedora-32                          389 Directory Server                              
https://hub.helm.sh/charts/aad-pod...        3.0.0                        1.7.1                              Deploy components for aad-pod-identity            
https://hub.helm.sh/charts/arhatdev/abbot   0.1.0                        latest                             Network Manager Living at Edge
# ... and many more

helm search repo
搜索已经(用 helm repo add)加入到本地helm客户端的仓库。该命名只搜索本地数据,不需要连接网络。

# helm search repo
NAME                                     CHART VERSION    APP VERSION                DESCRIPTION                                       
stable/acs-engine-autoscaler             2.2.2            2.1.1                      DEPRECATED Scales worker nodes within agent pools 
stable/aerospike                         0.3.5            v4.5.0.5                   DEPRECATED A Helm chart for Aerospike in Kubern...
stable/airflow                           7.13.3           1.10.12                    DEPRECATED - please use: https://github.com/air...
# ... and many more

指定本地仓库

# helm search repo [仓库名]

仓库模糊查找

Helm搜索使用字符串模糊匹配,因此输入部分名称也可以

# helm search repo sql
NAME                           CHART VERSION    APP VERSION    DESCRIPTION                                       
stable/gcloud-sqlproxy         0.6.1            1.11           DEPRECATED Google Cloud SQL Proxy                 
stable/mssql-linux             0.11.4           14.0.3023.8    DEPRECATED - SQL Server 2017 Linux Helm Chart     
stable/mysql                   1.6.9            5.7.30         DEPRECATED - Fast, reliable, scalable, and easy...
# ... and many more

helm install

使用search搜到到可以用包之后,即可使用helm install安装

最简单的方式有两个参数:查找到发布名称和chart名称。

现在找一个数据库来部署

[root@t10 ~]# helm search repo mysql
NAME                  CHART VERSION    APP VERSION          DESCRIPTION       
...
stable/mariadb        7.3.14           10.3.22              DEPRECATED Fast, reliable, scalable, and easy t...

发布名称自定义,chart名称为search看到的名称stable/mariadb

格式:helm install [发布名称] [chart名称]

# helm install happy-panda stable/mariadb
WARNING: This chart is deprecated
NAME: happy-panda
LAST DEPLOYED: Mon Dec 28 11:23:42 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
This Helm chart is deprecated

Given the `stable` deprecation timeline (https://github.com/helm/charts#deprecation-timeline), the Bitnami maintained Helm chart is now located at bitnami/charts (https://github.com/bitnami/charts/).

The Bitnami repository is already included in the Hubs and we will continue providing the same cadence of updates, support, etc that we've been keeping here these years. Installation instructions are very similar, just adding the _bitnami_ repo and using it during the installation (`bitnami/<chart>` instead of `stable/<chart>`) ​```bash $ helm repo add bitnami https://charts.bitnami.com/bitnami $ helm install my-release bitnami/<chart> # Helm 3 $ helm install --name my-release bitnami/<chart> # Helm 2 ​``` To update an exisiting _stable_ deployment with a chart hosted in the bitnami repository you can execute ​```bash $ helm repo add bitnami https://charts.bitnami.com/bitnami $ helm upgrade my-release bitnami/<chart>``` Issues and PRs related to the chart itself will be redirected to `bitnami/charts` GitHub repository. In the same way, we'll be happy to answer questions related to this migration process in this issue (https://github.com/helm/charts/issues/20969) created as a common place for discussion.

Please be patient while the chart is being deployed

Tip:

  Watch the deployment status using the command: kubectl get pods -w --namespace default -l release=happy-panda

Services:

  echo Master: happy-panda-mariadb.default.svc.cluster.local:3306
  echo Slave:  happy-panda-mariadb-slave.default.svc.cluster.local:3306

Administrator credentials:

  Username: root
  Password : $(kubectl get secret --namespace default happy-panda-mariadb -o jsonpath="{.data.mariadb-root-password}" | base64 --decode)

To connect to your database:

  1. Run a pod that you can use as a client:

      kubectl run happy-panda-mariadb-client --rm --tty -i --restart='Never' --image  docker.io/bitnami/mariadb:10.3.22-debian-10-r27 --namespace default --command -- bash

  2. To connect to master service (read/write):

      mysql -h happy-panda-mariadb.default.svc.cluster.local -uroot -p my_database

  3. To connect to slave service (read-only):

      mysql -h happy-panda-mariadb-slave.default.svc.cluster.local -uroot -p my_database

To upgrade this helm chart:

  1. Obtain the password as described on the 'Administrator credentials' section and set the 'rootUser.password' parameter as shown below:

      ROOT_PASSWORD=$(kubectl get secret --namespace default happy-panda-mariadb -o jsonpath="{.data.mariadb-root-password}" | base64 --decode)
      helm upgrade happy-panda stable/mariadb --set rootUser.password=$ROOT_PASSWORD

现在mariadb的chart已经安装。上述发布的名称是:happy-panda。 (如果想让Helm为你生成一个名称,去掉发布名称并加上–generate-name)

如:helm install stable/mariadb –generate-name

安装方法

本地chart包: helm install foo foo-0.1.1.tgz
解压的chart目录: helm install foo path/to/foo
完整URL: helm install foo https://example.com/charts/foo-1.2.3.tgz

helm list

查看发布后的chart

# helm list
NAME          NAMESPACE    REVISIO  UPDATED                                    STATUS      CHART             APP VERSION
happy-panda   default      1        2020-12-28 13:10:44.016697442 -0500 EST    deployed    mariadb-7.3.14    10.3.22  

helm status

使用helm status,可以查看chart发布的状态或者配置信息

格式:helm status [发布名称]

# helm status happy-panda
# 输出的内容和刚install结束的内容是一样的

helm show values

以上的安装使用了chart的所有默认配置,也可以对配置进行自定义,首先通过helm show values命令查看chart的可配置项

格式:helm show values [chart名称]

# helm show values stable/mariadb


## Global Docker image parameters
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
## Current available global Docker image parameters: imageRegistry and imagePullSecrets
##
# global:
# imageRegistry: myRegistryName
# imagePullSecrets:
# - myRegistryKeySecretName
# storageClass: myStorageClass

## Use an alternate scheduler, e.g. "stork".
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
##
# schedulerName:

## Bitnami MariaDB image
## ref: https://hub.docker.com/r/bitnami/mariadb/tags/
##
image:
  registry: docker.io
  repository: bitnami/mariadb
  tag: 10.3.22-debian-10-r27
...

通过yaml文件覆盖默认配置

# echo '{mariadbUser: user0, mariadbDatabase: user0db}' > config.yaml
# helm install -f config.yaml stable/mariadb --generate-name

mariadbUser和mariadbDatabase分别是mariadb数据库里面的用户和数据库,以上更改意思是创建了数据库新用户user0,和创建了新数据库user0db,且该用户拥有user0db数据库的访问权限。

通过命令行覆盖默认配置

# helm install --set name=value stable/mariadb --generate-name
name: value
# 多个值用','分割
# helm install --set a=b,c=d stable/mariadb --generate-name
a: b
c: d
# 负载表达式
# helm install --set outer.inner=value stable/mariadb --generate-name
outer:
  inner: value
# 列表配置
# helm install --set name={a, b, c} stable/mariadb --generate-name
name:
  - a
  - b
  - c
# 数组索引
# helm install --set servers[0].port=80 stable/mariadb --generate-name
servers:
  - port: 80
# 数组索引+负载
# helm install --set servers[0].port=80,servers[0].host=example --generate-name
servers:
  - port: 80
    host: example
# 一个变量多个值
# helm install --set name=value1\,value2 --generate-name
name: "value1,value2"

–set指定的值会被helm upgrade运行时–reset-values指定的值清空。

实例更改标签选择

# helm install --set nodeSelector."kubernetes\.io/role"=master --generate-name
nodeSelector:
  kubernetes.io/role: master

helm upgrade

当chart新版本发布时,或者您想改变发布的配置,可以使用 helm upgrade 命令。

升级采用已有版本并根据您提供的信息进行升级。由于Kubernetes的chart会很大且很复杂,Helm会尝试执行最小增量升级。 这样只会升级自最新版发生改变的部分。

格式和install使用文件替换默认配置的方法类似

格式:helm upgrade -f [yaml文件名] [发布名称] [chart名称]

# vim config.yaml 
mariadbUser: cyj
# helm upgrade -f config.yaml happy-panda stable/mariadb
...

查看发布的更新内容是否生效

# helm get values happy-panda
USER-SUPPLIED VALUES:
mariadbUser: cyj

helm rollback

如果发现更新出现了问题,可以使用helm rollback进行回滚

通过helm hist [发布名称]查看版本

# helm hist happy-panda
REVISION    UPDATED                     STATUS        CHART             APP VERSION    DESCRIPTION     
1           Mon Dec 28 11:23:42 2020    superseded    mariadb-7.3.14    10.3.22        Install complete
2           Mon Dec 28 11:59:13 2020    deployed      mariadb-7.3.14    10.3.22        Upgrade complete

格式:helm rollback [发布名称] REVISION

# helm rollback happy-panda 1
Rollback was a success! Happy Helming!
# helm hist happy-panda
REVISION    UPDATED                     STATUS        CHART             APP VERSION    DESCRIPTION     
1           Mon Dec 28 11:23:42 2020    superseded    mariadb-7.3.14    10.3.22        Install complete
2           Mon Dec 28 11:59:13 2020    superseded    mariadb-7.3.14    10.3.22        Upgrade complete
3           Mon Dec 28 12:08:22 2020    deployed      mariadb-7.3.14    10.3.22        Rollback to 1 

helm uninstall

从集群中卸载发布,使用helm uninstall

格式:helm uninstall [发布名称]

# helm uninstall happy-panda
release "happy-panda" uninstalled
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/101869.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • python win32api教程_python通过api获取数据

    python win32api教程_python通过api获取数据0x01Win32API简介Win32API即为Microsoft32位平台(包括:Windows9x,WindowsNT3.1/4.0/5.0,WindowsCE等)的应用程序编程接口(ApplicationProgrammingInterface),是构筑所有32位Windows平台的基石,所有在Win32平台上运行的应用程序都可以调用这些函数。使用Win32API,应用…

    2022年10月11日
  • Linux超级守护进程——xinetd

    Linux超级守护进程——xinetd

  • Windows 编程(多进程)

    Windows编程(多进程)进程组成:操作系统用来管理进行的内核对象内核对象也是系统用来存放关于进程的统计信息的地方.内核对象是操作系统内部分配的一个内存块,该内存块是一种数据结构,其成员负

    2021年12月13日
  • @PostConstruct注解

    @PostConstruct注解好多人以为是Spring提供的。其实是Java自己的注解。Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。通常我们会是在Spring…

  • 在线电影资源的版式说明

    在线电影资源的版式说明http://tieba.baidu.com/f?kz=47439298http://wenku.baidu.com/view/74cadfd0b9f3f90f76c61bca.htmlhttp://wenku.baidu.com/view/a14f7410ff00bed5b9f31d9b.html一、在线电影资源的常见版式(按画质排列)1. CAM(枪版) CA

  • php三个数从大到小排列_php常用的流程控制语句

    php三个数从大到小排列_php常用的流程控制语句<?php$a = rand(100,999);$b = rand(100,999);$c = rand(100,999);echo “a=”.”$a”.”<br>”;echo “b=”.”$b”.”<br>”;echo “c=”.”$c”.”<br>”;if(($a > $b ) && ($a > …

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号