Helm安装使用

Helm这个东西其实早有耳闻,但是一直没有用在生产环境,而且现在对这货评价也是褒贬不一,对于单体服务,部署一套测试环境我相信还是非常快的,但是对于微服务架构的应用,要部署一套新的环境,就有点折磨人了,微服务越多、你就会越绝望的。每个微服务都得维护一套yaml文件,而且每个环境下的配置文件也不太一样,部署一套新的环境成本是真的很高。如果我们能使用类似与yum的工具来安装我们应用的话是不是就很爽歪歪了啊?Helm就相当于Kubernetes环境下的yum包管理工具。

用途

作为kubernetes的一个包管理工具,helm具有以下功能:

  • 创建新的chart
  • chart打包成tgz格式
  • 上传chart到chart仓库或从仓库中下载chart
  • 在Kubernetes集群中安装或卸载chart
  • 管理用Helm安装的chart的发布周期

重要概念

Helm 有三个重要概念:

  • chart: 包含了创建Kubernetes的一个应用实例的必要信息
  • config: 包含了应用发布配置信息
  • release:是一个chart及其配置的一个运行实例

Helm组件

Hekm有以下两个组成部分:

Helm Client是用户命令行工具,其主要负责如下:

  • 本地chart开发
  • 仓库管理
  • 与Tiller server交互
  • 发送预安装的chart
  • 查询release信息
  • 要求升级或卸载已存在的release

Tiller Server是一个部署在Kubernetes集群内部的server,其与Helm client、Kubernetes API server进行交互,Tiller server主要负责如下:

  • 监听来自 Helm client的请求
  • 通过chart及其配置构建一次发布
  • 安装chart 到Kubernetesj集群,并跟踪随后的发布
  • 通过与Kubernetes交互升级或卸载chart
  • 简单的说,client管理charts,而server管理发布release

安装

我们可以在Helm Realese页面下载二进制文件,这里下载的最新版本,解压后将可执行文件拷贝到/usr/local/bin/下即可,这样Helm客户端就在这台机器上安装完成了.

另外一个值得注意的问题是RBAC,我们的 kubernetes 集群是1.18.5版本的,默认开启了RBAC访问控制,所以我们需要为Tiller创建一个ServiceAccount,让他拥有执行的权限,详细内容可以查看 Helm 文档中的Role-based Access Control。 创建rbac.yaml文件:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system

然后使用kubectl创建:

kubectl create -f rbac-config.yaml
serviceaccount "tiller" created
clusterrolebinding.rbac.authorization.k8s.io "tiller" created
[root@master01 linux-amd64]# helm version
version.BuildInfo{Version:"v3.3.0-rc.1", GitCommit:"5c2dfaad847df2ac8f289d278186d048f446c70c", GitTreeState:"dirty", GoVersion:"go1.14.4"}

[root@master01 ~]# helm create hello-helm
Creating hello-helm

[root@master01 ~]# tree hello-helm
hello-helm
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

3 directories, 10 files

我们通过查看templates目录下面的deployment.yaml文件可以看出默认创建的 Chart 是一个 nginx 服务,具体的每个文件是干什么用的,我们可以前往 Helm 官方文档进行查看,后面会和大家详细讲解的。比如这里我们来安装 1.7.9 这个版本的 nginx,则我们更改 value.yaml 文件下面的 image tag 即可,将默认的 stable 更改为 1.7.9,为了测试方便,我们把 Service 的类型也改成 NodePort

...
image:
  repository: nginx
  tag: 1.7.9
  pullPolicy: IfNotPresent

nameOverride: ""
fullnameOverride: ""

service:
  type: NodePort
  port: 80
...
[root@master01 ~]# helm  install test ./hello-helm


[root@master01 ~]# kubectl get svc
NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes        ClusterIP   10.254.0.1       <none>        443/TCP        8d
test-hello-helm   NodePort    10.254.204.176   <none>        80:20569/TCP   19s
[root@master01 ~]# kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
test-hello-helm-5d7dcc7cf4-djpth   1/1     Running   0          23s

查看release

[root@master01 ~]# helm list
NAME    NAMESPACE    REVISION    UPDATED                                    STATUS      CHART               APP VERSION
test    default      1           2020-07-19 22:42:03.214854819 +0800 CST    deployed    hello-helm-0.1.0    1.16.0     

打包chart

[root@master01 ~]# helm package hello-helm
Successfully packaged chart and saved it to: /root/hello-helm-0.1.0.tgz

然后我们就可以将打包的tgz文件分发到任意的服务器上,通过helm fetch就可以获取到该 Chart 了。

删除release

[root@master01 ~]# helm delete test
release "test" uninstalled

然后我们看到kubernetes集群上的该 nginx 服务也已经被删除了。

kubectl get pods -l app=hello-helm
No resources found.