什么是Helm


在没有 Helm 之前,在 Kubernetes 部署应用需要依次部署 deploy , svc 等,步骤繁琐,配置复杂,容易出错。况且随着许多项目微服务化,复杂应用在容器中的部署显得更加复杂,Helm 通过支持发布版本管理控制,很大程度简化了 Kubernetes 中的应用部署管理

Helm 本质就是让 k8s 中的应用管理可配置,能够动态生成。通过动态生成方式生成 k8s 清单文件( deploy.yaml , service.yaml ) 。然后调用 kubectl 自动执行 k8s 资源部署。

Helm 提供类似 Linux 中的 YUM 包管理器,是部署环境的流程封装。Helm 有两个重要的概念: chart 和 release

  • chart 是创建一个应用信息的集合,包括各种 k8s 对象配置模板,参数定义,依赖关系,文档说明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt, yum 中的软件安装包。
  • release 是 chart 的运行实例 ,代表了一个正在运行的应用。当 chart 被安装到 k8s 集群,就生成一个 release。 chart 能够多次安装到同一个集群,每次安装都是一个 release。

Helm 架构

在 Helm 2 中,Tiller 是作为一个 Deployment 部署在 kube-system 命名空间中,很多情况下,我们会为 Tiller 准备一个 ServiceAccount ,这个 ServiceAccount 通常拥有集群的所有权限。用户可以使用本地 Helm 命令,自由地连接到 Tiller 中并通过 Tiller 创建、修改、删除任意命名空间下的任意资源。

然而在多租户场景下,这种方式也会带来一些安全风险,我们即要对这个 ServiceAccount 做很多剪裁,又要单独控制每个租户的控制,这在当前的 Tiller 模式下看起来有些不太可能。

于是在 Helm 3 中,Tiller 被移除了。新的 Helm 客户端会像 kubectl 命令一样,读取本地的 kubeconfig 文件,使用我们在 kubeconfig 中预先定义好的权限来进行一系列操作。这样做法即简单,又安全。

虽然 Tiller 文件被移除了,但 Release 的信息仍在集群中以 ConfigMap 的方式存储,因此体验和 Helm 2 没有区别。

image.png

Helm 安装

  • 安装 helm

这边以MacOS 为例,其他操作系统详见 https://helm.sh/docs/intro/install/

yangtengcandeMacBook-Pro:prometheus yangtengcan$ brew install kubernetes-helm Updating Homebrew… ==> Downloading https://homebrew.bintray.com/bottles/helm-3.2.4_1.catalina.bottle.tar.gz

################################################################## 100.0%

==> Pouring helm-3.2.4_1.catalina.bottle.tar.gz ==> Caveats Bash completion has been installed to: /usr/local/etc/bash_completion.d zsh completions have been installed to: /usr/local/share/zsh/site-functions ==> Summary 🍺 /usr/local/Cellar/helm/3.2.4_1: 54 files, 42.7MB

  • 查看 helm 版本

    yangtengcandeMacBook-Pro:prometheus yangtengcan$ helm version version.BuildInfo{Version:”v3.2.4”, GitCommit:”0ad800ef43d3b826f31a5ad8dfbb4fe05d143688”, GitTreeState:”dirty”, GoVersion:”go1.14.3”}

Helm 使用

  • 创建模板

    yangtengcandeMacBook-Pro:demo yangtengcan$ helm create demo yangtengcandeMacBook-Pro:demo yangtengcan$ tree . ├── Chart.yaml ├── charts # 这个 charts 依赖的其他 charts,始终被安装 ├── templates # 描述这个 Chart 的相关信息、包括名字、描述信息、版本 │ ├── NOTES.txt │ ├── _helpers.tpl │ ├── deployment.yaml │ ├── hpa.yaml │ ├── ingress.yaml │ ├── service.yaml │ ├── serviceaccount.yaml │ └── tests │ └── test-connection.yaml └── values.yaml #模板变量文件

3 directories, 10 files

  • 安装

    yangtengcandeMacBook-Pro:demo yangtengcan$ helm install -f values.yaml mydemo .

NAME: mydemo

LAST DEPLOYED: Sat Jun 27 11:33:59 2020

NAMESPACE: default

STATUS: deployed

REVISION: 1

NOTES:

  1. Get the application URL by running these commands:

    export POD_NAME=$(kubectl get pods —namespace default -l “app.kubernetes.io/name=demo,app.kubernetes.io/instance=mydemo” -o jsonpath=”{.items[0].metadata.name}”)

    echo “Visit http://127.0.0.1:8080 to use your application”

    kubectl —namespace default port-forward $POD_NAME 8080:80

  • 验证

    yangtengcandeMacBook-Pro:demo yangtengcan$ kubectl get pod

NAME READY STATUS RESTARTS AGE

mydemo-6957ff97b9-kc2bf 1/1 Running 0 4m3s

yangtengcandeMacBook-Pro:demo yangtengcan$ helm list

NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION

mydemo default 1 2020-06-27 11:33:59.080793 +0800 CST deployed demo-0.1.0 1.16.0

Helm 安装Dashboard

  • 使用官方提供的 Chart

    helm repo add stable http://mirror.azure.cn/kubernetes/charts

  • 修改 values.yaml 镜像为国内镜像

    registry.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1

  • 修改 service 类型为 NodePort

    service: type: NodePort externalPort: 443 nodePort: 30000

  • 部署dashboard

    helm install -f values.yaml dashboard .

  • 访问dashboard

image.png

  • 创建token

    yangtengcandeMacBook-Pro:kubernetes-dashboard yangtengcan$ cat sa.yaml

kind: ClusterRoleBinding

apiVersion: rbac.authorization.k8s.io/v1beta1

metadata:

name: admin

annotations:

  1. rbac.authorization.kubernetes.io/autoupdate: "true"

roleRef:

kind: ClusterRole

name: cluster-admin

apiGroup: rbac.authorization.k8s.io

subjects:

  • kind: ServiceAccount

    name: admin

    namespace: kube-system


apiVersion: v1

kind: ServiceAccount

metadata:

name: admin

namespace: kube-system

labels:

kubernetes.io/cluster-service: "true"

addonmanager.kubernetes.io/mode: Reconcile

kubectl apply -f sa.yaml

  • 获取token

    kubectl get secret kubectl get secret -n kube-system | grep admin-token | awk '{print $1}' -o jsonpath={.data.token} -n kube-system | base64 -d

image.png