Helm 最详细的命令大全(2)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Helm 最详细的命令大全(2)

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 创建 charts 应用示例

$ 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

✈推荐阅读:


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
Docker 容器
docker命令大全
docker命令大全
47 0
|
6月前
|
Kubernetes 关系型数据库 MySQL
第三章 Helm常用命令
第三章 Helm常用命令
186 0
|
6月前
|
Docker 容器
Docker【部署 03】一键离线安装Docker的自动化安装脚本分享(安装文件docker-20.10.13.tgz及脚本dockerInstall.sh)
Docker【部署 03】一键离线安装Docker的自动化安装脚本分享(安装文件docker-20.10.13.tgz及脚本dockerInstall.sh)
546 0
|
Linux 网络安全 调度
使用docker部署awx-1.7.1.0(ansible图形化界面)
使用docker部署awx-1.7.1.0(ansible图形化界面)
1091 0
|
Docker 容器
docker安装部署和常用命令
docker安装部署和常用命令
173 0
|
应用服务中间件 Shell nginx
Docker命令大全
Docker命令大全
82 1
|
Kubernetes 应用服务中间件 nginx
【K8S系列】第十讲:kubectl 命令大全
【K8S系列】第十讲:kubectl 命令大全
296 0
|
Shell Docker 容器
Docker(一) 常用命令大全
Docker(一) 常用命令大全
156 1
|
Ubuntu Shell Linux
Docker常用的命令(含安装教程)
Docker常用的命令(含安装教程)
164 0
|
Ubuntu NoSQL 关系型数据库
Docker常用命令大全
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
485 0
Docker常用命令大全