• helm 简介与入门


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

    解决问题

    能对多个模板文件(yaml文件)进行统一管理,设想一下,如果没有helm,如何执行多个模板文件呢?那就得一个个的执行kubectl apply -f xxx.yaml。而如今有了helm,只需要将文件放入chart包中,然后一句helm install xxx path便可以执行所有的模板文件。当然helm的好处不仅于此,还有其他便利之处,有待大家挖掘。

    用途

    做为 Kubernetes 的一个包管理工具,Helm具有如下功能:

    • 创建新的 chart
    • chart 打包成 tgz 格式
    • 上传 chart 到 chart 仓库或从仓库中下载 chart
    • Kubernetes集群中安装或卸载 chart
    • 管理用Helm安装的 chart 的发布周期

    安装

    用二进制版本安装

    每个Helm 版本]都提供了各种操作系统的二进制版本,这些版本可以手动下载和安装。

    1. 选择Helm版本查看Helm和对应支持的Kubernetes版本,可以参考 Helm 版本支持策略
    2. 下载安装包 https://github.com/helm/helm/releases
    3. 解压(tar -zxvf helm-v3.0.0-linux-amd64.tar.gz)
    4. 在解压目中找到helm程序,移动到需要的目录中(mv linux-amd64/helm /usr/local/bin/helm)

    然后就可以执行客户端程序并 添加稳定仓库: helm help.

    使用脚本安装

    Helm现在有个安装脚本可以自动拉取最新的Helm版本并在 本地安装

    您可以获取这个脚本并在本地执行。它良好的文档会让您在执行之前知道脚本都做了什么。

    $ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
    $ chmod 700 get_helm.sh
    $ ./get_helm.sh
    
    • 1
    • 2
    • 3

    如果想直接执行安装,运行curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

    使用Apt (Debian/Ubuntu)

    Helm社区成员贡献了针对Apt的一个 Helm包,包通常是最新的。

    curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
    sudo apt-get install apt-transport-https --yes
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
    sudo apt-get update
    sudo apt-get install helm
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用Helm

    三大概念

    • Chart : 代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。你可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在Kubernetes 中的等价物。

    • Repository(仓库) : 是用来存放和共享 charts 的地方。它就像 Perl 的 CPAN 档案库网络 或是 Fedora 的 软件包仓库,只不过它是供 Kubernetes 包所使用的。

    • Release : 是运行在 Kubernetes 集群中的 chart 的实例。一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 release。以 MySQL chart为例,如果你想在你的集群中运行两个数据库,你可以安装该chart两次。每一个数据库都会拥有它自己的 releaserelease name

    在了解了上述这些概念以后,我们就可以这样来解释 Helm:

    Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。

    helm search:查找 Charts

    Helm 自带一个强大的搜索命令,可以用来从两种来源中进行搜索:

    • helm search hubArtifact Hub 中查找并列出 helm charts。 Artifact Hub中存放了大量不同的仓库。
    • helm search repo 从你添加(使用 helm repo add)到本地 helm 客户端中的仓库中进行查找。该命令基于本地数据进行搜索,无需连接互联网。

    你可以通过运行 helm search hub 命令找到公开可用的charts:

    $ helm search hub wordpress
    URL                                                 CHART VERSION APP VERSION DESCRIPTION
    https://hub.helm.sh/charts/bitnami/wordpress        7.6.7         5.2.4       Web publishing platform for building blogs and ...
    https://hub.helm.sh/charts/presslabs/wordpress-...  v0.6.3        v0.6.3      Presslabs WordPress Operator Helm Chart
    https://hub.helm.sh/charts/presslabs/wordpress-...  v0.7.1        v0.7.1      A Helm chart for deploying a WordPress site on ...
    
    • 1
    • 2
    • 3
    • 4
    • 5

    上述命令从 Artifact Hub 中搜索所有的 wordpress charts。

    如果不进行过滤,helm search hub 命令会展示所有可用的 charts。

    使用 helm search repo 命令,你可以从你所添加的仓库中查找chart的名字。

    $ helm repo add brigade https://brigadecore.github.io/charts
    "brigade" has been added to your repositories
    $ helm search repo brigade
    NAME                          CHART VERSION APP VERSION DESCRIPTION
    brigade/brigade               1.3.2         v1.2.1      Brigade provides event-driven scripting of Kube...
    brigade/brigade-github-app    0.4.1         v0.2.1      The Brigade GitHub App, an advanced gateway for...
    brigade/brigade-github-oauth  0.2.0         v0.20.0     The legacy OAuth GitHub Gateway for Brigade
    brigade/brigade-k8s-gateway   0.1.0                     A Helm chart for Kubernetes
    brigade/brigade-project       1.0.0         v1.0.0      Create a Brigade project
    brigade/kashti                0.4.0         v0.4.0      A Helm chart for Kubernetes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Helm 搜索使用模糊字符串匹配算法,所以你可以只输入名字的一部分:

    $ helm search repo kash
    NAME            CHART VERSION APP VERSION DESCRIPTION
    brigade/kashti  0.4.0         v0.4.0      A Helm chart for Kubernetes
    
    • 1
    • 2
    • 3

    搜索是用来发现可用包的一个好办法。一旦你找到你想安装的 helm 包,你便可以通过使用 helm install 命令来安装它。

    helm install:安装一个 helm 包

    使用 helm install 命令来安装一个新的 helm 包。最简单的使用方法只需要传入两个参数:你命名的release名字和你想安装的chart的名称。

    $ helm install happy-panda bitnami/wordpress
    NAME: happy-panda
    LAST DEPLOYED: Tue Jan 26 10:27:17 2021
    NAMESPACE: default
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5

    现在wordpress chart 已经安装。注意安装chart时创建了一个新的 release 对象。上述发布被命名为 happy-panda。 (如果想让Helm生成一个名称,删除发布名称并使用--generate-name。)

    在安装过程中,helm 客户端会打印一些有用的信息,其中包括:哪些资源已经被创建,release当前的状态,以及你是否还需要执行额外的配置步骤。

    Helm按照以下顺序安装资源:

    • Namespace
    • NetworkPolicy
    • ResourceQuota
    • LimitRange
    • PodSecurityPolicy
    • PodDisruptionBudget
    • ServiceAccount
    • Secret
    • SecretList
    • ConfigMap
    • StorageClass
    • PersistentVolume
    • PersistentVolumeClaim
    • CustomResourceDefinition
    • ClusterRole
    • ClusterRoleList
    • ClusterRoleBinding
    • ClusterRoleBindingList
    • Role
    • RoleList
    • RoleBinding
    • RoleBindingList
    • Service
    • DaemonSet
    • Pod
    • ReplicationController
    • ReplicaSet
    • Deployment
    • HorizontalPodAutoscaler
    • StatefulSet
    • Job
    • CronJob
    • Ingress
    • APIService

    Helm 客户端不会等到所有资源都运行才退出。许多 charts 需要大小超过 600M 的 Docker 镜像,可能需要很长时间才能安装到集群中。

    你可以使用 helm status 来追踪 release 的状态,或是重新读取配置信息:

    $ helm status happy-panda
    NAME: happy-panda
    LAST DEPLOYED: Tue Jan 26 10:27:17 2021
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    NOTES:
    ** Please be patient while the chart is being deployed **
    
    Your WordPress site can be accessed through the following DNS name from within your cluster:
    
        happy-panda-wordpress.default.svc.cluster.local (port 80)
    
    To access your WordPress site from outside the cluster follow the steps below:
    
    1. Get the WordPress URL by running these commands:
    
      NOTE: It may take a few minutes for the LoadBalancer IP to be available.
            Watch the status with: 'kubectl get svc --namespace default -w happy-panda-wordpress'
    
       export SERVICE_IP=$(kubectl get svc --namespace default happy-panda-wordpress --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
       echo "WordPress URL: http://$SERVICE_IP/"
       echo "WordPress Admin URL: http://$SERVICE_IP/admin"
    
    2. Open a browser and access WordPress using the obtained URL.
    
    3. Login with the following credentials below to see your blog:
    
      echo Username: user
      echo Password: $(kubectl get secret --namespace default happy-panda-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    上述信息展示了 release 的当前状态。

    helm install 详解

    安装方式

    helm install 有六种不同的方式来标识需要安装的chart:

    1. 通过chart引用: helm install mymaria example/mariadb
    2. 通过chart包: helm install mynginx ./nginx-1.2.3.tgz
    3. 通过未打包chart目录的路径: helm install mynginx ./nginx
    4. 通过URL绝对路径: helm install mynginx https://example.com/charts/nginx-1.2.3.tgz
    5. 通过chart引用和仓库url: helm install --repo https://example.com/charts/ mynginx nginx
    6. 通过OCI注册中心: helm install mynginx --version 1.2.3 oci://example.com/charts/nginx
    修改配置,重写要重写chart中的值

    要重写chart中的值,使用--values参数传递一个文件或者使用’–set’参数在命令行传递配置,强制使用字符串要用--set-string。 当值本身对于命令行太长或者是动态生成的时候,可以使用-set-file 设置独立的值。也可以在命令行使用’–set-json’参数设置json值(scalars/objects/arrays)。

    通过-f参数传递的文件,安装本地已解压的 chart

    $ helm install -f myvalues.yaml myredis ./redis
    
    • 1

    –set设置的值

     helm install --set name=prod myredis ./redis
    
    • 1

    强制使用字符串

    $ helm install --set-string long_int=1234567890 myredis ./redis
    
    • 1

    使用文件

    $ helm install --set-file my_script=dothings.sh myredis ./redis
    
    • 1

    使用json

    $ helm install --set-json 'master.sidecars=[{"name":"sidecar","image":"myImage","imagePullPolicy":"Always",ports":[{"name":"portname","containerPort":1234
    
    • 1

    你可以多次指定--values / -f参数。最右侧指定的文件优先级最高。比如,如果两个文件myvalues.yaml和override.yaml 都包含名为’Test’的可以,override.yaml中的值优先:

    $ helm install -f myvalues.yaml -f override.yaml  myredis ./redis
    
    • 1

    可以指定--set参数多次,最右边的参数优先级最高,比如,barnewbar都设置了一个名为foo的可以,'newbar’的值优先:

    $ helm install --set foo=bar --set foo=newbar  myredis ./redis
    
    • 1

    类似地,下面的示例中foo被设置成了["four"]:

    $ helm install --set-json='foo=["one", "two", "three"]' --set-json='foo=["four"]' myredis ./redis
    
    • 1

    下面的示例中,foo被设置成了{"key1":"value1","key2":"bar"}

    $ helm install --set-json='foo={"key1":"value1","key2":"value2"}' --set-json='foo.key2="bar"' myredis ./redis
    
    • 1

    helm upgrade 和 helm rollback:升级 release 和失败时恢复

    当你想升级到 chart 的新版本,或是修改 release 的配置,你可以使用 helm upgrade 命令。

    一次升级操作会使用已有的 release 并根据你提供的信息对其进行升级。由于 Kubernetes 的 chart 可能会很大而且很复杂,Helm 会尝试执行最小侵入式升级。即它只会更新自上次发布以来发生了更改的内容。

    $ helm upgrade -f panda.yaml happy-panda bitnami/wordpress
    
    • 1

    在上面的例子中,happy-panda 这个 release 使用相同的 chart 进行升级,但是使用了一个新的 YAML 文件:

    mariadb.auth.username: user1
    
    • 1

    我们可以使用 helm get values 命令来看看配置值是否真的生效了:

    $ helm get values happy-panda
    mariadb:
      auth:
        username: user1
    
    • 1
    • 2
    • 3
    • 4

    helm get 是一个查看集群中 release 的有用工具。正如我们上面所看到的,panda.yaml 中的新值已经被部署到集群中了。

    现在,假如在一次发布过程中,发生了不符合预期的事情,也很容易通过 helm rollback [RELEASE] [REVISION] 命令回滚到之前的发布版本。

    $ helm rollback happy-panda 1
    
    • 1

    上面这条命令将我们的 happy-panda 回滚到了它最初的版本。release 版本其实是一个增量修订(revision)。 每当发生了一次安装、升级或回滚操作,revision 的值就会加1。第一次 revision 的值永远是1。我们可以使用 helm history [RELEASE] 命令来查看一个特定 release 的修订版本号。

    安装、升级、回滚时的有用选项

    你还可以指定一些其他有用的选项来自定义 Helm 在安装、升级、回滚期间的行为。请注意这并不是 cli 参数的完整列表。 要查看所有参数的说明,请执行 helm --help 命令。

    • --timeout:一个 Go duration 类型的值, 用来表示等待 Kubernetes 命令完成的超时时间,默认值为 5m0s
    • --wait:表示必须要等到所有的 Pods 都处于 ready 状态,PVC 都被绑定,Deployments 都至少拥有最小 ready 状态 Pods 个数(Desired减去 maxUnavailable),并且 Services 都具有 IP 地址(如果是LoadBalancer, 则为 Ingress),才会标记该 release 为成功。最长等待时间由 --timeout 值指定。如果达到超时时间,release 将被标记为 FAILED。注意:当 Deployment 的 replicas 被设置为1,但其滚动升级策略中的 maxUnavailable 没有被设置为0时,--wait 将返回就绪,因为已经满足了最小 ready Pod 数。
    • --no-hooks:不运行当前命令的钩子。
    • --recreate-pods(仅适用于 upgraderollback):这个参数会导致重建所有的 Pod(deployment中的Pod 除外)。(在 Helm 3 中已被废弃)

    ‘helm uninstall’:卸载 release

    使用 helm uninstall 命令从集群中卸载一个 release:

    $ helm uninstall happy-panda
    
    • 1

    该命令将从集群中移除指定 release。你可以通过 helm list 命令看到当前部署的所有 release:

    $ helm list
    NAME            VERSION UPDATED                         STATUS          CHART
    inky-cat        1       Wed Sep 28 12:59:46 2016        DEPLOYED        alpine-0.1.0
    
    • 1
    • 2
    • 3

    从上面的输出中,我们可以看到,happy-panda 这个 release 已经被卸载。

    在上一个 Helm 版本中,当一个 release 被删除,会保留一条删除记录。而在 Helm 3 中,删除也会移除 release 的记录。 如果你想保留删除记录,使用 helm uninstall --keep-history。使用 helm list --uninstalled 只会展示使用了 --keep-history 删除的 release。

    helm list --all 会展示 Helm 保留的所有 release 记录,包括失败或删除的条目(指定了 --keep-history):

    $  helm list --all
    NAME            VERSION UPDATED                         STATUS          CHART
    happy-panda     2       Wed Sep 28 12:47:54 2016        UNINSTALLED     wordpress-10.4.5.6.0
    inky-cat        1       Wed Sep 28 12:59:46 2016        DEPLOYED        alpine-0.1.0
    kindred-angelf  2       Tue Sep 27 16:16:10 2016        UNINSTALLED     alpine-0.1.0
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意,因为现在默认会删除 release,所以你不再能够回滚一个已经被卸载的资源了。

  • 相关阅读:
    猿创征文|HCIE-Security Day49:AC准入控制SACG
    2022/10/1——基于stm32mp157a的M4核LED灯实验
    独孤思维:副业再苦再累,请学会善待自己
    docker之常用指令
    【四】相机标定
    数据库设计步骤
    Java中什么是异常?
    【毕业设计】MPU6050姿态解算 姿态估计 - 物联网 单片机 stm32
    ElasticSearch从入门到精通:数据导入
    keep-alive动态移除缓存
  • 原文地址:https://blog.csdn.net/agonie201218/article/details/126966802