一、helm简介

很多人都使用过Ubuntu下的ap-get或者CentOS下的yum,这两者都是Linux系统下的包管理工具。采用apt-get/yum,应用开发者可以管理应用包之间的依赖关系,发布应用,用户则可以以简单的方式查找、安装、升级、卸载应用程序。

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

对于应用发布者而言,可以通过Helm打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。

对于使用者而言,使用Helm后不用需要了解Kubernetes的Yaml语法并编写应用部署文件,可以通过Helm下载并在kubernetes上安装需要的应用。

除此以外,Helm还提供了kubernetes上的软件部署,删除,升级,回滚应用的强大功能。

 

二、Helm组件及相关术语

Helm

Helm 是一个命令行下的客户端工具。主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。

Tiller

Tiller 是 Helm 的服务端,部署在 Kubernetes 集群中。Tiller 用于接收 Helm 的请求,并根据 Chart 生成 Kubernetes 的部署文件( Helm 称为 Release ),然后提交给 Kubernetes 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能

Chart

Helm 的软件包,采用 TAR 格式。类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件。

Repoistory

Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。

Release

使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。

注:需要注意的是:Helm 中提到的 Release 和我们通常概念中的版本有所不同,这里的 Release 可以理解为 Helm 使用 Chart 包部署的一个应用实例。

 

三、Helm工作原理

 

Chart Install 过程

    Helm从指定的目录或者tgz文件中解析出Chart结构信息
    Helm将指定的Chart结构和Values信息通过gRPC传递给Tiller
    Tiller根据Chart和Values生成一个Release
    Tiller将Release发送给Kubernetes用于生成Release

Chart Update过程

    Helm从指定的目录或者tgz文件中解析出Chart结构信息
    Helm将要更新的Release的名称和Chart结构,Values信息传递给Tiller
    Tiller生成Release并更新指定名称的Release的History
    Tiller将Release发送给Kubernetes用于更新Release

Chart Rollback过程

    Helm将要回滚的Release的名称传递给Tiller
    Tiller根据Release的名称查找History
    Tiller从History中获取上一个Release
    Tiller将上一个Release发送给Kubernetes用于替换当前Release
 

四、安装配置Helm

安装helm

仓库地址:
https://github.com/helm/helm/releases
#根据需要下载对应版本
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.14.3-linux-amd64.tar.gz
tar zxf helm-v2.14.3-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/
#helm使用方法
helm help

为Tiller配置授权帐号

cat << EOF > tiller.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system
EOF
kubectl apply -f tiller.yaml

安装服务端Tiller

helm init --service-account tiller -i registry.aliyuncs.com/google_containers/tiller:v2.14.3 --skip-refresh

helm初始化默认使用gcr.io源,由于国内正常无法访问,所以这里使了用阿里源。
注意tiller版本要和helm版本相同。

验证Tiller是否运行

[root@master1 ~]# kubectl get pods -n kube-system -l name=tiller                    
NAME                            READY   STATUS    RESTARTS   AGE
tiller-deploy-96f5d9ff4-ctswl   1/1     Running   0   

五、使用helm

1)更换仓库

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

# 先移除原先的仓库
helm repo remove stable
# 添加新的仓库地址
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 更新仓库
helm repo update

2)查看在存储库中可用的所有 Helm charts

[root@master1 ingress-nginx]# helm search
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.2.8           v4.5.0.5                        A Helm chart for Aerospike in Kubernetes                    
stable/airflow                          4.0.7           1.10.4                          Airflow is a platform to programmatically author, schedul...
stable/ambassador                       3.3.2           0.76.0                          A Helm chart for Datawire Ambassador                        
stable/anchore-engine                   1.2.1           0.4.2                           Anchore container analysis and policy evaluation engine s...
stable/apm-server                       2.1.4           7.0.0                           The server receives data from the Elastic APM agents and ...
stable/ark                              4.2.2           0.10.2                          DEPRECATED A Helm chart for ark                             
...

3)更新charts列表

helm repo update

4)安装charts

安装Nginx Ingress controller,安装的k8s集群启用了RBAC,则一定要加rbac.create=true参数.

helm install stable/nginx-ingress --set controller.hostNetwork=true,rbac.create=true

Monocular是一个开源软件,用于管理kubernetes上以Helm Charts形式创建的服务,可以通过它的web页面来安装helm Charts.

# 添加新的源
helm repo add monocular https://kubernetes-helm.github.io/monocular
# 安装
helm install monocular/monocular -f custom-repos.yaml

 
# custom-repos.yaml 内容
 
api:
  config:
    repos:
      - name: stable
        url: https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts
        source: https://github.com/kubernetes/charts/tree/master/stable
      - name: incubator
        url: https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator
        source: https://github.com/kubernetes/charts/tree/master/incubator
      - name: monocular
        url: https://kubernetes-helm.github.io/monocular
        source: https://github.com/kubernetes-helm/monocular/tree/master/charts

5)查看K8S中已安装的charts

helm list
 
NAME                REVISION    UPDATED                     STATUS      CHART               NAMESPACE
amber-seal          1           Mon Jul  2 17:29:25 2018    DEPLOYED    nginx-ingress-0.9.5 default  
my-release          1           Mon Jul  2 15:19:44 2018    DEPLOYED    spark-0.1.10        default  
nonplussed-panther  1           Mon Jul  2 17:27:41 2018    FAILED      nginx-ingress-0.9.5 default  
turbulent-tuatara   1           Mon Jul  2 17:31:33 2018    DEPLOYED    monocular-0.6.2     default

6)删除安装的charts

# 删除:helm delete xxx
helm delete amber-seal

7)查看charts详细信息

helm inspect chartname

8)release操作

#查看当前集群中部署的release
helm list
#查看release的状态
helm status releasename
#查看release历史版本
helm history releasename
#升级release
helm upgrade releasename chartname 选项
#回滚release
helm rollback releasename 版本号 选项
#删除release
helm delete releasename 选项

六、Helm Chart 结构

Chart 目录结构

examples/
  Chart.yaml          # Yaml文件,用于描述Chart的基本信息,包括名称版本等
  LICENSE             # [可选] 协议
  README.md           # [可选] 当前Chart的介绍
  values.yaml         # Chart的默认配置文件
  requirements.yaml   # [可选] 用于存放当前Chart依赖的其它Chart的说明文件
  charts/             # [可选]: 该目录中放置当前Chart依赖的其它Chart
  templates/          # [可选]: 部署文件模版目录,模版使用的值来自values.yaml和由Tiller提供的值
  templates/NOTES.txt # [可选]: 放置Chart的使用指南

Chart.yaml 文件

name: [必须] Chart的名称
version: [必须] Chart的版本号,版本号必须符合 SemVer 2:http://semver.org/
description: [可选] Chart的简要描述
keywords:
  -  [可选] 关键字列表
home: [可选] 项目地址
sources:
  - [可选] 当前Chart的下载地址列表
maintainers: # [可选]
  - name: [必须] 名字
    email: [可选] 邮箱
engine: gotpl # [可选] 模版引擎,默认值是gotpl
icon: [可选] 一个SVG或PNG格式的图片地址

requirements.yaml 和 charts目录

dependencies:
  - name: example
    version: 1.2.3
    repository: http://example.com/charts
  - name: Chart名称
    version: Chart版本
    repository: 该Chart所在的仓库地址

Chart支持两种方式表示依赖关系,可以使用requirements.yaml或者直接将依赖的Chart放置到charts目录中。

templates 目录

templates目录中存放了Kubernetes部署文件的模版。

# db.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: deis-database
  namespace: deis
  labels:
    heritage: deis
spec:
  replicas: 1
  selector:
    app: deis-database
  template:
    metadata:
      labels:
        app: deis-database
    spec:
      serviceAccount: deis-database
      containers:
        - name: deis-database
          image: {{.Values.imageRegistry}}/postgres:{{.Values.dockerTag}}
          imagePullPolicy: {{.Values.pullPolicy}}
          ports:
            - containerPort: 5432
          env:
            - name: DATABASE_STORAGE
              value: {{default "minio" .Values.storage}}

模版语法扩展了 golang/text/template的语法

# 这种方式定义的模版,会去除test模版尾部所有的空行
{{- define "test"}}
模版内容
{{- end}}
 
# 去除test模版头部的第一个空行
{{- template "test" }}

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐