3 - 安装配置Helm


注意 helm使用需要kubectl,点击了解安装和配置kubectl

Helm是Kubernetes首选的包管理工具。Helmcharts为Kubernetes YAML清单文档提供模板语法。使用Helm,我们可以创建可配置的部署,而不仅仅是使用静态文件。有关创建自己的charts的更多信息,请查看https://helm.sh/文档。Helm有两个部分:Helm客户端(helm)和Helm服务端(Tiller)。

一、配置Helm客户端访问权限

Helm在集群上安装tiller服务以管理charts. 由于RKE默认启用RBAC, 因此我们需要使用kubectl来创建一个serviceaccountclusterrolebinding才能让tiller具有部署到集群的权限。

  • 在kube-system命名空间中创建ServiceAccount
  • 创建ClusterRoleBinding以授予tiller帐户对集群的访问权限
  • helm初始化tiller服务
  1. kubectl --kubeconfig=kube_configxxx.yml -n kube-system create serviceaccount tiller
  2. kubectl --kubeconfig=kube_configxxx.yml create clusterrolebinding tiller \
  3. --clusterrole cluster-admin --serviceaccount=kube-system:tiller

二、安装Helm客户端

Helm 客户端可以从源代码安装,也可以从预构建的二进制版本安装。

  • 下载Helm

  • 解压缩(tar -zxvf helm-v2.x.x-linux-amd64.tgz)

  • helm在解压后的目录中找到二进制文件,并将其移动到所需的位置(mv linux-amd64/helm /usr/local/bin/helm && chmod +x /usr/local/bin/helm)

到这里,您应该可以运行客户端了:helm help

Kubernetes社区的成员为Homebrew贡献了Helm,这个通常是最新的。

  1. brew install kubernetes-helm

(注意:emacs-helm 也是一个软件,这是一个不同的项目。)

Kubernetes社区成员为Chocolatey贡献了Helm包,这个软件包通常是最新的。

  1. choco install kubernetes-helm

Helm现在有一个安装shell脚本,将自动获取最新版本的Helm客户端并在本地安装。可以获取该脚本,然后在本地执行它。这种方法也有文档指导,以便可以在运行之前仔细阅读并理解它在做什么。

  1. curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
  2. chmod 700 get_helm.sh
  3. ./get_helm.sh
  1. curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash

也可以做到这一点。

Canary版本是从最新的主分支构建的Helm软件版本。它们不是正式版本,可能不稳定。但是,他们提供了测试最新功能的机会。Canary版本Helm二进制文件存储在Kubernetes Helm GCS存储中。以下是常见构建的链接:

从源代码构建Helm的工作稍微多一些,但如果您想测试最新的(预发布)Helm版本,那么这是最好的方法。您必须有一个安装Go工作环境 。

  1. cd $GOPATH
  2. mkdir -p src/k8s.io
  3. cd src/k8s.io
  4. git clone https://github.com/kubernetes/helm.git
  5. cd helm
  6. make bootstrap build

build目标编译helm并将其放置在bin/helm目录。Tiller也会编译,并且被放置在bin/tiller目录。

三、安装Helm Server(Tiller)

Helm的服务器端部分Tiller,通常运行在Kubernetes集群内部。但是对于开发,它也可以在本地运行,并配置为与远程Kubernetes集群通信。

安装tiller到集群中最简单的方法就是运行helm init。这将验证helm本地环境设置是否正确(并在必要时进行设置)。然后它会连接到kubectl默认连接的K8S集群(kubectl config view)。一旦连接,它将安装tillerkube-system命名空间中。

helm init自定义参数:

  • —canary-image 参数安装金丝雀版本;
  • —tiller-image 安装特定的镜像(版本);
  • —kube-context 使用安装到特定集群;
  • —tiller-namespace 用一个特定的命名空间(namespace)安装;

注意: 1、RKE默认启用RBAC,所以在安装tiller时需要指定ServiceAccount。2、helm init在缺省配置下,会去谷歌镜像仓库拉取gcr.io/kubernetes-helm/tiller镜像,在Kubernetes集群上安装配置Tiller;由于在国内可能无法访问gcr.io、storage.googleapis.com等域名,可以通过—tiller-image指定私有镜像仓库镜像。 3、helm init在缺省配置下,会利用https://kubernetes-charts.storage.googleapis.com作为缺省的stable repository地址,并去更新相关索引文件。在国内可能无法访问storage.googleapis.com地址, 可以通过—stable-repo-url指定chart国内加速镜像地址。 4、如果您是离线安装Tiller, 假如没有内部的chart仓库, 可通过添加—skip-refresh参数禁止Tiller更新索引。

执行以下命令在Rancher中安装Tiller:

  1. kubeconfig=xxx.yaml
  2. helm_version=`helm version |grep Client | awk -F""\" '{print $2}'`
  3. helm init --kubeconfig=$kubeconfig \
  4. --service-account tiller --skip-refresh \
  5. --tiller-image registry.cn-shanghai.aliyuncs.com/rancher/tiller:$helm_version \

helm init以后,可以运行kubectl —kubeconfig=kube_configxxx.yml get pods —namespace kube-system并看到Tiller正在运行。

一旦安装了Tiller,运行helm version会显示客户端和服务器版本。(如果它仅显示客户端版本, helm则无法连接到服务器, 使用kubectl查看是否有任何tiller Pod 正在运行。)

除非设置—tiller-namespaceTILLER_NAMESPACE参数,否则Helm将在命名空间kube-system中查找Tiller。

Canary镜像是从master分支建立的。他们可能不稳定,但他们提供测试最新功能的机会。安装Canary镜像最简单的方法是helm init与—canary-image参数一起使用:

  1. helm init --service-account tiller --canary-image

这将使用最近构建的容器镜像。可以随时使用kubectl删除kube-system命名空间中的Tiller deployment来卸载Tiller。

对于开发而言,有时在本地运行Tiller更容易,将其配置为连接到远程Kubernetes集群。上面介绍了构建部署 Tiller的过程。一旦tiller构建部署完成,只需启动它:

  1. bin/tiller
  2. Tiller running on:44134

当Tiller在本地运行时,它将尝试连接到由kubectl配置的Kubernetes集群。(运行kubectl config view以查看是哪个集群。)

必须告知helm连接到这个新的本地Tiller主机,而不是连接到集群中的一个。有两种方法可以做到这一点。第一种是在命令行上指定—host选项。第二个是设置$HELM_HOST环境变量。

  1. export HELM_HOST=localhost:44134
  2. helm version # Should connect to localhost.
  3. Client: &version.Version{SemVer:"v2.0.0-alpha.4", GitCommit:"db...", GitTreeState:"dirty"}
  4. Server: &version.Version{SemVer:"v2.0.0-alpha.4", GitCommit:"a5...", GitTreeState:"dirty"}

注意,即使在本地运行,Tiller也会将安装的release配置存储在Kubernetes内的ConfigMaps中。

四、升级Tiller

从Helm 2.2.0开始,Tiller可以升级使用helm init —upgrade。对于旧版本的Helm或手动升级,可以使用kubectl修改Tiller容器镜像

  1. kubeconfig=xxx.yaml
  2. helm_version=`helm version |grep Client | awk -F""\" '{print $2}'`
  3. kubectl --kubeconfig=$kubeconfig --namespace=kube-system \
  4. set image deployments/tiller-deploy \
  5. tiller=registry.cn-shanghai.aliyuncs.com/rancher/tiller:$helm_version

将显示以下信息:

  1. deployment "tiller-deploy" image updated

设置TILLER_TAG=canary将获得master版本的最新快照。

五、删除或重新安装Tiller

由于Tiller将其数据存储在Kubernetes ConfigMaps中,因此可以安全地删除并重新安装Tiller,而无需担心丢失任何数据。推荐删除Tiller的方法是使用kubectl —kubeconfig=kube_configxxx.yml delete deployment tiller-deploy —namespace kube-system或更简洁使用helm reset

然后可以从客户端重新安装Tiller:

  1. helm init

六、高级用法

helm init提供了额外的参数,用于在安装之前修改Tiller的deployment manifest。

—node-selectors参数允许我们指定调度Tiller Pod所需的节点标签。

下面的例子将在nodeSelector属性下创建指定的标签。

  1. helm init --node-selectors "beta.kubernetes.io/os"="linux"

已安装的deployment manifest将包含我们的节点选择器标签。

  1. ...
  2. spec:
  3. template:
  4. spec:
  5. nodeSelector:
  6. beta.kubernetes.io/os: linux
  7. ...

—override允许指定Tiller的deployment manifest的属性。与在Helm其他地方—set使用的命令不同,helm init —override修改最终manifest的指定属性(没有 “values” 文件)。因此,可以为deployment manifest中的任何有效属性指定任何有效值。

在下面的示例中,我们使用—override添加修订版本属性并将其值设置为1

  1. helm init --override metadata.annotations."deployment\.kubernetes\.io/revision"="1"

输出:

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. annotations:
  5. deployment.kubernetes.io/revision: "1"
  6. ...

在下面的例子中,我们为节点设置了亲和性属性。—override可以组合来修改同一列表项的不同属性。

  1. helm init --override "spec.template.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].weight"="1" \
  2. --override "spec.template.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].preference.matchExpressions[0].key"="e2e-az-name"

指定的属性组合到preferredDuringSchedulingIgnoredDuringExecution属性的第一个列表项中。

  1. ...
  2. spec:
  3. strategy: {}
  4. template:
  5. ...
  6. spec:
  7. affinity:
  8. nodeAffinity:
  9. preferredDuringSchedulingIgnoredDuringExecution:
  10. - preference:
  11. matchExpressions:
  12. - key: e2e-az-name
  13. operator: ""
  14. weight: 1
  15. ...

—output参数允许我们跳过安装Tiller的deployment manifest,并以JSON或YAML格式简单地将 deployment manifest输出到标准输出stdout。然后可以使用jq类似工具修改输出,并使用kubectl手动安装。

在下面的例子中,我们helm init—output json参数执行。

  1. helm init --output json

Tiller安装被跳过,manifest以JSON格式输出到stdout。

  1. "apiVersion": "extensions/v1beta1",
  2. "kind": "Deployment",
  3. "metadata": {
  4. "creationTimestamp": null,
  5. "labels": {
  6. "app": "helm",
  7. "name": "tiller"
  8. },
  9. "name": "tiller-deploy",
  10. "namespace": "kube-system"
  11. },
  12. ...

默认情况下,tiller将安装release信息存储在其运行的命名空间中的ConfigMaps中。从Helm2.7.0开始,现在有一个Secrets用于存储安装release信息的beta存储后端。添加了这个功能是为和Kubernetes的加密Secret一起,保护chart的安全性。要启用secrets后端,需要使用以下选项启动Tiller:

  1. helm init --override 'spec.template.spec.containers[0].command'='{/tiller,--storage=secret}'

目前,如果想从默认后端切换到secrets后端,必须自行为此进行迁移配置信息。当这个后端从beta版本毕业时,将会有更正式的移徙方法。

下一步: Helm安装Rancher