目录

    1. 为什么需要 Helm

    Kubernetes 中一个重要的设计理念就是,声明式的操作。用户通过设置系统的预期状态来改变系统。例如,现在的副本数量是 2 ,需要调整为 3。声明式的处理方式是,修改配置文件中副本数量为 3 ;命令式的处理方式是,发送增加一个副本的命令,+1。

    使用申明式配置的系统更关注结果,对系统设计要求更高。在分布式系统中,任何组件都不是 100 % 可靠的,对使用者来说,声明式配置的系统更加友好。

    Kubernetes 采用 yaml 作为配置文件。在 Kubernetes 中部署一个简单的 Jenkins 服务,就得写两个 yaml 文件: jenkins-deployment.yaml 和 jenkins-service.yaml。参考,Kubectl 部署 Jenkins 。再加上其他服务,考虑到多套环境,需要维护的 yaml 文件数量会很大。

    直接维护 yaml,进行部署 ,既不利于项目组织,也不利于维护更新。我们需要一个工具简化应用部署和管理流程。

    2. 什么是 Helm

    Helm 是 Deis 发起的一个 Kubernetes 包管理器,类似于 Linux 中的 apt 和 yum 工具。Deis 公司已经被微软收购。

    2.1 基本概念

    • Chart

    Chart 用来封装 yaml 文件,包含了运行应用所需的镜像、依赖、资源、服务定义等。

    • Release

    Chart 在 Kubernetes 集群上的实例。每次安装都会创建一个新的 Release ,一个 Chart 可以对应很多个实例。

    • Repository

    用于发布和存储 Chart 的仓库。

    2.2 基本组件

    Helm 采用 C/S 架构,组件有:

    • Helm CLI

    Helm CLI 是 Helm 客户端,运行在本地,负责与其他组件的交互。

    • Tiller

    Tiller 是服务器端组件,运行在 Kubernetes 集群上,用于管理 Helm 部署的应用。

    • Repository

    Repository 是 Chart 仓库。

    2.3 Helm 提供的功能

    • 应用打包
    • 应用分发
    • 版本管理
    • 依赖检查

    3. Chart

    通过创建特定目录结构的文件夹,chart 描述了一组应用资源,用于指导应用部署。

    Wordpress 的 chart 包结构:

    Wordpress/
      Chart.yaml          # Yaml文件,用于描述 Chart 的基本信息,包括名称版本等
      LICENSE             # [可选] 文本格式的协议
      README.md           # [可选] 应用介绍、使用说明
      requirements.yaml   # [可选] 用于存放当前 Chart 依赖的其它 Chart 的说明文件
      values.yaml         # Chart 的默认值配置文件
      charts/             # [可选] 该目录中放置当前 Chart 依赖的其它 Chart
      templates/          # [可选] 部署文件模版目录,模版填入 values.yaml 中相应值,生成最终的 kubernetes 配置文件
      templates/NOTES.txt # [可选] 使用指南
    

    Chart.yaml 文件内容:

    apiVersion: [必须] Chart API 版本,可用值 v1
    name: [必须] Chart 名称
    version: [必须] 版本,遵循 [SemVer 2 标准](https://semver.org/)
    kubeVersion: [可选] 兼容的 Kubernetes 版本,遵循 [SemVer 2 标准](https://semver.org/)
    description: [可选] 一句话的应用描述
    keywords:
      - [可选] 应用关键字列表
    home: [可选] 应用主页 URL
    sources:
      - [可选] 当前应用下载地址列表
    maintainers: [可选]
      - name: [必须] name 
        email: [可选] email
        url: [可选] url
    engine: [可选] 模板引擎,默认值是 gotpl
    icon: [可选] SVG 或者 PNG 格式的图片地址
    appVersion: [可选] 应用版本
    deprecated: [可选] boolean 类型,是否不建议使用
    tillerVersion: [可选] Chart 需要的 Tiller 版本,遵循 [SemVer 2 标准](https://semver.org/),需要 ">2.0.0"
    

    4. 安装和使用

    由于 Helm 采用的是 C/S 架构,安装分为两部分: 客户端和服务器。不同操作系统,具体命令会有所不同,可以参考 Helm 官方指导文档。这里以 OS X 客户端和 CentOS 服务端 minikube 为例。

    4.1 客户端安装

    OS X 执行:

    brew install kubernetes-helm
    

    CentOS 执行:

    wget https://storage.googleapis.com/kubernetes-helm/helm-v2.12.2-linux-amd64.tar.gz
    tar -zxvf helm-v2.12.2-linux-amd64.tar.gz
    mv linux-amd64/helm /usr/local/bin/helm
    

    查看镜像源:

    helm repo list
    NAME      URL
    stable    https://kubernetes-charts.storage.googleapis.com
    local     http://127.0.0.1:8879/charts
    

    建议更新镜像源,下面以 azure 为例:

    helm repo add stable http://mirror.azure.cn/kubernetes/charts/
    "stable" has been added to your repositories
    helm repo add incubator http://mirror.azure.cn/kubernetes/charts-incubator/
    "incubator" has been added to your repositories
    

    4.2 服务端安装

    • 安装 tiller

    由于配置了远程开发环境(参考: 搭建远程 Kubernetes 开发环境),在 OS X 上执行:

    helm init --history-max 200
    Creating /Users/username/.helm/repository/repositories.yaml
    Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
    Adding local repo with URL: http://127.0.0.1:8879/charts
    $HELM_HOME has been configured at /Users/username/.helm.
    
    Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
    
    Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
    To prevent this, run `helm init` with the --tiller-tls-verify flag.
    For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
    

    tiller 将被安装到 kube-system 空间中,可以通过 kubectl get pods --namespace kube-system 命令查看。

    • 创建访问角色

    执行命令:

    kubectl create serviceaccount --namespace kube-system tiller
    kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
    kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}' 
    

    4.3 查看 Helm 是否可用

    执行 helm version 命令时,会检查本地和服务器安装是否就绪。

    helm version
    helm  version
    Client: &version.Version{SemVer:"v2.14.2", GitCommit:"a8b13cc5ab6a7dbef0a58f5061bcc7c0c61598e7", GitTreeState:"clean"}
    Server: &version.Version{SemVer:"v2.14.2", GitCommit:"a8b13cc5ab6a7dbef0a58f5061bcc7c0c61598e7", GitTreeState:"clean"}
    

    如果 Server 端报错,可能是由于 Node 节点上缺失某些包导致,例如,socat 。需要登录服务器,执行 yum install -y socat

    4.4 创建一个 Chart 部署

    • 新建一个 chart
    helm create hello-chart
    Creating hello-chart
    

    在 values.yaml 中,可以看到,默认创建的是一个 Nginx 应用。为了方便外网访问测试,将 values.yaml 中 service 的属性修改为:

    service:
      type: NodePort
      port: 30003
    
    • 部署到服务器
    helm install ./hello-chart
    NAME:   alert-koala
    LAST DEPLOYED: Wed Jul 24 14:21:58 2019
    NAMESPACE: default
    STATUS: DEPLOYED
    
    RESOURCES:
    ==> v1/Deployment
    NAME                     READY  UP-TO-DATE  AVAILABLE  AGE
    alert-koala-hello-chart  0/1    1           0          1s
    
    ==> v1/Pod(related)
    NAME                                      READY  STATUS   RESTARTS  AGE
    alert-koala-hello-chart-86cdd48bfc-b9dqv  0/1    Running  0         1s
    
    ==> v1/Service
    NAME                     TYPE      CLUSTER-IP     EXTERNAL-IP  PORT(S)          AGE
    alert-koala-hello-chart  NodePort  10.10.10.10  <none>       30003:32046/TCP  1s
    
    • 查看部署应用

    稍等几秒,应用就运行起来了。打开地址: http://10.10.10:32046 ,即可看到 Nginx 的页面。

    • 查看 release
    helm list
    helm list
    NAME           REVISION    UPDATED                     STATUS      CHART                APP VERSION    NAMESPACE
    alert-koala    1           Wed Jul 24 14:21:58 2019    DEPLOYED    hello-chart-0.1.0    1.0            default
    
    • 打包 chart
    helm package hello-chart
    helm package hello-chart
    Successfully packaged chart and saved it to: /Users/username/Code/Kubernetes/hello-chart-0.1.0.tgz
    

    注意,需要在 hello-chart 所在上一级目录执行。打包就是压缩 hello-chart 文件夹为一个 tgz 文件。

    • 删除 release:
    helm delete alert-koala --purge
    release "alert-koala" deleted
    

    删除之后,应用也就被移除。

    5. 参考