Helm部署

红米1年前技术文章477

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


相关文章

MySQL运维实战(7.1) 开启GTID复制

MySQL从5.6版本开始支持GTID复制。开启GTID之后,主库上执行的每一个事务都有一个全局唯一的ID。GTID由两部分组成:server_uuid和事务序列号。初始化数据库时,会生成一个全局唯一...

Golang 垃圾回收

Golang 垃圾回收

1、标记清除算法Golang 使用标记清除算法作为垃圾回收器的一部分。标记清除算法是一种常见的垃圾回收算法,它通过标记和清除未被引用的对象来回收内存空间。Golang 中,垃圾回收器会定期扫描堆空间,...

CDH实操--CDH集成Trino(三)

CDH实操--CDH集成Trino(三)

1、将parcel包放到对应下载目录将parcel包放到/var/www/html/trino目录下修改httpd配置文件新增parcel文件类型然后通过命令启动httpd服务:systemctl s...

Hive与HBase整合文档

Hive与HBase整合文档

1.Hive整合HBase配置1.拷贝hbase 相关jar包将hbase 相关jar包拷贝到hive lib目录下hbase-client-0.98.13-hadoop2.jar hbase-co...

数据湖技术之iceberg(六)Iceberg表数据组织与查询

数据湖技术之iceberg(六)Iceberg表数据组织与查询

1     Iceberg表数据组织与查询1) 下载avro-tools jar包由于后期需要查看avro文件内容,我们可以通过avro-tool.jar来查看...

MySQL 8.0 新特性:Clone Plugin

MySQL 8.0 新特性:Clone Plugin

一、前言MySQL 在 8.0.17 加入了克隆插件,可以从本地或者远程克隆数据,比如需要创建主从关系,我们一般都是通过物理备份来做,那如果你使用的是 MySQL 8.0.17 及以上的版本那么就可以...

发表评论    

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