Helm v2是一款值得推荐的工具

请注意

有关Helm v3的详细信息,请参考Helm v3的建议。

Helm是什么?

以今北的产业形态来解释

HelmはKubernetes向けパッケージマネージャで、CNCFがホストするOSSです。
パッケージはChartという形式でArtifact Hubや各OSSのリポジトリ等で公開されており、自作も可能です。

helm install Chart名でkubernetesクラスタ(以下”k8sクラスタ”)にChartをデプロイできます。

依据个人独断和偏见精选的主要图表存储库。

helm/charts

2020/11/13にサポート終了。( Deprecation Timelineを参照 )

Artifact Hub
prometheus-community
gitlab.com
Istio / Install with Helm
等々

准备k8s集群

请为您提供您喜欢的环境。以下是我们的推荐。

公有云派

Google Kubernetes Engine ( GKE )

会員登録後、数ステップで無料枠で利用可!

自用服务器派

minikube

手軽にシングルノードクラスタを構築できます。

Docker for Mac

dockerだけでなく、シングルノードのk8sクラスタとkubectlが同梱されています!
設定画面でkubernetesを有効化するとすぐ使えます。

本文中描述的工作环境

客户端机器是Ubuntu 17.10。已安装了kubectl(版本为v1.9.2)。
k8s群集是在GKE上使用默认设置搭建的。群集版本为v1.9.7-gke.11,有3个节点。

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=17.10
DISTRIB_CODENAME=artful
DISTRIB_DESCRIPTION="Ubuntu 17.10"
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.2", GitCommit:"5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", GitTreeState:"clean", BuildDate:"2018-01-18T10:09:24Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"9+", GitVersion:"v1.9.7-gke.11", GitCommit:"dc4f6dda6a08aae2108d7a7fdc2a44fa23900f4c", GitTreeState:"clean", BuildDate:"2018-11-10T20:22:02Z", GoVersion:"go1.9.3b4", Compiler:"gc", Platform:"linux/amd64"}
$ kubectl cluster-info
Kubernetes master is running at https://xx.xx.xx.xx
GLBCDefaultBackend is running at https://xx.xx.xx.xx/api/v1/namespaces/kube-system/services/default-http-backend:http/proxy
Heapster is running at https://xx.xx.xx.xx/api/v1/namespaces/kube-system/services/heapster/proxy
KubeDNS is running at https://xx.xx.xx.xx/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
kubernetes-dashboard is running at https://xx.xx.xx.xx/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
Metrics-server is running at https://xx.xx.xx.xx/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
$ kubectl get node
NAME                                       STATUS    ROLES     AGE       VERSION
gke-standard-cluster-1-default-pool-xxxx   Ready     <none>    16d       v1.9.7-gke.11
gke-standard-cluster-1-default-pool-yyyy   Ready     <none>    16d       v1.9.7-gke.11
gke-standard-cluster-1-default-pool-zzzz   Ready     <none>    16d       v1.9.7-gke.11
$

安装Helm

我们立即让Helm可以使用。
我们会准备好Helm命令和Tiller。

安装helm命令

请将Helm命令安装到可使用kubectl命令的机器上。
请参考安装Helm,并选择您喜欢的方式进行安装。

如果要通过curl获取安装脚本并进行安装,可以使用以下命令(参见FROM SCRIPT)。

$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get | bash

安装Tiller

使用helm init命令将tiller部署到k8s集群中。
默认情况下,它将部署在namespace kube-system的下方。

$ helm init
$ kubectl get deployment -n kube-system
NAME                    DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
( 略 : )
tiller-deploy           1         1         1            1           13m
$

备注)如果要在RBAC环境下进行安装

如果在使用 Helm 时遇到以下错误,请确保为 Tiller 提供了适当的权限。

Error: release XXXX failed: namespaces "XXXX" is forbidden: User "system:serviceaccount:kube-system:default" cannot get namespaces in the namespace "XXXX"

您可以在helm init命令中指定serviceaccount,因此请创建并指定一个与适当角色相关联的serviceaccount。
以下示例中,我们将其关联到cluster-admin角色,请注意安全性。

$ kubectl -n kube-system create serviceaccount tiller
$ kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller
$ helm init --service-account=tiller

请确认版本。

如果您已成功安装了Helm命令和Tiller,您可以按照以下方式查看客户端和服务器的版本。

$ helm version
Client: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}
$

现在可以使用helm命令准备好部署应用程序了。

要卸载

如果你想要卸载,请先将tiller卸载,然后删除helm命令。

# tillerをアンデプロイする
$ helm reset --force
$ # アンインストールされなかったらtiller関連のリソースを個別に削除する
$ #   kubectl delete deployment tiller-deploy -n kube-system
$ #   kubectl delete service tiller-deploy -n kube-system
$ which helm
/usr/local/bin/helm
$ sudo rm /usr/local/bin/helm

helm命令列表

以下是本文介绍的命令列表。
您可以看出它与yum、apt等包管理器具有相似的命令体系。

コマンド説明helm repo listリポジトリ一覧を表示するhelm repo addリポジトリを追加するhelm searchデプロイ可能なChartを表示するhelm installアプリケーションをインストールする(k8sクラスタにデプロイする)helm listインストール済みのアプリケーションを表示するhelm deleteアプリケーションをアンデプロイするhelm resettillerをアンデプロイする

确认存储库

让我们来确认与提供图表的存储库相关的命令。

显示存储库列表

请使用helm repo list命令确认可用的存储库。
在初始状态下,将显示如下的stable和local。

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

添加存储库

让我们试试添加incubator的存储库。
这样一来,不仅可以部署charts/stable,还可以部署charts/incubator的Chart。

$ helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com/
"incubator" has been added to your repositories
$ helm repo list
NAME            URL
stable          https://kubernetes-charts.storage.googleapis.com
local           http://127.0.0.1:8879/charts
incubator       https://kubernetes-charts-incubator.storage.googleapis.com/
$

查看图表

让我们确认要部署的应用程序Chart。
使用helm search命令可以显示所有的Chart,传入搜索关键字作为参数可以进行筛选。

在以下示例中,可以看出Chart的版本是7.1.1,而应用程序(此次是prometheus)的版本可用为2.4.0。

$ helm search stable/prometheus
NAME                     CHART VERSION   APP VERSION     DESCRIPTION
    ( : 略 )
stable/prometheus        7.1.1           2.4.0           Prometheus is a monitoring system and time series database.
    ( : 略 )
$

另外,您可以在helm install命令中使用–version参数指定Chart的版本,这样也可以部署旧版本。

此外,您还可以使用helm fetch命令将Chart下载到本地。
您可以自由修改下载的Chart并进行部署,因此可以修改一些无法通过参数更改的部分。
如果有机会的话,我会在另一篇文章中进行介绍。

部署应用程序。

现在可以确认一下 Chart 后,我们立即将其部署到 k8s 集群中。

我將在namespacehelm-test下部署stable/prometheus。
發佈的名稱為test。
(發佈的名稱將在helm list中顯示,並用作每個資源名稱的前綴。)

$ # namespaceを作成
$ kubectl create namespace helm-test
$ # dry-run
$ helm install stable/prometheus --name test --namespace helm-test --dry-run
$ # デプロイ
$ helm install stable/prometheus --name test --namespace helm-test
$ # 確認
$ helm list

请确认应用程序的部署结果。

查看helm install命令的结果。

以下是我们对stable/prometheus部署的结果进行的记录,稍微有些长。您可以查看以下内容。

    • リソースのリスト

deploymentやservice等が分かります

NOTES

基本的な使い方が分かります、嬉しい!

$ helm install stable/prometheus --name test --namespace helm-test
NAME:   test
LAST DEPLOYED: Tue Nov 27 21:40:53 2018
NAMESPACE: helm-test
STATUS: DEPLOYED

RESOURCES:
==> v1beta1/ClusterRole
NAME                                AGE
test-prometheus-kube-state-metrics  1s
test-prometheus-server              1s

==> v1beta1/ClusterRoleBinding
test-prometheus-kube-state-metrics  1s
test-prometheus-server              1s

==> v1/Service
test-prometheus-alertmanager        1s
test-prometheus-kube-state-metrics  1s
test-prometheus-node-exporter       1s
test-prometheus-pushgateway         1s
test-prometheus-server              1s

==> v1/PersistentVolumeClaim
test-prometheus-alertmanager  1s
test-prometheus-server        1s

==> v1/ServiceAccount
test-prometheus-alertmanager        1s
test-prometheus-kube-state-metrics  1s
test-prometheus-node-exporter       1s
test-prometheus-pushgateway         1s
test-prometheus-server              1s

==> v1beta1/Deployment
test-prometheus-alertmanager        1s
test-prometheus-kube-state-metrics  1s
test-prometheus-pushgateway         1s
test-prometheus-server              1s

==> v1/Pod(related)

NAME                                                READY  STATUS             RESTARTS  AGE
test-prometheus-node-exporter-gwx84                 1/1    Running            0         1s
test-prometheus-node-exporter-kxbdm                 1/1    Running            0         1s
test-prometheus-node-exporter-pdkdw                 0/1    ContainerCreating  0         1s
test-prometheus-alertmanager-d9f85f85b-76t4f        0/2    Pending            0         1s
test-prometheus-kube-state-metrics-95dc85f67-9t44z  0/1    ContainerCreating  0         1s
test-prometheus-pushgateway-7fb9bdfcbb-wtffs        0/1    ContainerCreating  0         1s
test-prometheus-server-7bd886b769-7zgsq             0/2    Pending            0         1s

==> v1/ConfigMap

NAME                          AGE
test-prometheus-alertmanager  1s
test-prometheus-server        1s

==> v1beta1/DaemonSet
test-prometheus-node-exporter  1s


NOTES:
The Prometheus server can be accessed via port 80 on the following DNS name from within your cluster:
test-prometheus-server.helm-test.svc.cluster.local


Get the Prometheus server URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace helm-test -l "app=prometheus,component=server" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace helm-test port-forward $POD_NAME 9090


The Prometheus alertmanager can be accessed via port 80 on the following DNS name from within your cluster:
test-prometheus-alertmanager.helm-test.svc.cluster.local


Get the Alertmanager URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace helm-test -l "app=prometheus,component=alertmanager" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace helm-test port-forward $POD_NAME 9093


The Prometheus PushGateway can be accessed via port 9091 on the following DNS name from within your cluster:
test-prometheus-pushgateway.helm-test.svc.cluster.local


Get the PushGateway URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace helm-test -l "app=prometheus,component=pushgateway" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace helm-test port-forward $POD_NAME 9091

For more information on running Prometheus, visit:
https://prometheus.io/

$

确定资源

可以从helm install命令的结果中确认部署(deployment)、服务(service)等内容,
但还有configmap也经常使用,所以最好也一并确认一下。

$ kubectl get deployment -n helm-test
$ kubectl get pod -n helm-test
$ kubectl get service -n helm-test
$ kubectl get configmap -n helm-test

显示已安装的Chart

可以在helm list命令中进行确认。

$ helm list
NAME    REVISION        UPDATED                         STATUS          CHART                   APP VERSION     NAMESPACE
test    1               Tue Nov 27 21:40:53 2018        DEPLOYED        prometheus-7.1.1        2.4.0           helm-test
$

确认应用程序的运行情况

k8s集群部署完成并成功确认了资源和备注,我们立即开始利用应用程序。

普罗米修斯

执行NOTES的步骤。

$ export POD_NAME=$(kubectl get pods --namespace helm-test -l "app=prometheus,component=server" -o jsonpath="{.items[0].metadata.name}")
$ kubectl --namespace helm-test port-forward $POD_NAME 9090
Prometheus.png

警报管理器

执行NOTES的步骤。

$ export POD_NAME=$(kubectl get pods --namespace helm-test -l "app=prometheus,component=alertmanager" -o jsonpath="{.items[0].metadata.name}")
$ kubectl --namespace helm-test port-forward $POD_NAME 9093
Alertmanager.png

推送网关

执行NOTES的步骤。

$ export POD_NAME=$(kubectl get pods --namespace helm-test -l "app=prometheus,component=pushgateway" -o jsonpath="{.items[0].metadata.name}")
$ kubectl --namespace helm-test port-forward $POD_NAME 9091
Pushgateway.png

确认各应用程序之间的协同工作

由于偏离了介绍Helm的主题,我们将其作为独立的文章来展示。请务必查看这篇文章。
Pushgateway->Prometheus->Alertmanager->Webhook

卸载应用

您可以使用”helm delete”命令进行反部署。

$ helm list
NAME    REVISION    UPDATED                     STATUS      CHART               APP VERSION NAMESPACE
test    1           Sat Dec  1 09:18:18 2018    DEPLOYED    prometheus-7.4.5    2.5.0       helm-test
$ helm delete test --purge
release "test" deleted
$ helm list
$

总结

我介绍了Helm的安装方法以及以stable/prometheus为主题的Chart部署方法。

重新概述一下Helm的推荐要点。

    • Chartが豊富

Prometheusを始めとして使用頻度の高いメジャーなOSSが豊富に公開されている

Chartに複数アプリケーションが含まれる

stable/prometheusの場合、Prometheus, Alertmanager, Pushgateway が含まれている
まとめてデプロイ、アンデプロイできる

Chartに含まれる各アプリケーションは連携設定済み

stable/prometheusの場合、Service Discoveryが設定済み
そのため利用者が書く設定は少ない

Chartはダウンロード&編集が可能な透明性とカスタマイズ性がある

何かの時にも安心

使用Helm可以轻松部署,并且需要更改的配置也较少。此外,它不仅仅只能按照提供的模板使用,还具有自定义性。如果您希望将重心放在应用程序的利用而不是环境构建上(并且希望在需要时灵活修改配置和设置),我推荐您使用Helm。

bannerAds