Helm简介

一、Helm核心概念:

  • Chart:一个helm的程序包;

  • Repostriy:Charts仓库,https/http服务;

  • Release:特定的chart部署与目标集群上的一个实例;

    Chart—>Config—>Release

程序架构:

  • helm:客户端,管理本地的Chart仓库,管理Chart,与Tiller服务器交互,发送Chart,实例安装、查询、卸载等操作。
  • Tiller:服务端,接受helm发来的Charts与Config,合并生成Release;

helm官方可用的chart列表:
helm官方可用的chart
go语言编写,基于gRPC协议与Tiller进行通信交互。

组件

Helm 有两个主要部分:

helm架构图

图片来自-Helm – Application deployment management for Kubernetes

Helm Client 是最终用户的命令行客户端。客户端负责以下部分:

  • 本地 chart 开发
  • 管理存储库
  • 与 Tiller 服务交互
  • 发送要安装的 chart
  • 查询有关发布的信息
  • 请求升级或卸载现有 release

Tiller Server 是一个集群内服务,与 Helm 客户端进行交互,并与 Kubernetes API 服务进行交互。服务负责以下内容:

  • 监听来自 Helm 客户端的传入请求
  • 结合 chart 和配置来构建发布
  • 将 chart 安装到 Kubernetes 中,然后跟踪后续 release
  • 通过与 Kubernetes 交互来升级和卸载 chart

简而言之,客户端负责管理 chart,而服务端负责管理 release。

二、helm的安装

Helm Client安装

基于二进制文件进行安装

  1. 在github上选择对应版本,点击这里
$ wget "https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz"
  1. 解压
tar -zxvf helm-v2.13.1-linux-amd64.tar.gz
  1. 将二进制文件移动到bin目录下
mv linux-amd64/helm /usr/local/bin/helm

脚本安装

$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh
$ chmod 700 get_helm.sh
$ ./get_helm.sh

或者使用的

$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get | bash

Tiller server安装

1.使用helm init命令进行安装,该命令将会在kubectl当值context指定集群内的kube-system命名空间创建一个deployment和一个Service。但是helm init时使用的Deployment使用的镜像是gci.io/kubernetes-helm/tiller:[Helm-Verison],helm的版本可以通过helm version获得。

如果服务器无法访问gcr.io,可以先pull下来镜像,push至私有镜像仓库。

初始化时使用-i或着--tiller-images指定镜像

$ heml init -i [YOUR_REPO]/kubernetes-helm/tiller:v2.13.1

如果你的kubernetes cluster使用了RBAC还需要创建Serviceaccount rbac-config.yaml:

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

创建RBAC

$ kubectl create -f rbac-config.yaml
serviceaccount "tiller" created
clusterrolebinding "tiller" created
$ helm init --service-account tiller --history-max 200

查看是否创建成功

$ kubectl get serviceaccount -n kube-system
NAME      SECRETS   AGE
default   1         107d
tiller    1         1min

查看的Tiller是否部署成功

$ kubectl get pods -n kube-system
NAME                            READY     STATUS    RESTARTS   AGE
tiller-deploy-8bc864b8d-9sl5z   1/1       Running   0          1min

测试安装是否正确,helm是否可用,安装redis,报错uid : unable to do port forwarding: socat not found. 详细报错如下:

$ helm install stable/redis-ha --version 3.3.3
  E0407 23:29:03.101684   24867 portforward.go:391] an error occurred forwarding 34855 -> 44134: error forwarding port 44134 to pod a37813193576bbb1f3ed88f318361608345766234eb8accdeaee494153be6ece, uid : unable to do port forwarding: socat not found.

解决方式:

$ yum install -y socat

三、helm的使用

helm install

$ helm install stable/redis
NAME:   nosy-echidna
LAST DEPLOYED: Mon Apr  8 02:17:48 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/ConfigMap
NAME                       DATA  AGE
nosy-echidna-redis         3     0s
nosy-echidna-redis-health  3     0s

==> v1/Pod(related)
NAME                                       READY  STATUS             RESTARTS  AGE
nosy-echidna-redis-master-0                0/1    Pending            0         0s
nosy-echidna-redis-slave-68d5f64f4f-6bzcx  0/1    ContainerCreating  0         0s

==> v1/Secret
NAME                TYPE    DATA  AGE
nosy-echidna-redis  Opaque  1     0s

==> v1/Service
NAME                       TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)   AGE
nosy-echidna-redis-master  ClusterIP  10.254.233.50  <none>       6379/TCP  0s
nosy-echidna-redis-slave   ClusterIP  10.254.13.10   <none>       6379/TCP  0s

==> v1beta1/Deployment
NAME                      READY  UP-TO-DATE  AVAILABLE  AGE
nosy-echidna-redis-slave  0/1    1           0          0s

==> v1beta2/StatefulSet
NAME                       READY  AGE
nosy-echidna-redis-master  0/1    0s


NOTES:
** Please be patient while the chart is being deployed **
Redis can be accessed via port 6379 on the following DNS names from within your cluster:

nosy-echidna-redis-master.default.svc.cluster.local for read/write operations
nosy-echidna-redis-slave.default.svc.cluster.local for read-only operations


To get your password run:

    export REDIS_PASSWORD=$(kubectl get secret --namespace default nosy-echidna-redis -o jsonpath="{.data.redis-password}" | base64 --decode)

To connect to your Redis server:

1. Run a Redis pod that you can use as a client:

   kubectl run --namespace default nosy-echidna-redis-client --rm --tty -i --restart='Never' \
    --env REDIS_PASSWORD=$REDIS_PASSWORD \
   --image docker.io/bitnami/redis:4.0.14 -- bash

2. Connect using the Redis CLI:
   redis-cli -h nosy-echidna-redis-master -a $REDIS_PASSWORD
   redis-cli -h nosy-echidna-redis-slave -a $REDIS_PASSWORD

To connect to your database from outside the cluster execute the following commands:

    kubectl port-forward --namespace default svc/nosy-echidna-redis 6379:6379 &
    redis-cli -h 127.0.0.1 -p 6379 -a $REDIS_PASSWORD

安装完chart之后,helm会在kube-system下创建一个Configmap来保存Release数据信息。

$ kubectl get Configmap -n kube-system
NAME                                 DATA      AGE
extension-apiserver-authentication   1         107d
newbie-leopard.v1                    1         2h
nosy-echidna.v1                      1         2m

helm install 支持多种方式部署安装

1.repostriy

2.本地Chart压缩包

3.一个Chart目录

helm install /opt/chart/redis

4.完整的URL

helm install https://example.com/charts/redis-5.0.1.tgz

搜索chart

首次安装 Helm 时,它已预配置为使用官方 Kubernetes chart 存储库 repo。该 repo 包含许多精心设计和维护的 charts。此 charts repo 默认以 stable 命名。

可以通过运行 helm search 查看有哪些 charts 可用:

$ helm search
NAME                     VERSION     DESCRIPTION
stable/drupal       0.3.2       One of the most versatile open source content m...
stable/jenkins      0.1.0       A Jenkins Helm chart for Kubernetes.
stable/mariadb      0.5.1       Chart for MariaDB
stable/mysql        0.1.0       Chart for MySQL
...

如果没有使用过滤条件,helm search 显示所有可用的 charts。可以通过使用过滤条件进行搜索来缩小搜索的结果范围:

$ helm search mysql
NAME                   VERSION    DESCRIPTION
stable/mysql      0.1.0      Chart for MySQL
stable/mariadb    0.5.1      Chart for MariaDB

现在只会看到与过滤条件匹配的结果。

为什么 mariadb 在列表中?因为它的包描述与 MySQL 相关。我们可以使用 helm inspect chart 到这个:

$ helm inspect stable/mariadb
Fetched stable/mariadb to mariadb-0.5.1.tgz
description: Chart for MariaDB
engine: gotpl
home: https://mariadb.org
keywords:
- mariadb
- mysql
- database
- sql
...

搜索是找到可用软件包的好方法。一旦找到想要安装的软件包,可以使用 helm install 它来安装它。

删除chart

helm delete

使用helm list,列出所有Release

$ helm list
NAME            REVISION    UPDATED                     STATUS      CHART           APP VERSION NAMESPACE
newbie-leopard  1           Sun Apr  7 23:34:14 2019    DEPLOYED    redis-ha-3.3.3  5.0.3       default
nosy-echidna    1           Mon Apr  8 02:17:48 2019    DEPLOYED    redis-6.4.3     4.0.14      default

删除已经部署的Release

$ helm delete newbie-leopard
release "newbie-leopard" deleted

自定义Chart配置

  • —set:在命令行设置参数。
  • --values或者使用-f: 使用yaml文件对参数进行配置,可以设置多个文件,最后一个文件优先生效。多个文件中重复的values会进行的覆盖,不用value会叠加生效。

如果同时使用两个参数,则—set会以高优先级合并到—values中。

自定义打包应用

Chart目录结构和配置文件的说明

redis-ha
├── Chart.yaml  #描述chart信息的yaml文件
├── OWNERS  # 
├── README.md #
├── templates   #config 模板
│   ├── _helpers.tpl
│   ├── NOTES.txt
│   ├── redis-auth-secret.yaml
│   ├── redis-ha-announce-service.yaml
│   ├── redis-ha-configmap.yaml
│   ├── redis-ha-healthchecks.yaml
│   ├── redis-ha-pdb.yaml
│   ├── redis-ha-rolebinding.yaml
│   ├── redis-ha-role.yaml
│   ├── redis-ha-serviceaccount.yaml
│   ├── redis-ha-service.yaml
│   ├── redis-ha-statefulset.yaml
│   └── tests
│       ├── test-redis-ha-configmap.yaml
│       └── test-redis-ha-service.yaml
└── values.yaml #默认的配置值

如果我们需要修改chart

下载Chart

$ helm fetch stable/redis

解压对应的下载下来的Chart

$ tar xvf redis-6.4.4.tar.gz

修改values.yaml中对应的值为私有仓库,redis的版本为,并重命名为test-redis

- repository: bitnami/redis
+ repository: reg.caiwu.corp/library/redis
- tag: 4.0.14
+ tag: 4.0

将Chart.yaml中的版本号修改为6.4.5,name为test-redis-ha

- name: redis
+ name: test-redis
- version: 6.4.4
+ version: 6.4.5

使用helm package test-redis打包chart,会生成一个test-redis-6.4.5.tgz的压缩文件

$ helm package .
Successfully packaged chart and saved it to: test-redis/test-redis-6.4.5.tgz

安装Chart:通过helm install test-redis-ha-0.1.1.tgz 就可以将新生成的chart部署到kubernetes集群

$ helm install test-redis-6.4.5.tgz 

helm upgrade(更新)和 helm rollbackup(回滚)

当新版本的 chart 发布时,或者当你想要更改 release 配置时,可以使用 helm upgrade 命令。

升级需要已有的 release 并根据提供的信息进行升级。由于 Kubernetes chart 可能很大而且很复杂,因此 Helm 会尝试执行最小侵入式升级。它只会更新自上次发布以来发生更改的内容。

$ helm upgrade -f panda.yaml happy-panda stable/mariadb
Fetched stable/mariadb-0.3.0.tgz to /Users/mattbutcher/Code/Go/src/k8s.io/helm/mariadb-0.3.0.tgz
happy-panda has been upgraded. Happy Helming!
Last Deployed: Wed Sep 28 12:47:54 2016
Namespace: default
Status: DEPLOYED
...

在上面的例子中,happy-panda release 使用相同的 chart 进行升级,但使用新的 YAML 文件:

mariadbUser: user1

我们可以使用 helm get values 看看这个新设置是否生效。

$ helm get values happy-panda
mariadbUser: user1

该 helm get 命令是查看集群中的 release 的有用工具。正如我们上面所看到的,它表明我们的新值 panda.yaml 已被部署到群集中。

现在,如果在发布过程中某些事情没有按计划进行,那么使用回滚到以前的版本很容易 helm rollback [RELEASE] [REVISION]

$ helm rollback happy-panda 1

上述回滚我们的 “happy-panda” 到它的第一个 release 版本。release 版本是增量修订。每次安装,升级或回滚时,修订版本号都会增加 1. 第一个修订版本号始终为 1. 我们可以使用 helm history [RELEASE] 查看特定版本的修订版号。

参考文档

Helm Document