k8s学习笔记-Helm入门
Helm 组件及相关术语
Helm 致力于成为 Kubernetes 的包管理工具,可以方便地发现、共享和构建 Kubernetes 应用,它包含几个基本概念:
- Chart:一个 Helm 包,其中包含了运行一个应用所需要的镜像、依赖和资源定义等,还可能包含 Kubernetes 集群中的服务定义,类似 Homebrew 中的 formula,APT 的 dpkg 或者 Yum 的 rpm 文件;
- Release: 在 Kubernetes 集群上运行的 Chart 的一个实例。在同一个集群上,一个 Chart 可以安装很多次。每次安装都会创建一个新的 release。例如一个 MySQL Chart,如果想在服务器上运行两个数据库,就可以把这个 Chart 安装两次。每次安装都会生成自己的 Release,会有自己的 Release 名称;
- Repository:用于发布和存储 Chart 的仓库
Helm 组件
Helm 采用客户端/服务器架构,有如下组件组成:
helm : 客户端,管理本地的 Chart 仓库,管理 Chart, 与 Tiller 服务器交互,发送 Chart, 实例安装,查询,卸载等操作
Tiller : 服务端,接收 helm 发来的 Charts 与 Config,合并生成 release
Repository : Chart 仓库,Helm客户端通过HTTP协议来访问仓库中Chart的索引文件和压缩包

Helm 工作原理

Chart Install 过程:
Helm从指定的目录或者tgz文件中解析出Chart结构信息
Helm将指定的Chart结构和Values信息通过gRPC传递给Tiller
Tiller根据Chart和Values生成一个Release
Tiller将Release发送给Kubernetes用于生成Release
Chart Update过程:
Helm从指定的目录或者tgz文件中解析出Chart结构信息
Helm将要更新的Release的名称和Chart结构,Values信息传递给Tiller
Tiller生成Release并更新指定名称的Release的History
Tiller将Release发送给Kubernetes用于更新Release
Chart Rollback过程:
Helm将要回滚的Release的名称传递给Tiller
Tiller根据Release的名称查找History
Tiller从History中获取上一个Release
Tiller将上一个Release发送给Kubernetes用于替换当前Release
部署 Helm
项目地址:https://github.com/helm/helm
安装 Helm 客户端
https://github.com/helm/helm/releases
从版本里面选择一个最稳定的版本
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.14.0-linux-amd64.tar.gz
tar -zxvf helm-v2.14.0-linux-amd64.tar.gz
cd linux-amd64
cp helm /usr/bin/
helm -h
还有一种方式
https://github.com/helm/helm/blob/master/scripts/get
curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash
# 安装helm命令补全脚本
cd ~ && helm completion bash > .helmrc && echo "source .helmrc" >> .bashrc
安装 Helm 服务器端
Tiller通常部署于集群之上,也可以部署于本地
因为 Helm 的服务端 Tiller 是一个部署在 Kubernetes 中 Kube-System Namespace 下 的 Deployment,它会去连接 Kube-Api 在 Kubernetes 里创建和删除应用。
而从 Kubernetes 1.6 版本开始,API Server 启用了 RBAC 授权。目前的 Tiller 部署时默认没有定义授权的 ServiceAccount,这会导致访问 API Server 时被拒绝。所以我们需要明确为 Tiller 部署添加授权。
可以在配置 Helm 时使用 --service-account <NAME> 参数将服务帐户添加到 Tiller 。前提条件是必须创建一个角色绑定,来指定预先设置的角色 role 和服务帐户 service account 名称。
在前提条件下,并且有了一个具有正确权限的服务帐户,就可以像这样运行一个命令来初始化 Tiller: helm init --service-account <NAME>
RBAC配置文件:
https://github.com/helm/helm/blob/master/docs/rbac.md

vim 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
kubectl apply -f rbac-config.yaml
或者用下面的命令:
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
helm init --service-account tiller
安装时可选参数:
--canary-image,安装canary分支,即项目master分支
--tiller-image,安装指定版本的镜像,默认同helm版本
--kube-context,安装至指定的K8s集群
--tiller-namespace,安装至指定的名称空间,默认为 kube-system
注:helm init 会到gcr.io/kubernetes-helm/ 获取镜像,镜像标签同Helm版本号,需要我们更换镜像地址
在各节点用行
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.0 gcr.io/kubernetes-helm/tiller:v2.14.0
如果访问还是有问题,更换阿里云镜像和仓库
helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.0 \
--stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts --service-account tiller
[root@k8s-master linux-amd64]# kubectl get pods -n kube-system |egrep tiller
tiller-deploy-598f58dd45-pmtj7 1/1 Running 0 2m24s
查看版本
[root@k8s-master linux-amd64]# helm version
Client: &version.Version{SemVer:"v2.14.0", GitCommit:"05811b84a3f93603dd6c2fcfe57944dfa7ab7fd0", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.0", GitCommit:"05811b84a3f93603dd6c2fcfe57944dfa7ab7fd0", GitTreeState:"clean"}
说明安装成功
更新仓库
helm repo update
卸载 Helm 服务器端 Tiller
1.kubectl delete deployment tiller-deploy -n kube-system
# kubectl get deployments.apps -n kube-system tiller-deploy -o yaml
2.helm reset
Helm 快速入门
官方可用的仓库:https://hub.helm.sh/
中文文档地址:https://whmzsu.github.io/helm-doc-zh-cn/
# 列出stable仓库中所有Charts列表
helm search
helm search redis
# 显示指定Charts详情
helm inspect stable/redis
# 安装 Charts
helm install stable/redis
helm install stable/redis -n redis --dry-run # -n 指定Release名称 --dry-run 执行安装测试
helm install --name my-release stable/redis
helm install --name my-release --set redisPassword=secretpassword stable/redis
# 查看已安装的Release
helm list
# 查看状态
helm status redis
# 删除Release
helm delete redis
#升级或回滚
helm upgrade、helm rollback、helm history

chart 目录结构
chart 是 Helm 的应用打包格式。chart 由一系列文件组成,这些文件描述了 Kubernetes 部署应用时所需要的资源,比如 Service、Deployment、PersistentVolumeClaim、Secret、ConfigMap 等。
单个的 chart 可以非常简单,只用于部署一个服务,比如 Memcached;chart 也可以很复杂,部署整个应用,比如包含 HTTP Servers、 Database、消息中间件、cache 等。
chart 将这些文件放置在预定义的目录结构中,通常整个 chart 被打成 tar 包,而且标注上版本信息,便于 Helm 部署。
以前面 MySQL chart 为例。一旦安装了某个 chart,我们就可以在 ~/.helm/cache/archive 中找到 chart 的 tar 包。
[root@k8s-master ~]# cd .helm/cache/archive/
[root@k8s-master archive]# ll
-rw-r--r-- 1 root root 5536 Oct 29 22:04 mysql-0.3.5.tgz
-rw-r--r-- 1 root root 6189 Oct 29 05:03 redis-1.1.15.tgz
[root@k8s-master archive]# tar -xf mysql-0.3.5.tgz
[root@k8s-master archive]# tree mysql #(yum install tree -y )
mysql
├── Chart.yaml
├── README.md
├── templates
│ ├── configmap.yaml
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── NOTES.txt
│ ├── pvc.yaml
│ ├── secrets.yaml
│ └── svc.yaml
└── values.yaml
- Chart.yaml:YAML 文件,描述 chart 的概要信息。
- README.md:Markdown 格式的 README 文件,相当于 chart 的使用文档,此文件为可选。
- LICENSE:文本文件,描述 chart 的许可信息,此文件为可选。
- requirements.yaml :chart 可能依赖其他的 chart,这些依赖关系可通过 requirements.yaml 指定。
- values.yaml:chart 支持在安装的时根据参数进行定制化配置,而 values.yaml 则提供了这些配置参数的默认值。
- templates目录:各类 Kubernetes 资源的配置模板都放置在这里。Helm 会将 values.yaml 中的参数值注入到模板中生成标准的 YAML 配置文件。
- templates/NOTES.txt:chart 的简易使用文档,chart 安装成功后会显示此文档内容。 与模板一样,可以在 NOTE.txt 中插入配置参数,Helm 会动态注入参数值。
知道这个结构以后,我们可以对安装的包做更改,这里我修改redis 的集群只有两台集群,默认按官方仓库里面的是3个

cp values.yaml /usr/local/src
cd /usr/local/src
vim values.yaml


这里安装的时候需要提前配置好PV ,负载安装启动会报错
通过 -f 指定自己修改后的yaml 文件
helm install --name redis -f values.yaml stable/redis


helm status redis

按上面提示的就可以使用redis,是不是比自己部署方便多了,而且还能升级和回滚。

浙公网安备 33010602011771号