Helm部署
1、helm介绍
在没使用helm之前,向Kubernetes部署应用,需要依次部署deployment、svc等,步骤教繁琐,况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了kubernetes应用的部署和管理。
helm的本质就是让k8s的应用管理(deployment、service等)可配置,能动态生成,通过动态生成k8s资源清单文件(deployment.yaml、service.yaml等),然后调用kubectl自动执行k8s资源部署。
helm是官方提供的类似于yum的包管理器,是部署环境的流程封装。helm有两个重要的概念:chart和release。
chart:是创建一个应用的信息合集,包括各种的kubernetes对象的配置模版、参数定义、依赖管理、文档说明等。chart是应用部署的自包含逻辑单元,可以将chart想象成apt、yum中的软件安装包。
release:是chart的运行实例,代表了一个正在运行的应用。当chart被安装到Kubernetes集群,就生成了一个release,chart能够多次安装到同一个集群,每次安装都是一个release。
Helm包含两个组件:Helm客户端和Tiller服务器,如下图所示:
helm客户端负责chart和release的创建和管理以及和Tiller的交互。Tiller服务器运行在Kubernetes集群中,它会处理helm的客户端的请求,与Kubernetes API Server 交互。
2、helm2部署
下载安装包:
wget [https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz](https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz)
解压:
tar -zxvf helm-v2.13.1-linux-amd64.tar.gz
进入目录:
cd linux-amd64/
复制执行文件至/usr/bin
cp helm /usr/bin/
为了安装服务端tiller,还需要在确保该机器上已配置好kubectl工具和kubeconfig文件,确保kubectl工具可以在这台机器上访问apiserver并且正常使用。此处的matser节点已经配置好了kubectl。
因为kubernetes APIServer开启了RBAC访问控制,(从Kubernetes 1.6开始,基于角色的访问控制默认是启用的。RBAC允许你根据你组织中的用户和角色指定行为类型。)所以需要创建tiller使用的 service account: tiller 并分配合适的角色给它。详细内容可以查看helm文档中的 https://docs.helm.sh/using_helm/#role-based-access-control
这里简单起见直接分配cluster-admin这个集群内置的ClusterRole给它。创建rbac-config.yaml文件:
[root@k8s-master opt]# cat rbac-helm.yaml apiVersion: v1 kind: ServiceAccount metadata: name: tiller namespace: kube-system --- apiVersion: [rbac.authorization.k8s.io/v1beta1](http://rbac.authorization.k8s.io/v1beta1) kind: ClusterRoleBinding metadata: name: tiller roleRef: apiGroup: [rbac.authorization.k8s.io](http://rbac.authorization.k8s.io) kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: tiller namespace: kube-system
执行yaml文件:
kubectl apply -f rbac-helm.yaml
初始化helm:
helm init --service-account tiller --skip-refresh
正常情况下执行 helm init 即可,
但是在kubernetes 1.16.0及之后的版本上执行却报错误:
原因是因为1.16.0之后的deployment 的apiversion的endpoint发生了变化。
解决方法,执行如下命令:
helm init --service-account tiller --override spec.selector.matchLabels.'name'='tiller',spec.selector.matchLabels.'app'='helm' --output yaml | sed 's@apiVersion: extensions/v1beta1@apiVersion: apps/v1@' | kubectl apply -f rbac-helm.yaml
安装完成之后查看版本:
helm version
此时发现,再次报错,查看对应pod,发现镜像拉取失败
执行命令:
kubectl describe pod tiller-deploy-6fc68fb6d5-l5bqw -n kube-system
查看镜像拉取地址。
修改该pod的镜像下载地址为:registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3
kubectl edit pod tiller-deploy-6fc68fb6d5-l5bqw -n kube-system
再次查看该pod已正常运行
3、helm基础使用
a、查看helm版本信息
命令:helm version
查看helm版本信息,必须保证可以查看出来client和server,才可正常使用helm
发生报错:socat not found
解决方案:集群中有节点主机缺少socat软件包,检查集群中所有节点是否缺少socat软件包,然后下载安装
yum install -y socat
b、配置helm仓库
命令:helm repo list
默认是Google,在国外,速度特别慢,所以需要更换为国内源
[root@k8s-master opt]# helm repo add stable \ [ \ ( "stable" has been added to your repositories
c、更新仓库
helm repo update
d、安装服务
helm search mysql #查看服务包 helm inspect stable/mysql #查看安装包信息
安装报错:解决方法:查看集群支持Deployment版本
命令:kubectl explain deployment
进入目录:/root/.helm/cache/archive
将文件解压:tar -zxvf mysql-0.3.5.tgz
进入目录:/root/.helm/cache/archive/mysql/templates
修改文件:deployment.yaml,将apiVersion修改为如下内容:
接下来从本地安装mysql
helm install /root/.helm/cache/archive/mysql
再次修改文件:deployment.yaml,
添加如下内容:
spec: selector: matchLabels: app: {{template "mysql.fullname" .}}
4、helm3部署
安装的前提条件:
kubernetes集群已经就绪
配置了正确权限的kubeconfig,在helm与API Server通信时使用
本地kubectl客户端工具已经配置就绪
安装方式有多种选择,例如:使用二进制文件安装、使用脚本安装、使用包管理器安装等等。
a、下载安装helm3
地址:https://github.com/helm/helm/releases
#解压
tar -zxvf helm-v3.5.4-linux-arm64.tar.gz ln -s /software/linux-amd64/helm /usr/bin/helm
b、查看版本:
helm version
c、基本概念:
在 helm 中有三个关键概念:Chart,Repo 及 Release
Chart: 一系列 k8s 资源集合的命名,它包含一系列 k8s 资源配置文件的模板与参数,可供灵活配置
Repo: 即 chart 的仓库,其中有很多个 chart 可供选择,如官方 helm/charts[5]
Release: 当一个 Chart 部署后生成一个 release
Chart 简介
使用 helm create 创建一个 chart,了解简单 chart 的目录结构:
#创建一个 chart
[root@master01 ~]# helm create test Creating test
打印test目录结构 --dirsfirst #先打印文件夹名称
[root@master01 ~]# tree --dirsfirst test/
test/
├── charts
├── templates
│ ├── tests
│ │ └── test-connection.yaml
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml │ └── service.yaml
├── Chart.yaml └── values.yaml
主要查看两个文件目录
templates/: 这是配置文件模板,示例是最简单应用的资源配置,但复杂应用还会有 pvc,role,service-acount 等等
values.yaml: 这是可选参数配置文件,但是大部分参数都已经内置了
d、使用 helm 3部署基础服务
1)添加相关repo源:
通过 helm repo add 可以添加 Repo,这里列出几个频率使用较高的 Repo
helm
bitnami
如果在国内有网络问题,可以使用阿里云镜像:
helm repo add stable https://apphub.aliyuncs.com/stable
另外,对于一些大软件公司也会维护自己的 Chart,如 gitlab,elasti
elastic
gitlab
2)查找相关 Chart
helm search repo redis
3)选定 Chart,跟进 Chart 的官方文档
添加国内源
helm repo add stable http://mirror.azure.cn/kubernetes/charts
4)添加harbor源
helm repo add harbor https://helm.goharbor.io
5、总结两个版本区别
1、helm v2 版本
包含两个组件,分别是 helm 客户端 和 Tiller 服务器,
helm 是一个命令行工具,用于本地开发及管理chart,chart仓库管理等
Tiller 负责接收 Helm 的请求,与 k8s 的 apiserver 交互
2、helm v3 版本
移除了Tiller helm直接和K8s交互
SA通过 kuberconfig 配置认证
设计原理
它是一个线程的方式运行
Helm-cotroller 运行在master节点并list/walch HelmChart CRD对象
CRD onChange时执行Job更新
Job Container使用rancherklilpper-helm为entrypoint
Killper-helm内 thelm cli,可以安装/升级/删除对应的chart