使用Helm

1. 添加chart存储库

使用helm repo add命令添加Helm chart。几个Helm存储库命令被划分在helmrepo命令组下:

$ helm repo add bitnami https://charts.bitnami.com/bitnami

helm repo add命令将添加一个名为bitnami的存储库,该存储库指向URL https://charts.bitnami.com/bitnami

现在,我们可以通过运行第二个repo命令来验证Bitnami存储库是否存在:

$ helm repo update
$ helm repo list
NAME            URL
ingress-nginx   https://kubernetes.github.io/ingress-nginx
stable          http://mirror.azure.cn/kubernetes/charts
cilium          https://helm.cilium.io/
gitee-helm      http://hub.gitee.cc/chartrepo/gitee-helm
harbor          https://helm.goharbor.io
azure           http://mirror.azure.cn/kubernetes/charts/
bitnami         https://charts.bitnami.com/bitnami
aliyun          https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

2. 搜索chart存储库

$ helm search repo drupal
NAME            CHART VERSION   APP VERSION     DESCRIPTION
aliyun/drupal   0.11.8          8.4.5           One of the most versatile open source content m...
azure/drupal    6.2.12          8.8.3           DEPRECATED One of the most versatile open sourc...
bitnami/drupal  12.0.1          9.3.12          Drupal is one of the most versatile open source...
stable/drupal   6.2.12          8.8.3           DEPRECATED One of the most versatile open sourc...

Drupal chart有几十个版本。前面的示例已被截断,仅显示前几个版本。

chart版本和应用程序版本

chart版本是Helm chart的版本。

应用程序版本是打包在chart中的应用程序的版本。Helm使用chart版本来进行版本控制决策,比如哪个软件包是最新的。正如我们在前面的示例中看到的,多个chart版本可能包含相同的应用程序版本。

3. 安装程序包

在Helm中安装chart至少需要两条信息:安装的名称和要安装的chart。

$ helm install mysite bitnami/drupal

NAME: mysite
LAST DEPLOYED: Fri May  6 23:18:51 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: drupal
CHART VERSION: 11.0.24
APP VERSION: 9.3.9** Please be patient while the chart is being deployed **

1. Get the Drupal URL:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace default -w mysite-drupal'

  export SERVICE_IP=$(kubectl get svc --namespace default mysite-drupal --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}")
  echo "Drupal URL: http://$SERVICE_IP/"

2. Get your Drupal login credentials by running:

  echo Username: user
  echo Password: $(kubectl get secret --namespace default mysite-drupal -o jsonpath="{.data.drupal-password}" | base64 --decode)

在Helm 3中,命名规则已经改变。现在实例名称的作用域是Kubernetes命名空间。我们可以安装两个名为mysite的实例,只要它们各自位于不同的命名空间中即可

$ kubectl create ns first
$ kubectl create ns second
$ helm install mysite bitnami/drupal -n first
$ helm install mysite bitnami/drupal -n second

2.1 安装时的配置

# 下载charts安装包
$ helm fetch bitnami/drupal --untar
$ ll
total 108
-rw-r--r-- 1 root root   303 May  6 23:49 Chart.lock
drwxr-xr-x 4 root root    35 May  6 23:49 charts
-rw-r--r-- 1 root root   895 May  6 23:49 Chart.yaml
drwxr-xr-x 2 root root    28 May  6 23:49 ci
-rw-r--r-- 1 root root 52201 May  6 23:49 README.md
drwxr-xr-x 2 root root  4096 May  6 23:49 templates
-rw-r--r-- 1 root root  4975 May  6 23:49 values.schema.json
-rw-r--r-- 1 root root 34062 May  6 23:49 values.yaml

我们可以在values.yaml文件中来设置drupalUsername和drupalEmail的值

drupalUsername: admin
drupalPassword: "admin"
drupalEmail: admin@example.com

Helm核心维护人员认为将配置值保存在YAML文件中是一种很好的做法。但是,请务必记住,如果配置文件中包含敏感信息(如口令或身份验证令牌),则应采取措施确保这些信息不会泄漏。

helm install和helm upgrade都提供了一个–values标志,它指向具有覆盖值的YAML文件:

$ helm install mysite bitnami/drupal --values values.yaml

第二个标志可用于向安装或升级添加单个参数。–set标志直接接受一个或多个值。它们不需要存储在YAML文件中:

$ helm install mysite bitnami/drupal --set drupalUsername=admin --set drupalPassword="admin"

当使用–set标志时,子部分要复杂一些。你将需要使用虚线表示法:--set mariadb.db.name=my-database。当设置多个值时,这可能会变得冗长。

一般来说,Helm核心维护人员建议将配置存储在values.yaml文件中(注意,文件名不一定是“values”),仅在绝对必要时才使用–set。通过这种方式,你可以很容易地访问在操作期间使用的值(并且可以随着时间的推移跟踪这些值),同时还可以缩短Helm命令。使用文件还意味着不必像在命令行上设置内容时那样转义那么多字符。

4. 列出你的安装

# 默认default名称空间
$ helm list

# 列出所有名称空间的helm
$ helm list --all-namespaces
$ helm list -A

5. 升级安装

当我们第一次安装chart时,我们会创建安装的初始版本,称之为版本1。当我们执行升级时,正在创建同一安装的新版本:版本2。当再次升级时,我们将创建版本3(在下一章中,我们将看到回滚如何创建版本)。

在升级过程中,我们可以创建一个具有新配置、新chart版本或两者兼有的版本。

例如,假设我们在ingress(入口)关闭的情况下安装Drupal chart(这将有效地防止流量从集群外部路由到Drupal实例)。

注意,我们使用–set标志来保持示例的紧凑性,但在常规场景中建议使用

$ helm install mysite bitnami/drupal --set ingress.enabled=false

在ingress关闭的情况下,我们可以根据自己的喜好设置网站。准备好之后,我们可以创建一个新的版本来启用ingress特性:

$ helm upgrade mysite bitnami/drupal --set ingress.enabled=true

在这种情况下,我们正在运行的upgrade只会更改配置。在后台,Helm将加载chart,生成该chart中的所有Kubernetes对象,然后查看这些对象与已安装的chart的版本有何不同。

它只会给Kubernetes发送需要更改的东西。换言之,Helm只会试图改变最少量的东西。

有时,你可能需要强制某个服务重新启动。你不需要用Helm去实现,可以简单地使用kubectl本身来重启它。

对于操作系统的软件包管理器,你不能使用软件包管理器重新启动程序。

同样,你不需要使用Helm来重新启动Web服务器或数据库。当chart的新版本出现时,你可能需要升级现有安装以使用新的chart版本。在很大程度上,Helm试图让这变得简单:

$  helm repo update
$ helm upgrade mysite bitnami/drupal

❶ 从chart存储库获取最新的软件包。

❷ 升级mysite版本以使用最新版本的bitnami/drupal。

如你所见,Helm的默认策略是尝试使用最新版本的chart。如果你希望保留chart的特定版本,可以显式声明:

$ helm upgrade mysite bitnami/drupal --version 11.0.32

在这种情况下,即使发布了更新的版本,也只会安装bitnaim/drupal版本11.0.32。

Helm核心维护人员建议你在每次安装和升级时提供一致的配置。要对两个发布版本应用相同的配置,可在每个操作上都提供值:

$ helm install mysite bitnami/drupal --values values.yaml
$ helm upgrade mysite bitnami/drupal --values values.yaml

❶ 使用配置文件安装。

❷ 使用相同的配置文件升级。

我们建议将配置存储在一个values.yaml文件中,以便很容易复制这个模式。

想象一下,如果你使用–set来设置三个或四个配置参数,这些命令会有多麻烦!对于每个版本,你必须准确地记住要设置哪些内容。

6. 卸载安装

要删除某个Helm安装,可使用helm uninstall命令:

$ helm uninstall mysite

与install、list和upgrade类似,你可以提供–namespace标志来指定要从特定命名空间中删除安装:

$ helm uninstall mysite -n first

当第一次用Helm安装chart时(比如用helm install mysite bitnami/drupal),我们创建了Drupal应用程序实例,并且还创建了一个包含发布版本信息的特殊记录。默认情况下,Helm将这些记录存储为Kubernetes Secret(尽管还有其他受支持的存储后端)。

$ kubectl get secret
NAME                                 TYPE                                  DATA   AGE
default-token-pjfmb                  kubernetes.io/service-account-token   3      190d
mysite-drupal                        Opaque                                1      49s
mysite-mariadb                       Opaque                                2      49s
mysite-mariadb-token-xmdcw           kubernetes.io/service-account-token   3      49s
nfs-client-provisioner-token-ssc2b   kubernetes.io/service-account-token   3      190d
sh.helm.release.v1.mysite.v1         helm.sh/release.v1                    1      49s
sh.helm.release.v1.mysite.v2         helm.sh/release.v1                    1      4s

运行helm uninstall mysite命令将加载mysite安装的最新版本记录。

$ helm uninstall mysite
$ kubectl get secret
NAME                                 TYPE                                  DATA   AGE
default-token-pjfmb                  kubernetes.io/service-account-token   3      190d
nfs-client-provisioner-token-ssc2b   kubernetes.io/service-account-token   3      190d

我们现在没有安装了。如果重新运行kubectl get secrets命令,还会看到mysite的所有记录都被清除了:

你可以删除应用程序,但会保留发布记录:

$ helm uninstall mysite --keep-history