Helm部署

红米2年前技术文章557

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服务器,如下图所示:

01.png

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 配置认证

  • 设计原理

它是一个线程的方式运行

  1. Helm-cotroller 运行在master节点并list/walch HelmChart CRD对象

  2. CRD onChange时执行Job更新

  3. Job Container使用rancherklilpper-helm为entrypoint

  4. Killper-helm内 thelm cli,可以安装/升级/删除对应的chart


相关文章

查看 Redis 不过期 key

查看 Redis 不过期 key

一、使用 Rdbtools 工具包使用 Rdbtools 工具包通过分析备份 rdb 文件,可以查看期间大 key 情况及过期时间情况。输出 csv 文档列信息情况详见下方附件--安装 rdb 工具包...

DRDS 整库恢复介绍

DRDS 整库恢复介绍

1 整库恢复注意事项1、PolarDB-X 1.0自动备份策略默认关闭,需要您手动开启。PolarDB-X 1.0日志备份能力依赖下层RDS,PolarDB-X1.0控制台设置的日志备份策略会自动同步...

MySQL 闪回技术总结

MySQL 闪回技术总结

一、闪回技术汇总1. 第一类为以 patch 形式集成到官方工具 mysqlbinlog 中,阿里彭立勋 2012 年曾提交过相关工具;2. 第二类是独立工具,通过伪装 Slave 拉取 Binlog...

Redis 大 key

1、bigkeysRedis提供了 bigkeys 参数能够使 redis-cli 以遍历的方式分析 Redis 实例中的所有 Key ,并返回 Key 的整体统计信息与每个数据类型中 Top1 的大...

RAID磁盘阵列详解

RAID磁盘阵列详解

1 RAID原理无论是DAS、NAS还是SAN,都是存储系统,一个存储系统可以包含多块磁盘。不同磁盘之间的组织排列,就是磁盘阵列技术,也就是RAID技术。RAID磁盘阵列技术的核心思想主要有两个,包括...

MySQL 在线开启 GTID

MySQL 在线开启 GTID

描述生产环境上也会遇到需要开启 GTID ,有什么风险?如何在线开启?本篇 SOP 将介绍。GTID 限制由于基于 GTID 复制依赖于事务,所有开启 GTID 时,有些 MySQL 特性不支持:事务...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。