学习目标

  • 使用Helm简单的部署Kubernetes的deployment
  • 了解Chart模板是怎样描述应用应该如何部署的
  • 讨论Tiller是怎样技术Chart创建Deployment的
  • 在集群中初始化一个Helm

1. 简介

我们使用了Kubernetes工具来部署简单的Docker应用程序。从v1.4版本开始,我们的目标是为软件提供一个标准的规范。Helm类似于yumapt这样的包管理器,Chart类似于包。而Helm v3与v2有着显著的不同。 典型的容器化应用程序会包含很多清单。Deployment、Service和ConfigMap的清单。我们可能还会创建一些Secret、Ingress和其他对象。每一个都需要一份清单。 有了Helm,你可以打包所有这些清单文件,并使它们作为一个单独的tar包使用。我们可以将tar包放在一个存储库中,搜索该存储库,发现一个应用程序,然后使用一个命令部署并启动整个应用程序。 服务器运行在Kubernetes集群中,而客户机是本地的,甚至是本地笔记本电脑。使用客户机,您可以连接到多个应用程序存储库。 我们还可以从命令行轻松地升级或回滚应用程序。

2. Helm的两个版本

2.1. Helm v2和Tiller

helm工具使用一系列YAML文件将Kubernetes应用程序打包成一个chart或包。这中方式允许用户之间简单的共享,使用模板方案进行优化,以及来源跟踪等。

zgxbwiuexxtg-BasicFlow-HelmandTiller

基础的Helm和Tiller的流程

Helm的v2版本是由两个组件构成的

  • 服务器端叫Tiller,运行在kubernetes集群之中
  • 客户端叫Helm,在我们本地的机器上运行

Helm v2会在集群中部署一个Tiller的pod。这样会引发很多安全和集群权限的问题。而Helm v3就不用部署这个pod了.

使用Helm客户端,您可以浏览包存储库(包含已发布的Chart),并在Kubernetes集群上部署这些Chart。kubernetes将下载Chart并将请求传递给Tiller来创建应用。这个应用是由运行在Kubernetes集群中的各种资源组成。

2.2. Helm v3

最近Helm彻底的翻修了一遍,流程和命令都有很大的改变。如果我们正在使用Helm的v2版本,那么可能需要花些时间去升级和集成这些改变。

最显著的变化之一就是Tiller的移除。这是一个一直存在的安全问题,因为pod需要提升权限才能部署Chart。在新版本中,这个功能被单独放在了命令行中,不再需要初始化才能使用。

在v2中,对chart和deployment的更新需要使用双向策略合并来完成。这需要将先前的manifest和预期的menifest进行比较,而不是在helm命令之外进行编辑。目前的检查是使用另外的方法,检查目前对象的状态。

还有其他的改变,比如软件安装不再自动生成名称。我们必须手动指定名称,要不就传递--generated name参数

3. Chart

3.1. Chart中的内容

Chart是组成分布式应用程序的Kubernetes资源清单的存档集,您可以从Helm 3文档中了解更多信息。我们还可以使用其他的方式轻松地创建,例如由供应商提供软件。Chart类似于独立的yum存储库的使用。

├── Chart.yaml ├── README.md ├── templates │ ├── NOTES.txt │ ├── _helpers.tpl │ ├── configmap.yaml │ ├── deployment.yaml │ ├── pvc.yaml │ ├── secrets.yaml │ └── svc.yaml └── values.yaml

  • Chart.yaml

Chart.yaml文件包含很多Chart的元数据,比如name, version, keywords等等

  • values.yaml

values.yaml文件包含了k-v,用来生成集群中的某个release。这些值会被资源清单中的值所替代,他使用的是Go的模板语法。

  • templates

templates文件夹包含了创建这个MariaDB应用所需的所有的清单文件

3.2. 模板

模板是使用Go模板化语法的资源清单。例如,在values文件中定义的变量在创建发布时被注入到模板中。在我们提供的MariaDB示例中,数据库密码存储在Kubernetes secret中,数据库配置存储在Kubernetes ConfigMap中。

我们可以看到,在Secret metadat中使用chart名称、Release名称等定义了一组标签。而实际的值都是来自于values.yaml文件。

apiVersion: v1
kind: Secret
metadata:
    name: 
    labels:
        app: 
        chart: "-"
        release: ""
        heritage: ""
type: Opaque
data:
    mariadb-root-password: 
    mariadb-password: 

4. 初始化Helm v2

Helm v3是不需要执行这个操作的

我们可以从源代码中构建Helm,或者下载tar包。我们希望很快能看到稳定版本的Linux包(yum或者apt)。当前部署helm的RBAC安全需求需要创建一个新的serviceaccount,并分配权限和角色。有几个可选的设置可以传递给helm init命令,通常是针对特定的安全问题、存储选项和试运行选项。

$ helm init
...
Tiller (the helm server side component) has been installed into your Kubernetes Cluster.
Happy Helming!

$ kubectl get deployments --namespace=kube-system
NAMESPACE    NAME           READY  UP-TO-DATE  AVAILABLE  AGE
kube-system  tiller-deploy  1/1    1           1          15s

helm v2在初始化的过程当中会在集群当中创建一个叫做tiller-deploy的pod。这个会在kube-system的名称空间中创建一个deployment

客户端需要通过pod转发和tiller的pod进行通信。因此,我们不会看到任何的service来暴露tiller

4.1. Chart的仓库

初始化helm时包含默认存储库,但添加其他存储库是常见的。存储库目前是简单的HTTP服务器,包含一个索引文件和所有Chart的tar包。

您可以使用helm repo命令与存储库交互。

$ helm repo add testing http://storage.googleapis.com/kubernetes-charts-testing

$ helm repo list
NAME URL
stable http://storage.googleapis.com/kubernetes-charts
local http://localhost:8879/charts
testing http://storage.googleapis.com/kubernetes-charts...

一旦仓库是可用的,我们就可以使用关键字来搜索Chart。下面我们来搜索redis的Chart

$ helm search redis
WARNING: Deprecated index file format. Try 'helm repo update'
NAME                     VERSION DESCRIPTION
testing/redis-cluster    0.0.5   Highly available Redis cluster with multiple se...
testing/redis-standalone 0.0.1   Standalone Redis Master testing/...

如果我们在仓库中找到对应的Chart,我们就可以部署了。

4.2. Deploying a Chart

要部署Chart,只需使用helm install命令。安装成功可能需要几个资源,例如与chart PVC匹配的可用pv。目前,发现哪些资源需要存在的唯一方法是读取每个图表的READMEs

$ helm install testing/redis-standalone
Fetched testing/redis-standalone to redis-standalone-0.0.1.tgz
amber-eel
Last Deployed: Fri Oct 21 12:24:01 2016
Namespace: default
Status: DEPLOYED

Resources:
==> v1/ReplicationController
NAME             DESIRED CURRENT READY AGE
redis-standalone 1       1       0     1s

==> v1/Service
NAME  CLUSTER-IP EXTERNAL-IP PORT(S)  AGE
redis 10.0.81.67 <none>      6379/TCP 0s

我们还可以列出可用版本,删除,或者升级和回滚

$ helm list
NAME      REVISION UPDATED                  STATUS   CHART
amber-eel 1        Fri Oct 21 12:24:01 2016 DEPLOYED redis-standalone-0.0.1

系统将为部署的每个helm实例创建一个独特的、多样的名称。您还可以使用kubectl查看集群中创建的新资源Helm。

应仔细审查部署的结果。它通常包含有关访问内部应用程序的信息。如果集群中没有所需的集群,则输出通常是开始故障排除的第一步。