一、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 – 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安装
基于二进制文件进行安装
- 在github上选择对应版本,点击这里
$ wget "https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz"
- 解压
tar -zxvf helm-v2.13.1-linux-amd64.tar.gz
- 将二进制文件移动到
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.test.com/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]
查看特定版本的修订版号。