K8S—Helm

news/2024/11/22 22:36:27/

一、Helm介绍 

        helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用的部署和管理。

        Helm本质就是让k8s的应用管理(Deployment、Service等)可配置,能动态生成。通过动态生成K8S资源清单文件(deployment.yaml、service.yaml)。然后kubectl自动调用K8S资源部署。

        对于K8s来说,应用资源配置可以定义为K8s API对象,包括Deployment,Namespace,Service, PV(Persistent Volumes)和PVC(PersistentVolumeClaims)等等。通常一个应用的部署会涉及很多资源的共同协作,用户会定义这些API对象到一系列Yaml文件中,然后通过kubectl来逐一进行部署。

        那么问题来了,假如我没接触过K8s, 只想部署个应用了解下,不会写Yaml一个个配这些资源对象怎么破?需要去结合K8s文档学习Yaml语法。过了几天我终于学会了,一个个配好了这些资源对象的Yaml文件,并逐一部署在这台机器上。后面想在这台机器上再重复部署几套,另外还有十台环境要配成和这台一样,怎么办?拷贝过去再一一部署出来?这配置管理也太麻烦了,不好用,直接劝退!

        先别急!幸好已经有Helm,避免了我们去完成这些繁琐配置和维护过程。它能够把这些零零散散的应用资源文件放在一起进行统一配置,极大方便了开发人员对K8s集群应用的管理。

1、Helm 组件及相关术语 

       Helm是官方提供类似于YUM的包管理,是部署环境的流程封装,Helm有三个重要的概念:chart、release和Repository

  • Helm:Helm 是一个命令行下的客户端工具。主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。
  • Tiller:Tiller 是 Helm 的服务端,部署在 Kubernetes 集群中。Tiller 用于接收 Helm 的请求,并根据 Chart 生成 Kubernetes 的部署文件( Helm 称为 Release ),然后提交给 Kubernetes 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。
  • Chart:Helm 的软件包,采用 TAR 格式。类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件。Chart有特定的文件目录结构,如果开发者想自定义一个新的 Chart,只需要使用Helm create命令生成一个目录结构即可进行开发。
  • Repoistory:Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository, 官方仓库的地址是https://hub.helm.sh。
  • Release:使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。

2、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部署

        现在越来越多的公司和团队开始使用Helm这个Kubernetes的包管理器,我们也会使用Helm安装Kubernetes的常用组件。Helm由客户端命令helm工具和服务端tiller组成。

        helm的GitHub地址:https://github.com/helm/helm

方式一:使用官方提供的脚本一键安装

curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh

方式二:手动下载安装

wget https://get.helm.sh/helm-v3.11.3-linux-amd64.tar.gz
tar -zxvf helm-v3.11.3-linux-amd64.tar.gz
cd linux-amd64/
cp helm /usr/local/bin/
echo "source <(helm completion bash)" >> ~/.bashrc
source ~/.bashrc

做完上述设置后即可使用helm search搜索官方helm hub chart库 

helm search hub nginx

添加第三方Chart库

helm repo add stable http://mirror.azure.cn/kubernetes/charts/    
helm repo add aliyun  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts 
helm repo add bitnami https://charts.bitnami.com/bitnami

 查看Chart库

helm repo list

 可以使用helm search repo从你所添加的仓库中查找chart的名字

helm search repo nginx

三、helm部署nginx应用

1、harbor仓库相关配置

在harbor仓库中新建项目(公开):bitnami,再拉取镜像

docker pull bitnami/nginx:1.19.7-debian-10-r1

上传镜像到harbor仓库

docker push 192.168.65.30:88/bitnami/nginx:1.19.7-debian-10-r1

2、nginx Chart包

拉取nginx Chart包并做相应配置

helm pull bitnami/nginx --version 14.1.1

解压nginx Chart包

tar -zxf nginx-14.1.1.tgz

修改配置文件

cd nginx/
vim values.yaml9 global:10   imageRegistry: 192.168.65.30:88    # 指定仓库地址71 image:                               # 指定镜像72   registry: docker.io73   repository: bitnami/nginx74   tag: 1.19.7-debian-10-r175   digest: ""
523 service:
524   ## @param service.type Service type
525   ##
526   type: ClusterIP                   # 设置service类型

2.1、测试nginx部署效果

安装webserver

helm install webserver .

查看详细信息

helm status webserver

查看分配到的IP,再访问服务

kubectl get all 
curl 查看到的ip

2.2、升级与回滚

修改配置文件

vim values.yaml
120 replicaCount: 3

 升级

helm upgrade webserver .

查看升级结果

kubectl get pod

查看记录

helm history webserver

御载

helm uninstall webserver

三、构建Helm Chart

1、创建

创建一个mychart

helm create mychart

mychart目录结结

tree .
.
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml
  • 目录结构说明:

charts/:包含 chart 所依赖的其他 chart 

Chart.yaml:用于描述 chart 信息的 yaml 文件,应用描述相关文件

templates/:chart 模板文件,引入变量值后可以生成用于 Kubernetes 的 manifest 文件

templates/NOTES.txt:可选: 包含简短使用说明的纯文本文件
values.yaml:用于存储 chart 所需要的默认配置,应用部署相关文件

以下是可选文件:

— LICENSE:用于存储关于 chart 的 LICENSE 文件

— README.md:README 文件
— values.schema.json:一个使用JSON结构的 values.yaml 文件
— crds/:自定义资源的定义
 
 

  • Chart.yaml文件结构和说明

        Chart.yaml文件是chart包中必须存在的文件,它包含以下字段:

apiVersion: 			# chart API 版本信息, 通常是 "v1" (必须)
name: 					# chart 的名称 (必须)
version: 				# chart 包的版本 (必须)
kubeVersion: 			# 指定 Kubernetes 版本 (可选)
type: 					# chart类型 (可选)
description: 			# 对项目的描述 (可选)
keywords:- 					# 有关于项目的一些关键字 (可选)
home: 					# 项目 HOME 页面的 URL 地址 (可选)
sources:- 					# 项目源码的 URL 地址 (可选)
dependencies: 			# chart 必要条件列表 (可选)- name: 				# chart名称 (nginx)version: 			# chart版本 ("1.2.3")repository: 		# (可选)仓库URL ("https://example.com/charts") 或别名 ("@repo-name")condition: 			# (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled )tags: 				# (可选)- 				# 用于一次启用/禁用 一组chart的tagimport-values: 		# (可选)- 				# ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项alias: 				# (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用
maintainers: 			# (可选)维护者信息- name: 				# 维护者的名称email: 				# 维护者的邮件地址url: 				# 维护者的个人主页
engine: gotpl 			# 模板引擎的名称(可选,默认为 gotpl)
icon: 					# (可选)指定 chart 图标的 SVG 或 PNG 图像的 URL
appVersion: 			# 应用程序包含的版本
deprecated: 			# (可选,使用布尔值)该 chart 是否被废弃
annotations:example: 				# 按名称输入的批注列表 (可选).

设置配置文件values.yaml

vim values.yaml7 image:8   repository: myapp         # 指定镜像9   pullPolicy: IfNotPresent10   # Overrides the image tag whose default is the chart appVersion.11   tag: "v1"                 # 指定tag

检查依赖和模板配置是否正确

helm lint .

 打包

cd ..
helm package mychart/

添加第三方仓库,这个charts项目需要提前在harbor仓库中创建

helm repo add --username admin --password Harbor12345 mychart http://192.168.65.30:88/chartrepo/chart

1.1、安装push插件

helm plugin install https://github.com/chartmuseum/helm-push,现在用离线安装

wget https://github.com/chartmuseum/helm-push/releases/download/v0.10.3/helm-push_0.10.3_linux_amd64.tar.gz

获取插件目录

helm env
HELM_BIN="helm"
HELM_BURST_LIMIT="100"
HELM_CACHE_HOME="/root/.cache/helm"
HELM_CONFIG_HOME="/root/.config/helm"
HELM_DATA_HOME="/root/.local/share/helm"
HELM_DEBUG="false"
HELM_KUBEAPISERVER=""
HELM_KUBEASGROUPS=""
HELM_KUBEASUSER=""
HELM_KUBECAFILE=""
HELM_KUBECONTEXT=""
HELM_KUBEINSECURE_SKIP_TLS_VERIFY="false"
HELM_KUBETLS_SERVER_NAME=""
HELM_KUBETOKEN=""
HELM_MAX_HISTORY="10"
HELM_NAMESPACE="default"
HELM_PLUGINS="/root/.local/share/helm/plugins"      # push插件目录
HELM_REGISTRY_CONFIG="/root/.config/helm/registry/config.json"
HELM_REPOSITORY_CACHE="/root/.cache/helm/repository"
HELM_REPOSITORY_CONFIG="/root/.config/helm/repositories.yaml"

创建插件目录 

mkdir -p /root/.local/share/helm/plugins/helm-push/
cd /root/.local/share/helm/plugins/helm-push/

解压包 

tar -zxf helm-push_0.10.3_linux_amd64.tar.gz

查看插件

helm plugin list

上传chart包到仓库 

helm cm-push --username=admin --password=Harbor12345 nginx-14.1.1.tgz mychart

查询chart

helm search repo mychart

拉取chart

helm pull mychart/mychart --version=0.1.0

 1.2、部署

部署mychart应用到集群

helm install webserver mychart


http://www.ppmy.cn/news/67173.html

相关文章

Vue3双向绑定的坑 坑死人了

1.1 vue 3 的v-model使用原理&#xff1a; <child-comp v-model"msg" /> //可翻译为 <child-comp :modelValue"msg" update:modelValue"msg$event" /> 单个数据双向绑定完整示例 //父组件代码 <child-comp v-model"name…

[元带你学NVMe] NVMe 1.4新特性:持久存储区域

声明 主页:元存储的博客_CSDN博客 依公开知识及经验整理,如有误请留言。 个人辛苦整理,付费内容,禁止转载。 内容摘要 前言 企业级NVMe固态硬盘自带有大容量的DRAM缓存,并且处于断电保护设计之下。PMR(Persistent Memory Region)空间提供了一种内存级读写速度、断电后数据…

用于分布式系统的ID?——UUID(Universally Unique Identifier,通用唯一识别码)

用于分布式系统的ID?——UUID&#xff08;Universally Unique Identifier&#xff0c;通用唯一识别码&#xff09; UUID 是 通用唯一识别码&#xff08;Universally Unique Identifier&#xff09;的缩写&#xff0c;是国际标准化组织&#xff08;ISO&#xff09;提出的一个概…

常用端口号/etc/services

/etc/services文件存储的内容。记录一下&#xff0c;防止忘记。 # /etc/services: # $Id: services,v 1.1 2004/10/09 02:49:18 andersen Exp $ # # Network services, Internet style # # Note that it is presently the policy of IANA to assign a single well-known # por…

原型/原型链/构造函数/类

认识构造函数 为什么有构造函数 因为一般的创建对象的方式一次只能创建一个对象, 利用工厂模式创建的对象&#xff0c;对象的类型都是Object类型 什么是构造函数 构造函数也称之为构造器&#xff08;constructor&#xff09;&#xff0c;通常是我们在创建对象时会调用的函数…

C++实现简单工厂和工厂方法以及抽象工厂

工厂类型设计模式 把new给封装起来,即对象的创建封装起来 一种创建型设计模式 简单工厂 假设场景&#xff1a;用工厂来创建不同的汽车 优点&#xff1a;把对象的创建封装在一个接口函数里面&#xff0c;通过传入不同标识来返回不同的对象。客户不用自己负责创建对象(new)&…

【C语言】测试4 循环程序设计

若 x, i, j, k 都是 int 型变量,则计算下面表达式后, x 的值为( )。 x=( i=4 , j=16 , k=32); A. 4 B. 16 C. 32 D. 52 正确答案: C 以下能正确计算123* ⋯ 10 的程序段是( )。 A. do {i=1;s=1; s=si; i++; }while(i<=10); B. do {i=1;s=0; s=si; i++; }w…

【设计模式】模板方法模式--让你的代码更具灵活性与可扩展性

文章目录 前言模板方法模式的定义核心组成模板方法模式与其他设计模式的区别 代码实现抽象类具体类Client 经典类图spring中的例子 总结 前言 在软件开发中&#xff0c;设计模式是一种经过实践检验的、可复用的解决方案&#xff0c;它们可以帮助我们解决某一特定领域的典型问题…