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://helm.sh/docs/

中文文档地址: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,是不是比自己部署方便多了,而且还能升级和回滚。

posted @ 2019-05-28 16:38  屌丝的IT  阅读(1018)  评论(0)    收藏  举报