T O P

[资源分享]     Kubernetes笔记(10) - Helm

  • By - 楼主

  • 2021-07-17 12:02:29
  • Kubernetes笔记(10) - Helm

    应用微服务化后虽然便于部署和扩展,实现了敏捷开发和运维,但另一方面,在将单体应用微服务化后,往往又导致了应用管理复杂度的增加,例如,在Kubernetes系统之上,每个应用基本上都有着不止一个资源,而每个应用又有不同的环境(如qa、test和prod等),这会使得配置清单数量变得非常多而且维护起来非常复杂,而借助Helm可以简化资源的管理。

    Helm基础

    简单来说,Helm就是Kubernetes的应用程序包管理器,类似于Linux系统之上的yum或apt-get等,可用于实现帮助用户查找、分享及使用Kubernetes应用程序。
    Helm将Kubernetes应用的相关配置组织为Charts,并通过它完成应用的常规管理操作。通常来说,使用Charts管理应用的流程包括从0开始创建Charts、将Charts及其相关的文件打包为归档格式、将Charts存储于仓库(repository)中并与之交互、在Kubernetes集群中安装或卸载Charts以及管理经Helm安装的应用的版本发行周期。

    Helm的核心术语

    • Charts:即一个Helm程序包,它包含了运行一个Kubernetes应用所需要的镜像、依赖关系和资源定义等,必要时还会包含Service的定义;它类似于APT的dpkg文件或者yum的rpm文件;
    • Repository:Charts仓库,用于集中存储和分发Charts;
    • Config:应用程序实例化安装运行时使用的配置信息;
    • Release:应用程序实例化配置后运行于Kubernetes集群中的一个Charts实例;在同一个集群上,一个Charts可以使用不同的Config重复安装多次,每次安装都会创建一个新的Release。

    Helm架构

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

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

    安装Helm

    Helm的源码位于https://github.com/helm/helm,根据文档,mac可直接使用brew安装:

    ~ brew install helm
    ~ helm version
    

    需要注意的是,Helm的运行依赖于本地安装并配置完成的kubectl方能与运行于Kubernetes集群之上的Tiller服务器进行通信,因此,运行Helm的节点也应该是可以正常使用kubectl命令的主机。
    对于version 3+的版本来说,helm的安装已经完成了,如果是较低的版本,还需要进一步安装
    tiller server。

    安装Helm chart

    首先设置chart仓库指向ArtifactHUB:

    helm repo add bitnami https://charts.bitnami.com/bitnami
    

    对应的网址为https://artifacthub.io/

    Redis Chart使用示例

    搜索redis

    helm repo update
    helm search repo redis
    

    安装,不指定实例名称时必须使用--generate-name

    helm install bitnami/redis  --generate-name
    或
    helm install redis-test bitnami/redis
    

    安装完成后会有类似这样的提示:

    NAME: redis-1625445720
    LAST DEPLOYED: Mon Jul  5 08:42:05 2021
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    

    此外还有详细的使用提示:

    Redis(TM) can be accessed on the following DNS names from within your cluster:
    
        redis-1625531591-master.default.svc.cluster.local for read/write operations (port 6379)
        redis-1625531591-replicas.default.svc.cluster.local for read-only operations (port 6379)
    
    
    
    To get your password run:
    
        export REDIS_PASSWORD=$(kubectl get secret --namespace default redis-1625531591 -o jsonpath="{.data.redis-password}" | base64 --decode)
    
    To connect to your Redis(TM) server:
    
    1. Run a Redis(TM) pod that you can use as a client:
    
       kubectl run --namespace default redis-client --restart='Never'  --env REDIS_PASSWORD=$REDIS_PASSWORD  --image docker.io/bitnami/redis:6.2.4-debian-10-r13 --command -- sleep infinity
    
       Use the following command to attach to the pod:
    
       kubectl exec --tty -i redis-client \
       --namespace default -- bash
    
    2. Connect using the Redis(TM) CLI:
       redis-cli -h redis-1625531591-master -a $REDIS_PASSWORD
       redis-cli -h redis-1625531591-replicas -a $REDIS_PASSWORD
    
    To connect to your database from outside the cluster execute the following commands:
    
        kubectl port-forward --namespace default svc/redis-1625531591-master 6379:6379 &
        redis-cli -h 127.0.0.1 -p 6379 -a $REDIS_PASSWORD
    

    删除部署的chart:

    heml delete <release name>
    

    Helm Charts

    Charts是Helm使用的Kubernetes程序包打包格式,一个Charts就是一个描述一组Kubernetes资源的文件的集合。

    Charts文件组织结构

    一个Charts就是按特定格式组织的目录结构,目录名即为Charts名
    使用helm pull bitnami/redis --untar下载redis chart并解压到当前目录,内容如下

    ~ ls    
    Chart.lock         charts             templates
    Chart.yaml         ci                 values.schema.json
    README.md          img                values.yaml
    

    它们各自的作用为:

    • Chart.yaml:当前Charts的描述信息
    • LICENSE:当前Charts的许可证信息,纯文本文件,可选
    • README.md:可选
    • values.yaml:当前Charts用到的默认配置值
    • charts/:目录,存放当前Charts依赖到的所有Charts文件
    • templates/:目录,存放当前Charts用到的模板文件,可应用于Charts生成有效的Kubernetes清单文件
    • templates/NOTES.txt:纯文本文件,Templates简单使用注解。

    Chart.yaml文件组织格式

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

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

    Template

    Helm Charts模板(template)遵循Go模板语言格式,位于templates文件夹,在当前Charts被Helm引用时,此目录中的所有模板文件都会传递给模板引擎进行处理。
    模板文件中用到的值(value)有如下两种提供方式。

    • 通过Charts的values.yaml文件提供,通常用于提供默认值。
    • 在运行“helm install”命令时传递包含所需要的自定义值的YAML文件, 会覆盖默认值。
    学习资料

    《Kubernetes实战进阶》 马永亮著

    本帖子中包含资源

    您需要 登录 才可以下载,没有帐号?立即注册