11. helm list
helm list
11.1 helm list --deleted
我们还可以通过--deleted
参数来显示被删除掉 release:
$ helm list --deleted NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE mewing-squid 1 Tue Sep 4 23:31:23 2018 DELETED mysql-0.10.1 5.7.14 default $ helm list --all NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE mewing-squid 1 Tue Sep 4 23:31:23 2018 DELETED mysql-0.10.1 5.7.14 default mydb 2 Wed Sep 5 00:38:33 2018 DEPLOYED mysql-0.10.1 5.7.14
helm list --all则会显示所有的 release,包括已经被删除的
由于 Helm 保留已删除 release 的记录,因此不能重新使用 release 名称。(如果 确实 需要重新使用此 release 名称,则可以使用此 --replace 参数,但它只会重用现有 release 并替换其资源。)这点是不是和 docker container 的管理比较类似
请注意,因为 release 以这种方式保存,所以可以回滚已删除的资源并重新激活它。
如果要彻底删除 release,则需要加上--purge参数:
$ helm delete mewing-squid --purge release "mewing-squid" deleted
12. helm create
$ helm create deis-workflow Creating deis-workflow
13. helm lint
在我们去创建/维护,或者使用 Helm chart 进行应用部署的时候,有时候可能会遇到一些错误。
Helm chart 是通过 YAML 进行维护的,而 YAML 是缩进/语法敏感的。假如你的缩进或者语法有问题,都将会导致报错。最简单的检查办法是使用 helm lint 进行检查。
比如我们进行如下修改:
$ diff --git a/values.yaml b/values.yaml index 4a8b237..696a77d 100644 --- a/values.yaml +++ b/values.yaml @@ -5,7 +5,7 @@ replicaCount: 1 image: - repository: nginx + repository: nginx pullPolicy: IfNotPresent # Overrides the image tag whose default is the chart appVersion. tag: ""
将 image.repository
的缩进搞错,这时进行安装将看到如下报错:
$ helm install foo . Error: INSTALLATION FAILED: cannot load values.yaml: error converting YAML to JSON: yaml: line 9: mapping values are not allowed in this context
helm lint
检查如下:
$ helm lint . ==> Linting . [INFO] Chart.yaml: icon is recommended [ERROR] values.yaml: unable to parse YAML: error converting YAML to JSON: yaml: line 9: mapping values are not allowed in this context [ERROR] templates/: cannot load values.yaml: error converting YAML to JSON: yaml: line 9: mapping values are not allowed in this context [ERROR] : unable to load chart cannot load values.yaml: error converting YAML to JSON: yaml: line 9: mapping values are not allowed in this context Error: 1 chart(s) linted, 1 chart(s) failed
我们将该内容恢复原样,并进行如下变更:
$ diff --git a/values.yaml b/values.yaml index 4a8b237..c86c0be 100644 --- a/values.yaml +++ b/values.yaml @@ -2,7 +2,7 @@ # This is a YAML-formatted file. # Declare variables to be passed into your templates. -replicaCount: 1 +replicaCount: "this should not be string" image: repository: nginx
将 replicaCount
修改成了一段字符串。这时候我们使用 helm lint
是无法检查出来的。
$ helm lint . ==> Linting . [INFO] Chart.yaml: icon is recommended 1 chart(s) linted, 0 chart(s) failed
因为从 YAML
语法上是无法检查出来类型的,并且这也是我们具体的业务逻辑(Kubernetes)限制的。
这时,如果进行安装将得到如下错误:
$ helm install foo . Error: INSTALLATION FAILED: unable to build kubernetes objects from release manifest: error validating "": error validating data: ValidationError(Deployment.spec.replicas): invalid type for io.k8s.api.apps.v1.DeploymentSpec.replicas: got "string", expected "integer"
以看到,对于这种类型错误是可以很直接的得到反馈的。
但还有一种情况,就是语法规则,类型均正常,但是不符合业务的实际预期。
比如我们进行如下变更:
$ diff --git a/values.yaml b/values.yaml index 4a8b237..8feedd6 100644 --- a/values.yaml +++ b/values.yaml @@ -8,7 +8,7 @@ image: repository: nginx pullPolicy: IfNotPresent # Overrides the image tag whose default is the chart appVersion. - tag: "" + tag: "1.20" imagePullSecrets: [] nameOverride: ""
这时,可以安装成功,但可能我们预期想要安装的镜像是 1.20-alpine 。这种场景下,上述两种方式就都没有效果了。
14. helm upgrade
我们这里将数据持久化禁用掉来对上面的 mydb 进行升级:
$ echo config.yaml mysqlUser: haimaxyUser mysqlDatabase: haimaxyDB service: type: NodePort persistence: enabled: false $ helm upgrade -f config.yaml mydb stable/mysql helm upgrade -f config.yaml mydb stable/mysql Release "mydb" has been upgraded. Happy Helming! LAST DEPLOYED: Wed Sep 5 00:38:33 2018 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ...
可以看到已经变成 DEPLOYED
状态了,现在我们再去看看 Pod 的状态呢:
$ kubectl get pods NAME READY STATUS RESTARTS AGE mewing-squid-mysql-69f587bdf9-z7glv 0/1 Pending 0 1h mydb-mysql-6ffc84bbf6-lcn4d 0/1 PodInitializing 0 49s ...
我们看到 mydb 关联的 Pod 已经变成了 PodInitializing
的状态,已经不是 Pending
状态了,同样的,使用 describe
命令查看:
$ kubectl describe pod mydb-mysql-6ffc84bbf6-lcn4d Name: mydb-mysql-6ffc84bbf6-lcn4d Namespace: default Node: node02/10.151.30.63 Start Time: Wed, 05 Sep 2018 00:38:33 +0800 Labels: app=mydb-mysql pod-template-hash=2997406692 Annotations: <none> Status: Pending ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulMountVolume 58s kubelet, node02 MountVolume.SetUp succeeded for volume "data" Normal SuccessfulMountVolume 58s kubelet, node02 MountVolume.SetUp succeeded for volume "default-token-n9w2d" Normal Scheduled 57s default-scheduler Successfully assigned mydb-mysql-6ffc84bbf6-lcn4d to node02 Normal Pulling 57s kubelet, node02 pulling image "busybox:1.25.0" Normal Pulled 45s kubelet, node02 Successfully pulled image "busybox:1.25.0" Normal Created 44s kubelet, node02 Created container Normal Started 44s kubelet, node02 Started container Normal Pulling 41s kubelet, node02 pulling image "mysql:5.7.14"
我们可以看到现在没有任何关于 PVC 的错误信息了,这是因为我们刚刚更新的版本中就是禁用掉了的数据持久化的,证明 helm upgrade
和 --values
是生效了的。
14.1 helm upgrade --install
既能安装
$ helm upgrade --install <release name> --values <values file> <chart directory>
15. helm package
当需要打包charts以进行分发时,您可以运行以下 helm package
命令:
$ helm package deis-workflow deis-workflow-0.1.0.tgz
现在可以通过helm install
以下方式轻松安装该charts:
$ helm install ./deis-workflow-0.1.0.tgz
16. helm test
helm chart 中的test位于该目录 templates/,并且是一个 job定义,它指定具有给定命令运行的容器。容器应该成功退出(退出 0),测试被认为是成功的。作业定义必须包含 helm test hook 注解:helm.sh/hook: test.
请注意,在 Helm v3 之前,作业定义需要包含以下 helm 测试挂钩注释之一:helm.sh/hook: test-success或helm.sh/hook: test-failure. helm.sh/hook:test-success仍然被接受为向后兼容的替代helm.sh/hook: test.
示例测试:
验证 values.yaml 文件中的配置是否已正确注入。
确保您的用户名和密码正确使用
确保不正确的用户名和密码不起作用
断言您的服务已启动并正确进行负载平衡
…
这是 bitnami wordpress 图表中 helm test pod 定义的示例。如果您下载图表的副本,您可以在本地查看文件:
$ helm repo add bitnami https://charts.bitnami.com/bitnami $ helm pull bitnami/wordpress --untar
结构:
wordpress/ Chart.yaml README.md values.yaml charts/ templates/ templates/tests/test-mariadb-connection.yaml
在wordpress/templates/tests/test-mariadb-connection.yaml
中,您会看到一个可以尝试的测试:
{{- if .Values.mariadb.enabled }} apiVersion: v1 kind: Pod metadata: name: "{{ .Release.Name }}-credentials-test" annotations: "helm.sh/hook": test spec: containers: - name: {{ .Release.Name }}-credentials-test image: {{ template "wordpress.image" . }} imagePullPolicy: {{ .Values.image.pullPolicy | quote }} {{- if .Values.securityContext.enabled }} securityContext: runAsUser: {{ .Values.securityContext.runAsUser }} {{- end }} env: - name: MARIADB_HOST value: {{ template "mariadb.fullname" . }} - name: MARIADB_PORT value: "3306" - name: WORDPRESS_DATABASE_NAME value: {{ default "" .Values.mariadb.db.name | quote }} - name: WORDPRESS_DATABASE_USER value: {{ default "" .Values.mariadb.db.user | quote }} - name: WORDPRESS_DATABASE_PASSWORD valueFrom: secretKeyRef: name: {{ template "mariadb.fullname" . }} key: mariadb-password command: - /bin/bash - -ec - | mysql --host=$MARIADB_HOST --port=$MARIADB_PORT --user=$WORDPRESS_DATABASE_USER --password=$WORDPRESS_DATABASE_PASSWORD restartPolicy: Never {{- end }}
首先,在集群上安装charts以创建发布。您可能必须等待所有 pod 都激活;如果您在此安装后立即进行测试,则可能会显示传递失败,您将需要重新测试。
$ helm install quirky-walrus wordpress --namespace default $ helm test quirky-walrus Pod quirky-walrus-credentials-test pending Pod quirky-walrus-credentials-test pending Pod quirky-walrus-credentials-test pending Pod quirky-walrus-credentials-test succeeded Pod quirky-walrus-mariadb-test-dqas5 pending Pod quirky-walrus-mariadb-test-dqas5 pending Pod quirky-walrus-mariadb-test-dqas5 pending Pod quirky-walrus-mariadb-test-dqas5 pending Pod quirky-walrus-mariadb-test-dqas5 succeeded NAME: quirky-walrus LAST DEPLOYED: Mon Jun 22 17:24:31 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: quirky-walrus-mariadb-test-dqas5 Last Started: Mon Jun 22 17:27:19 2020 Last Completed: Mon Jun 22 17:27:21 2020 Phase: Succeeded TEST SUITE: quirky-walrus-credentials-test Last Started: Mon Jun 22 17:27:17 2020 Last Completed: Mon Jun 22 17:27:19 2020 Phase: Succeeded [...]
编写helm charts test要点:
您可以在单个 yaml 文件中定义任意数量的测试,也可以分布在templates/目录中的多个 yaml 文件中。
测试套件嵌套可以在tests/类似的目录 下以/templates/tests/实现更多隔离。
一个测试是一个 Helm hook,所以注解可以和测试资源一起使用helm.sh/hook-weight、helm.sh/hook-delete-policy
helm plugin
[Helm plugin](https://helm.sh/zh/docs/topics/plugins/)是与Helm无缝集成的附加工具。插件提供一种扩展Helm核心特性集的方法,但不需要每个新的特性都用Go编写并加入核心工具中。helm plugin更多用法细节参阅这里。
Helm插件有以下特性:
可以在不影响Helm核心工具的情况下添加和移除。
可以用任意编程语言编写。
与Helm集成,并展示在helm help和其他地方。
helm plugin install
格式:
$ helm plugin install <path|url>
demo:
$ helm plugin install https://github.com/adamreese/helm-env
如果是插件tar包,仅需解压插件到$HELM_PLUGINS
目录。也可以用tar包的url直接安装:
helm plugin install https://domain/path/to/plugin.tar.gz
helm plugin list
$ helm plugin list NAME VERSION DESCRIPTION env 0.1.0 Print out the helm environment.
helm plugin uninstall
$ helm plugin uninstall env Uninstalled plugin: env
✈推荐阅读: