Helm部署

红米11个月前技术文章240

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


相关文章

Flink关于HiveCatalog

HiveCatalogHiveCatalog 有两个用途:作为原生 Flink 元数据的持久化存储,以及作为读写现有 Hive 元数据的接口。配置在flink-sql-connector-hive-1...

使用clickhouse-backup备份和恢复数据

使用clickhouse-backup备份和恢复数据

介绍clickhouse-backup是altinity提供的一个clickhouse数据库备份和恢复的工具,开源项目地址:https://github.com/Altinity/clickhouse...

爬坑记录------容器内外网络不通,端口无法访问

爬坑记录------容器内外网络不通,端口无法访问

背景:客户需要一套datahub用于分许sparksql血缘,因此需要基于docker搭建,在搭建过程中遇到一个较坑的问题,这里做以记录搭建完成后查看docker容器已经正常启动查看红框中的内容信息,...

MySQL 8.0 新特性:innodb_dedicated_server

MySQL 8.0 新特性:innodb_dedicated_server

一、前言Innodb Dedicated Server 是 8.0 版本推出的一个参数,开启之后可以根据服务器的配置自适应 innodb 引擎中的一些重要影响性能的参数,默认是关闭的。二、参数测试使用...

开启cgroup

开启cgroup

Control groups 是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的的物理资源的机制。Cgroup 子系统:blkio、CPU、cpuacct、cpuset、devices、...

Serverless 技术选型

Serverless 技术选型

在 Serverless 这个大领域中,不只有函数计算这一种产品形态和应用类型,而是面向不同的用户群体和使用习惯,都有其各自适用的 Serverless 产品。例如面向函数的函数计算、面向应用的 Se...

发表评论    

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