使用Helm

本指南解释了使用Helm(和Tiller)来管理Kubernetes群集上的软件包的基础知识。 它假定您已经安装了Helm客户端和Tiller服务器(通常是helm init)

三大理念

Chart是helm包,它包含在Kubernetes集群内部运行应用程序,工具或服务所需的所有资源定义。 可以把它想象成一个Homebrew公式,一个Apt dpkg或一个Yum RPM文件的Kubernetes等价物。

存储库是可以收集和共享Chart的地方。 这就像Perl的CPAN档案或Fedora软件包数据库,对于Kubernetes来说是软件包。

Release是发布在k8s集群中运行的chart的实例.一个chart通常可以多次安装到同一个集群中.每次安装都会创建一个新版本.例如一个mysql chart。如果你想在集群运行两个数据库实例,则可以安装该chart两次.每个实例都有自己的release,而每个release又都有属于自己的release名。

记住这些概念后,我们现在可以像这样解释Helm:

Helm将chart安装到Kubernetes中,为每个安装创建一个新版本。 要找到新的chart,您可以搜索Helm chart存储库。

‘HELM SEARCH’: 查找chart

首次安装Helm时,它已预配置为与官方Kubernetes chart存储库交互。 该存储库包含许多精心策划和维护的chart。 此图库在默认情况下被命名为stable。

您可以通过运行helm search来查看哪些图表可用

  1. $ helm search
  2. NAME VERSION DESCRIPTION
  3. stable/drupal 0.3.2 One of the most versatile open source content m...
  4. stable/jenkins 0.1.0 A Jenkins Helm chart for Kubernetes.
  5. stable/mariadb 0.5.1 Chart for MariaDB
  6. stable/mysql 0.1.0 Chart for MySQL
  7. ...

上面的命令没有过滤, helm search会将所有可用的chart列出来.你可以使用过滤器来缩小搜索范围:

  1. $ helm search mysql
  2. NAME VERSION DESCRIPTION
  3. stable/mysql 0.1.0 Chart for MySQL
  4. stable/mariadb 0.5.1 Chart for MariaDB

现在您只会看到与您的过滤器匹配的结果。

为什么mariadb在列表中? 因为它的包描述与MySQL相关。 我们可以使用helm inspect chart来看这个chart的详情:

  1. $ helm inspect stable/mariadb
  2. Fetched stable/mariadb to mariadb-0.5.1.tgz
  3. description: Chart for MariaDB
  4. engine: gotpl
  5. home: https://mariadb.org
  6. keywords:
  7. - mariadb
  8. - mysql
  9. - database
  10. - sql
  11. ...

搜索是找到可用软件包的好方法。 一旦找到想要安装的软件包,可以使用helm install来安装它。

‘HELM INSTALL’ 安装包

要安装新软件包,请使用helm install命令。 最简单的,它只需要一个参数:chart的名称。

  1. $ helm install stable/mariadb
  2. Fetched stable/mariadb-0.3.0 to /Users/mattbutcher/Code/Go/src/k8s.io/helm/mariadb-0.3.0.tgz
  3. happy-panda
  4. Last Deployed: Wed Sep 28 12:32:28 2016
  5. Namespace: default
  6. Status: DEPLOYED
  7. Resources:
  8. ==> extensions/Deployment
  9. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  10. happy-panda-mariadb 1 0 0 0 1s
  11. ==> v1/Secret
  12. NAME TYPE DATA AGE
  13. happy-panda-mariadb Opaque 2 1s
  14. ==> v1/Service
  15. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  16. happy-panda-mariadb 10.0.0.70 <none> 3306/TCP 1s
  17. Notes:
  18. MariaDB can be accessed via port 3306 on the following DNS name from within your cluster:
  19. happy-panda-mariadb.default.svc.cluster.local
  20. To connect to your database run the following command:
  21. kubectl run happy-panda-mariadb-client --rm --tty -i --image bitnami/mariadb --command -- mysql -h happy-panda-mariadb

现在安装了mariadb chart。 请注意,安装chart会创建一个新版本对象。 上面的版本被命名为happy-panda。 (如果你想使用你自己的版本名称,只需在helm install上使用—name标志。)

在安装过程中,helm客户端将打印有关创建哪些资源的有用信息,该版本的状态以及是否可以或应该采取其他配置步骤。

Helm不会等到所有资源都在运行之后才运行。 许多chart需要大小超过600M的Docker映像,并且可能需要很长时间才能安装到群集中。

要跟踪release状态或重新读取配置信息,可以使用helm status:

  1. $ helm status happy-panda
  2. Last Deployed: Wed Sep 28 12:32:28 2016
  3. Namespace: default
  4. Status: DEPLOYED
  5. Resources:
  6. ==> v1/Service
  7. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  8. happy-panda-mariadb 10.0.0.70 <none> 3306/TCP 4m
  9. ==> extensions/Deployment
  10. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  11. happy-panda-mariadb 1 1 1 1 4m
  12. ==> v1/Secret
  13. NAME TYPE DATA AGE
  14. happy-panda-mariadb Opaque 2 4m
  15. Notes:
  16. MariaDB can be accessed via port 3306 on the following DNS name from within your cluster:
  17. happy-panda-mariadb.default.svc.cluster.local
  18. To connect to your database run the following command:
  19. kubectl run happy-panda-mariadb-client --rm --tty -i --image bitnami/mariadb --command -- mysql -h happy-panda-mariadb

以上显示了你的release的当前状态。

在安装之前自定义chart

上面的方式安装只能使用默认配置,但是很多时候你需要自定义chart的配置来安装.

要查看chart的可配置选项,你可以使用helm inspect value:

  1. helm inspect values stable/mariadb
  2. Fetched stable/mariadb-0.3.0.tgz to /Users/mattbutcher/Code/Go/src/k8s.io/helm/mariadb-0.3.0.tgz
  3. ## Bitnami MariaDB image version
  4. ## ref: https://hub.docker.com/r/bitnami/mariadb/tags/
  5. ##
  6. ## Default: none
  7. imageTag: 10.1.14-r3
  8. ## Specify a imagePullPolicy
  9. ## Default to 'Always' if imageTag is 'latest', else set to 'IfNotPresent'
  10. ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
  11. ##
  12. # imagePullPolicy:
  13. ## Specify password for root user
  14. ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#setting-the-root-password-on-first-run
  15. ##
  16. # mariadbRootPassword:
  17. ## Create a database user
  18. ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#creating-a-database-user-on-first-run
  19. ##
  20. # mariadbUser:
  21. # mariadbPassword:
  22. ## Create a database
  23. ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#creating-a-database-on-first-run
  24. ##
  25. # mariadbDatabase:

然后,您可以在YAML格式的文件中覆盖这些设置,然后在安装过程中传递该文件。

  1. $ echo '{mariadbUser: user0, mariadbDatabase: user0db}' > config.yaml
  2. $ helm install -f config.yaml stable/mariadb

以上将创建一个名为user0的默认MariaDB用户,并授予此用户对新创建的user0db数据库的访问权限,但将接受该chart的所有其他默认值。

在安装过程中有两种方式传递配置数据:

  • —values(或者-f): 用覆盖指定一个YAML文件。 这可以指定多次,最右边的文件优先级更高
  • —set: 在命令行上指定覆盖

如果两者都被使用,—set和—values值合并,并且—set的值有更高的优先级。 使用—set指定的覆盖将保存在配置chart中。 对于给定版本的helm,可以查看已经被设置为—set的值获取值。 通过使用指定的—reset-values运行helm upgrade,可以清除已设置的值。

—set的格式和限制

—set选项使用零个或多个name/value对。 最简单的就是这样使用:—set name = value。 YAML的等价物是:

  1. name: value

多个值由,分隔。 所以—set a = b,c = d变成:

  1. a: b
  2. c: d

支持更复杂的表达式。 例如,—set outer.inner = value被翻译为:

  1. outer:
  2. inner: value

列表可以通过在{和}中包含值来表示。 例如,—set name = {a,b,c}转换为:

  1. name:
  2. - a
  3. - b
  4. - c

从Helm 2.5.0开始,可以使用数组索引语法访问列表项。 例如,—set servers [0] .port = 80变成:

  1. servers:
  2. - port: 80

可以通过这种方式设置多个值。 line —set servers [0] .port = 80,servers [0] .host = example变成:

  1. servers:
  2. - port: 80
  3. host: example

有时你需要在你的—set行中使用特殊字符。 您可以使用反斜杠来转义字符; —set name = value1 \,value2将变为:

  1. name: "value1,value2"

同样,您也可以转义点序列,当图表使用toYaml函数解析注释,标签和节点选择器时可能会派上用场。 —set nodeSelector。“kubernetes \ .io / role”= master的语法变为:

  1. nodeSelector:
  2. kubernetes.io/role: master

深度嵌套的数据结构可能难以用—set表达。 鼓励chart设计者在设计values.yaml文件的格式时考虑—set用法。

更多install方法

helm install命令可以从几个来源安装:

  • char存储库(如之前我们所见)
  • 本地图char存档(helm install foo-0.1.1.tgz)
  • 解压后的chart目录(helm install path/to/foo)
  • 一个完整的URL(helm install https://example.com/charts/foo-1.2.3.tgz)

‘HELM UPGRADE’ 和’HELM ROLLBACK’: 解压后的chat目录(helm install path/to/foo)升级release和失败恢复

当新版本的chart release时,或者当您想要更改release版的配置时,可以使用helm upgrade命令。

升级需要现有版本并根据您提供的信息进行升级。 因为Kubernetes chart可能很大而且很复杂,所以Helm会尝试执行最不具有侵入性的升级。 它只会更新自上次发布以来发生更改的内容。

  1. $ helm upgrade -f panda.yaml happy-panda stable/mariadb
  2. Fetched stable/mariadb-0.3.0.tgz to /Users/mattbutcher/Code/Go/src/k8s.io/helm/mariadb-0.3.0.tgz
  3. happy-panda has been upgraded. Happy Helming!
  4. Last Deployed: Wed Sep 28 12:47:54 2016
  5. Namespace: default
  6. Status: DEPLOYED
  7. ...

在上面的例子中,happy-panda版本升级了同样的chart,但是新增了一个YAML文件:

  1. mariadbUser: user1

我们可以使用helm get values来查看新设置是否生效。

  1. $ helm get values happy-panda
  2. mariadbUser: user1

helm get命令是查看集群中的发行版的有用工具。 正如我们上面所看到的,它表明我们从panda.yaml获得的新值已部署到群集中。

现在,如果某个版本在发布过程中没有按计划进行,可以使用helm rollback [RELEASE][REVISION]轻松回滚到以前的版本。

  1. $ helm rollback happy-panda 1

上述回滚我们的happ-panda到它的第一个发行版本。 发布版本是增量修订。 每次发生安装,升级或回滚时,修订号都会加1。第一个修订号始终为1.我们可以使用helm history [RELEASE]查看某个版本的修订号。

INSALL/UPGRADE/ROLLBACK的help选项

在INSTALL/UPGRADE/ROLLBACK期间,您可以指定几个其他有用的选项来定制Helm的行为。 请注意,这不是cli标志的完整列表。 要查看所有标志的描述,只需运行helm —help。

  • —timeout: 等待Kubernetes命令完成的数值(以秒为单位)默认为300(5分钟)
  • —wait: 等待所有Pod都处于就绪状态,PVC绑定,Deployments在就绪状态下具有最小(Desired minus maxUnavailable)Pod,并且在将release版标记为成功之前,服务具有IP地址(以及Ingress,如果是LoadBalancer)。 它将等待 —timeout值。 如果达到超时,则释放将被标记为FAILED。 注意:在Deployment的副本设置为1且maxUnavailable未设置为0的情况下,作为滚动更新策略的一部分,—wait将返回就绪状态,因为它已满足就绪状态下的最小Pod。
  • —no-hooks: 这会跳过该命令的运行钩子
  • —recreate-pods(仅在upgrade或rollback命令下有效): 该标志将导致所有的pod被重新创建(除了属于deployments的pod)

‘HELM DELETE’:删除一个release

当需要从群集中卸载或删除发行版时,请使用helm delete命令:

  1. $ helm delete happy-panda

这将从集群中删除该版本。 您可以使用helm list命令查看所有当前部署的版本:

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

从上面的输出中,我们可以看到happy-pand版本被删除。

然而,Helm总是保留记录发生了什么。 需要查看已删除的版本? helm list —deleted显示了这些,并且helm list —all显示所有的版本(已删除并且当前部署,以及失败的版本):

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

由于Helm保留已删除版本的记录,因此不能重新使用版本名称。 (如果您确实需要重新使用发行版名称,则可以使用—replace标志,但它只会重新使用现有版本并替换其资源。)

请注意,因为版本以这种方式保存,所以可以回滚已删除的资源并重新激活它。

‘HELM REPO’: 使用存储库

到目前为止,我们只从稳定的存储库安装chart。 但是你可以配置helm来使用其他仓库。 Helm在helm repo命令下提供了一些存储库工具。

你可以看到使用helm repo list配置了哪些仓库:

  1. $ helm repo list
  2. NAME URL
  3. stable https://kubernetes-charts.storage.googleapis.com
  4. local http://localhost:8879/charts
  5. mumoshu https://mumoshu.github.io/charts

新的仓库可以添加helm repo add:

  1. $ helm repo add dev https://example.com/dev-charts

由于chart存储库经常更改,您可以随时通过运行helm repo update来确保您的Helm客户端是最新的。

创建你自己的charts

Chat开发指南解释了如何开发自己的图表。 但是您可以通过使用helm create命令快速入门:

  1. $ helm create deis-workflow
  2. Creating deis-workflow

现在在./deis-workflow中有一个chart。 您可以编辑它并创建自己的模板。

在您编辑chart时,您可以通过运行helm lint来验证其格式是否良好。

当将char打包分发时,您可以运行helm package命令:

  1. $ helm package deis-workflow
  2. deis-workflow-0.1.0.tgz

现在可以通过helm install轻松安装该chart:

  1. $ helm install ./deis-workflow-0.1.0.tgz
  2. ...

可以将已归档的图表加载到chart存储库中。 请参阅chart存储库服务器的文档以了解如何上传。

注意:稳定存储库在Kubernetes Charts GitHub存储库上进行管理。 该项目接受chart源代码,并且(在审计后)为您打包。

TILLER,NAMESPACES和RBAC

在某些情况下,您可能希望将Tiller的范围或将多个Tillers部署到单个群集。 以下是在这些情况下运营的一些最佳做法。

  1. Tiller可以安装到任何命名空间(namespace)。 默认情况下,它安装在kube-system中。 您可以运行多个Tillers,只要它们各自在自己的名称空间中运行。
  2. 限制Tiller只能安装到特定的名称空间和/或资源类型由Kubernetes RBAC角色和角色绑定控制。 通过helm init —service-account 配置Helm时,您可以向Tiller添加服务帐户。 你可以在这里找到更多的信息。
  3. 版本名称是唯一的PER TILLER实例。
  4. chart应该只包含存在于单个命名空间中的资源。
  5. 不建议将多个Tillers配置为在相同的命名空间中管理资源。

结论

本章介绍了helm客户端的基本使用模式,包括search,install,upgrade和delete。 它还涵盖了有用的实用程序命令,如helm status,helm get和helm repo。

有关这些命令的更多信息,请查看Helm的内置帮助:helm help。

在下一章中,我们将看看开发图表的过程。