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命令确认可用的存储库。
在初始状态下,将显示如下的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

警报管理器
执行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

推送网关
执行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

确认各应用程序之间的协同工作
由于偏离了介绍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。