[Helm] helm workthrough

字数 1777阅读 114

参考文档:

What is Helm?

Helm helps you manage Kubernetes applications — Helm Charts help you define, install, and upgrade even the most complex Kubernetes application.
Charts are easy to create, version, share, and publish — so start using Helm and stop the copy-and-paste.

Helm 可以帮助你管理k8s app, helm charts 可以帮助你定义,安装 和 升级 哪怕是最复杂的k8s app.
Charts 很容易创建,版本管理,分享和发布,所以开始使用Helm,停止复制粘贴吧。

Why Teams ❤️ Helm?

  • Manage Complexity
  • Easy Updates
  • Simple Sharing
  • Rollbacks

Get Helm

Helm 项目可以在Github 上找到:helm
Helm 文档:docs.helm.sh

Get Charts

Visit the Helm Hub to explore charts from numerous public Helm repositories.

Installing Helm

doc: quickstart-guide -> 搜索:Installing Helm

There are two parts to Helm: The Helm client (helm) and the Helm server (Tiller). This guide shows how to install the client, and then proceeds to show two ways to install the server.
IMPORTANT: If you are responsible for ensuring your cluster is a controlled environment, especially when resources are shared, it is strongly recommended installing Tiller using a secured configuration. For guidance, see Securing your Helm Installation.

Helm 有两个部分:

  • Helm client (helm)
  • Helm server (Tiller)

将展示如何安装Helm Client以及两种方式安装Helm Server.

IMPORTANT:如果你负责确保你的集群是可控环境,尤其是在共享资源时,强烈建议你使用安全配置安装Tiller。参考文档: Securing your Helm Installation.

由此可见,安装Helm需要根据自己的集群的实际情况,选择是简单的安装还是要使用安全配置进行安装.

Installing The Helm Client

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

示例一:From the Binary Release

  1. 下载期望的helm 版本
  2. 解压 (tar -zxvf helm-v2.0.0-linux-amd64.tgz)
  3. 找到 helm 二进制文件,把它移到你本地期望的位置 (mv linux-amd64/helm /usr/local/bin/helm)

现在你可以使用helm client了: helm help.

示例二:从Snap获取(Linux)
sudo snap install helm --classic

示例三:从Homebrew获取(MacOS)
brew install kubernetes-helm

等等....,如:

  • windows安装helm client
  • 一个安装script安装helm client
  • 直接从源码安装

Installing Tiller

Tiller 是Helm server,运行在你的k8s 集群中。
但是对于开发,它也可以在本地运行,并配置与远程Kubernetes集群通信。

Check the Kubernetes Distribution Guide to see if there’s any further points of interest on using Helm with your cloud provider. Also check out the guide on Tiller and Role-Based Access Control for more information on how to run Tiller in an RBAC-enabled Kubernetes cluster.

现在很多云提供商提供了RBAC的权限控制,如果你的集群所在的云提供商提供了RBAC功能,你需要为Tiller
创建一个service account,并且设置正确的role 和 访问资源的权限。参考文档:special-note-for-rbac-users

安装Tiller简单方法
直接运行helm init,该命令会先验证是否正确设置了helm本地环境,如果需要,将会设置helm 本地环境。然后会链接cluster kubectl 链接的默认的集群上。如果一定helm链接到集群成功,那么它就是安装tiller到kube-system namespace。

使用helm init后,可以运行kubectl get pods --namespace kube-system 查看tiller的运行状态。

你可以 explicitly 告诉 helm init

  • Install the canary build with the --canary-image flag
  • Install a particular image (version) with --tiller-image
  • Install to a particular cluster with --kube-context
  • Install into a particular namespace with --tiller-namespace
  • Install Tiller with a Service Account with --service-account (for RBAC enabled clusters)
  • Install Tiller without mounting a service account with --automount-service-account false

安装完成后,可以运行helm version查看helm client 和 server的版本信息。

helm version.png

其他安装Tiller的方法:

running-tiller-locally 是为了开发使用的,你可以在本地安装tiller,然后配置它可以连接到远端的k8s cluster。

Upgrading Tiller

Helm 2.2.0 版本之后,可以使用 helm init --upgrade进行Tiller的升级。

Deleting Or Reinstalling Tiller

Tiller的数据是存储在k8s的configmap里,为了不删除数据,可以使用kubectl delete deployment tiller-deploy --namespace kube-system 或者 helm reset.
如果想重新安装Tiller,运行helm init命令。

Advanced Usage

  • --node-selectors 指定安装tiller pod 安装到带有指定标签的node上,如helm init --node-selectors "beta.kubernetes.io/os"="linux",然后在tiller的deployment文件里可以看到node selector的label.
    nodeSelector: object //节点选择,表示将该Pod调度到包含这些label的Node上,以key:value格式指定
...
spec:
  template:
    spec:
      nodeSelector:
        beta.kubernetes.io/os: linux
...
  • --override, 可以override annotation如:helm init --override metadata.annotations."deployment\.kubernetes\.io/revision"="1"可以修改deployment里面的信息。
#output
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
...

也可以override affinity,如:helm init --override "spec.template.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].weight"="1" --override "spec.template.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].preference.matchExpressions[0].key"="e2e-az-name"

#output
spec:
  strategy: {}
  template:
    ...
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - preference:
              matchExpressions:
              - key: e2e-az-name
                operator: ""
            weight: 1
...

NodeAffinity意为Node亲和性调度策略,较NodeSelector更为精确匹配。NodeAffinity是条件范围匹配,通过In(属于)、NotIn(不属于)、Exists(存在一个条件)、DoesNotExist(不存在)、Gt(大于)、Lt(小于)等操作符来选择Node,使调度更加灵活。

NodeAffinity目前有两种节点亲和性表达式:
RequiredDuringSchedulingIgnoredDuringExecution:必须满足指定的规则才可以调度Pod到Node上,功能上与nodeSelector很像,相当于硬限制。
PreferredDuringSchedulingIgnoredDuringExecution:强调优先满足指定规则,调度器会尝试调度Pod到Node上,但并不强求,相当于软限制。多个优先级规则还可以设置权重(weight)值,以定义执行的先后顺序。

NodeAffinity规则设置注意事项:
如果同时设置了nodeSelectornodeAffinity,则系统将需要同时满足两者的设置才能进行调度。
如果nodeAffinity指定了多个nodeSelectorTerms,那么只需要其中一个能够匹配成功即可。
如果nodeSelectorTerms中有多个matchExpressions,则一个节点必须满足所有matchExpressions才能运行该Pod。

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

常见问题 - FAQ

已经使用过的解决方案:
如果不想将helm client install到默认的 ~/.helm文件夹,可以设置 $HELM_HOME 环境变量,然后运行helm init

export HELM_HOME=/some/path
helm init --client-only

注意,如果此时你有已经存在的repo,需要re-add这些repo,通过运行helm repo add命令。

Q: How do I configure Helm, but not install Tiller?
A: By default, helm init will ensure that the local $HELM_HOME is configured, and then install Tiller on your cluster. To locally configure, but not install Tiller, use helm init --client-only

Q: How do I manually install Tiller on the cluster?
A: Tiller is installed as a Kubernetes deployment. You can get the manifest by running helm init --dry-run --debug, and then manually install it with kubectl. It is suggested that you do not remove or change the labels on that deployment, as they are sometimes used by supporting scripts and tools.

Helm Xmind

Helm.png