【云原生】用 Helm 来简化 K8s 应用管理

用 Helm 来简化 K8s 应用管理

  • 1.诞生背景
  • 2.主要功能
  • 3.相关概念
  • 4.工作原理
  • 5.架构演变
  • 6.Helm 常用命令
  • 7.推荐仓库
  • 8.Charts
    • 8.1 目录结构
    • 8.2 构建一个无状态应用模版 charts

Helm 对于 Kubernetes 来说就相当于 Yum 对于 Centos 来说,如果没有 Yum 的话,我们在 Centos 下面要安装一些应用程序是极度麻烦的,同样的,对于越来越复杂的 Kubernetes 应用程序来说,如果单纯依靠我们去手动维护应用程序的 YAML 资源清单文件来说,成本也是巨大的。

Helm 是 Deis 开发的一个用于 Kubernetes 的 包管理器。每个包称为一个 Chart,一个 Chart 是一个目录(一般情况下会将目录进行打包压缩,形成 name-version.tgz 格式的单一文件,方便传输和存储)。

对于应用发布者而言,可以通过 Helm 打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。

除此以外,Helm 还提供了 Kubernetes 上的软件部署,删除,升级,回滚应用的强大功能。

1.诞生背景

K8s 是一个分布式的容器集群管理系统,它将集群中的所有资源都抽象成 API 对象,并且使用声明的方式来创建、修改、删除这些对象。在微服务盛行的今天,如果使用这种方式将导致大量 API 声明文件的编写维护,使运维工作量爆发式增长,并且对每个微服务应用都需要编写对应的 YAML 配置文件,极容易出错,维护困难。Helm 就是为解决这些问题而诞生的。

在云(Kubernetes)上,部署一个应用往往不是那么简单。如果想要部署一个应用程序到云上,首先要准备好它所需要的环境,打包成 Docker 镜像,进而把镜像放在 部署文件Deployment)中,配置 服务Service)、应用所需的 账户ServiceAccount)及 权限Role)、命名空间Namespace)、密钥信息Secret)、可持久化存储PersistentVolumes)等资源。也就是编写一系列互相相关的 YAML 配置文件,将它们部署在 Kubernetes 集群上。

即便应用的开发者可以把这些 Docker 镜像存放在公共仓库中,并且将所需的 YAML 资源文件提供给用户,用户仍然需要自己去寻找这些资源文件,并把它们一一部署。倘若用户希望修改开发者提供的默认资源,比如使用更多的 副本Replicas)或是修改服务 端口Port),他还需要自己去查需要在这些资源文件的哪些地方修改,更不用提版本变更与维护会给开发者和用户造成多少麻烦了。

2.主要功能

Helm 主要功能如下:

  • 查找要安装和使用的预打包软件(Chart)
  • 轻松创建和托管自己的软件包
  • 将软件包安装到任何 K8s 集群中
  • 查询集群已安装和正在运行的程序包
  • 更新、删除、回滚或查看已安装软件包的历史记录

从使用方角度看:

  • 应用发布者:可以通过 Helm 打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。Helm 还提供了 Kubernetes 上的软件部署,删除,升级,回滚应用的强大功能。
  • 使用者:使用 Helm 后不用需要了解 Kubernetes 的 Yaml 语法并编写应用部署文件,可以通过 Helm 下载并在 Kubernetes 上安装需要的应用。

3.相关概念

在这里插入图片描述

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

4.工作原理

在这里插入图片描述
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

5.架构演变

在 2019 年 11 月 4 日,Helm 社区 repo 中提供安全审计报告 , Helm v3 中的访问控制与 Helm v2 中的访问控制发生变更。

  • 移除 Tiller
  • 支持将 Chart 推送至 Docker 镜像仓库中
  • 使用 JSONSchema 验证 chart values
  • 给 helm charts 添加 test 了,通过 helm test 命令针对部署的应用跑 tests
  • 部署时 release name 必须指定,helm2 时可自动随机生成
  • 删除时无须再使用 –purge
  • 为了更好地协调其他包管理者的措辞 Helm CLI 个别更名;helm delete 更名为 helm uninstallhelm inspect 更名为 helm showhelm fetch 更名为 helm pull
  • 不再需要 requirements.yaml,依赖关系是直接在 chart.yaml 中定义
  • 移除了用于本地临时搭建 Chart Repository 的 helm serve 命令

6.Helm 常用命令

命令
描述
create创建一个 chart 并指定名字
dependency管理 chart 依赖
get下载一个 release。可用子命令:allhooksmanifestnotesvalues
history获取 release 历史
install安装一个 chart
list列出 release
package将 chart 目录打包到 chart 存档文件中
pull从远程仓库中下载 chart 并解压到本地,helm pull stable/mysql --untar
repo添加、列出、移除、更新和索引 chart 仓库。可用子命令:addindexlistremoveupdate
rollback从之前版本回滚
search根据关键字搜索 chart。可用子命令:hubrepo
show查看 chart 详细信息。可用子命令:allchartreadmevalues
status显示已命名版本的状态
template本地呈现模板
uninstall卸载一个 release
upgrade更新一个 release
version查看 helm 客户端版本

7.推荐仓库

难免需要安装一些三方的基础服务,常用仓库如下 :

  • bitnami 官方地址:https://bitnami.com/
  • 微软仓库:http://mirror.azure.cn/kubernetes/charts/
  • 阿里云仓库:https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
  • 官方仓库:https://hub.kubeapps.com/charts/incubator
  • elasticsearch:https://helm.elastic.co
添加微软仓库为 stable
$ helm repo add stable http://mirror.azure.cn/kubernetes/charts
"stable" has been added to your repositories
 
添加阿里云仓库为 aliyun
$ helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts 
"aliyun" has been added to your repositories

查看本地已添加的仓库
$ helm repo list 
NAME    URL                                                   
stable  http://mirror.azure.cn/kubernetes/charts              
aliyun  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

查看仓库所有的包
$ helm search repo stable

移除仓库
$ helm repo remove stable

列出仓库中相关的包
$ helm search repo mysql

8.Charts

8.1 目录结构

demochart/
├── charts                          # 目录用于存放所依赖的子chart
├── Chart.yaml                      # 描述这个 Chart 的相关信息、包括名字、描述信息、版本等
├── templates                       # 模板目录,通常会使用values.yaml配置内容进行填充,板引擎渲染此目录的文件后Tiller将渲染得到的结果 提交给Kubernetes创建响应的对象
│   ├── deployment.yaml             # deployment 控制器的 Go 模板文件
│   ├── _helpers.tpl                # 模板助手文件,定义的值可在模板中使用
│   ├── ingress.yaml                # ingress 的模板文件 
│   ├── NOTES.txt                   # Chart 部署到集群后的一些信息,例如:如何使用、列出缺省值,可以理解为帮助文档
│   ├── serviceaccount.yaml
│   ├── service.yaml                # service 的 Go 模板文件
└── values.yaml                     # 模板的值文件,这些值会在安装时应用到 GO 模板生成部署文件

Chart.yaml 的模板及注释如下:

apiVersion: chart API 版本 (必需)  #必须有
name: chart名称 (必需)     # 必须有 
version: 语义化2 版本(必需) # 必须有

kubeVersion: 兼容Kubernetes版本的语义化版本(可选)
description: 一句话对这个项目的描述(可选)
type: chart类型 (可选)
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的tag
    import-values: # (可选)
      - ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项
    alias: (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用

maintainers: # (可选) # 可能用到
  - name: 维护者名字 (每个维护者都需要)
    email: 维护者邮箱 (每个维护者可选)
    url: 维护者URL (每个维护者可选)

icon: 用做icon的SVG或PNG图片URL (可选)
appVersion: 包含的应用版本(可选)。不需要是语义化,建议使用引号
deprecated: 不被推荐的chart (可选,布尔值)
annotations:
  example: 按名称输入的批注列表 (可选).

values.yaml 包含应用程序的默认配置值,举例:

image:
  repository: nginx
  tag: '1.19.8'

在模板(templates)中引入 values.yaml 里的配置,在模板文件中可以通过 .VAlues 对象访问到,例如:


apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-helm-{{ .Values.image.repository }}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-helm
  template:
    metadata:
      labels:
        app: nginx-helm
    spec:
      containers:
      - name: nginx-helm
        image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
        ports:
        - containerPort: 80
          protocol: TCP

8.2 构建一个无状态应用模版 charts

  • 目录结构
$ tree demochart/
demochart/
├── charts
├── Chart.yaml
├── templates                   
│   ├── deployment.yaml  
└── values.yaml
  • Chart.yaml
apiVersion: v2
name: demochart
description: A Helm chart for Kubernetes, The author is Daizhe
type: application
version: 0.1.0
appVersion: 1.16.0
  • templates/deployment.yaml
$ vim templates/deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: deployment
  name: {{ .Values.Name }}
spec:
  replicas: {{ .Values.replicas }}
  selector:
    matchLabels:
      app: deployment
  template:
    metadata:
      labels:
        app: deployment
    spec:
      containers:
      - image: {{ .Values.image }}
        name: nginx
  • values.yaml
Name: demo-deploy-nginx
replicas: 1
image: nginx:latest
  • install 安装
$ helm install nginx-dep demochart/ --dry-run
$ helm install nginx-dep demochart/
$ helm list
  • upgrade 升级
$ helm upgrade -f values.yaml nginx-dep demochart
  • rollback 回滚
$ helm history nginx-dep
$ helm rollback nginx-dep 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/662435.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LiveGBS流媒体平台GB/T28181用户手册-国标级联:添加上级平台、选择通道、推送通道级联会话、搜索、删除

LiveGBS流媒体平台GB/T28181用户手册-国标级联:添加上级平台、选择通道、推送通道级联会话、搜索、删除 1、国标级联1.1、添加上级平台1.2、注册状态1.3、选择通道1.4、推送通道1.5、级联会话1.6、搜索1.7、删除 2、搭建GB28181视频直播平台 1、国标级联 1.1、添加上级平台 点…

四川音盛佳云电子商务有限公司可靠吗?怎么样?

在数字经济的浪潮中,抖音电商以其独特的魅力逐渐崭露头角,成为电商领域的一股新势力。而四川音盛佳云电子商务有限公司,正是这股新势力中的佼佼者,以其专业的服务和创新的理念,引领着抖音电商的发展潮流。 四川音盛佳…

python Z-score标准化

python Z-score标准化 Zscore标准化sklearn库实现Z-score标准化手动实现Z-score标准化 Zscore标准化 Z-score标准化(也称为标准差标准化)是一种常见的数据标准化方法,它将数据集中的每个特征的值转换为一个新的尺度,使得转化后的…

Java-数组内存解析

文章目录 1.内存的主要结构:栈、堆2.一维数组的内存解析3.二维数组的内存解析 1.内存的主要结构:栈、堆 2.一维数组的内存解析 举例1:基本使用 举例2:两个变量指向一个数组 3.二维数组的内存解析 举例1: 举例2&am…

[Linux系统编程] 静态库与动态库

一.库的概念 库是写好的现有的,成熟的,可以复用的代码。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。…

nvidia origin nx 刷机JETPACK 6

条件: 1.sdkmanager 链接:https://pan.baidu.com/s/1pmeT7_vKF_NXvP8xEhCelw?pwd8q1e 提取码:8q1e 2.ubuntu 20或者ubuntu22 3.nvidia orin nx Nvidia Jetson Orin NX(一)开始刷机_jetson nx刷机-CSDN博客 …

CatDDoS僵尸网络与DNSBomb攻击:DDOS攻击最新变种

在近期的网络安全领域,两大严峻挑战浮出水面,为中国乃至全球的网络防护体系敲响了警钟。中国安全厂商奇安信的X实验室团队揭露了一波名为CatDDoS的恶意软件攻击浪潮,与此同时,一种创新且隐蔽的拒绝服务攻击技术——DNSBomb&#x…

操作系统真象还原:完善MBR

第3章-完善MBR 这是一个网站有所有小节的代码实现,同时也包含了Bochs等文件 编译器给程序中各符号(变量名或函数名等)分配的地址,就是各符号相对于文件开头的偏移量 。 section 称为节,在有的编译器中,同…

【注册表删除】Navicat Premium 16的试用期已过期的解决方案

文章目录 【问题】【解决方式】 【问题】 使用Navicat Premium 16提示试用期已过期,如下图所示情况: 【解决方式】 1、关闭Navicat Premium 16 确保Navicat Premium 16处于关闭状态。 2、Win R,输入 regedit 回车 3、删除Data文件夹 在注…

硬盘监控,保障硬盘性能

硬盘驱动器是个人计算机和服务器中用于存储数字数据的硬件部件,硬盘突然故障可能导致永久数据丢失,大多数硬盘驱动器使用自我监控、分析和报告技术(SMART)来跟踪各种性能指标并分析其自身的运行状况。然而,并不是所有的…

史上最全排序算法整理(2)

本篇文章我们将接着上篇继续介绍常见的排序算法,有需要的小伙伴可以移步史上最全排序算法整理(1)查看相关内容哦 1.冒泡排序 1.1基本思想 在待排序的一组数中,将相邻的两个数进行比较,若前面的数比后面的数大就交换两…

FFMPEG+ANativeWinodow渲染播放视频

前言 学习音视频开发,入门基本都得学FFMPEG,按照目前互联网上流传的学习路线,FFMPEGANativeWinodow渲染播放视频属于是第一关卡的Boss,简单但是关键。这几天写了个简单的demo,可以比较稳定进行渲染播放,便…

软件系统测试的类型和方法介绍

测试是软件开发过程中至关重要的一环,负责验证和确认软件系统是否符合预期的需求,并帮助开发团队消除潜在的缺陷。系统测试作为软件测试中不可缺少的过程,是根据预先制定的测试计划和测试用例,以检查软件系统功能、性能、安全性和…

LED显示屏模组七大参数

LED模组是LED显示屏的核心组件,它包含LED线路板和外壳,将LED灯珠按照特定规则排列并封装,通常还会进行防水处理。随着LED显示屏行业的发展及其广泛应用,LED模组的功能和作用变得愈加重要。那么,LED模组的七大参数是什么…

开抖店必须要办理营业执照吗?不用营业执照开店的个人店能用吗?

大家好,我是电商花花。 可能大家都发现了,抖音小店个人店不用营业执照,只凭借身份证就能开店。 但是这个个人店花花并不建议大家去开,虽然说用用身份证也能开店,有效的帮我们减少了开店的成本,但是个人店…

【RLHF个人笔记】RLHF:Reinforcement Learning from Human Feedback具体过程

【RLHF个人笔记】RLHF:Reinforcement Learning from Human Feedback具体过程 RLHF训练的三个步骤步骤1:收集数据与有监督训练策略步骤2:收集数据训练奖励模型步骤3:结合奖励模型利用强化学习算法如PPO算法来优化策略 参考内容 RLHF训练的三个…

jeecgboot 同一账号只允许一个人登录

1.需求分析 jeecgboot 框架要实现同一个账号只允许一个人登录,就跟游戏账号类似,“我登录了就把你踢下去,你登录了就把我踢下去”;jwt 原理是生成 token 后一段时间内登录都有效,jeecgboot 中 jwt 和 redis 联合使用后…

易备数据备份软件:快速恢复 VMware ESXi 虚拟机

易备数据备份软件为 VMware ESXi 虚拟机提供完整的保护和备份功能。软件同时支持从 ESXi 或 vCenter 虚拟机的增量和差异备份中进行自动恢复。支持精细化的恢复,可将虚拟机恢复到某个特定的日期。 通过易备数据备份软件,可以实现虚拟机的异机恢复&#…

深入理解JVM:内存结构、垃圾收集与性能调优

目录 JDK、JRE、JVM关系? 启动程序如何查看加载了哪些类,以及加载顺序? class字节码文件10个主要组成部分? JVM结构 画一下JVM内存结构图 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 运行时常量池? 什么时候抛出StackOverflowError? 例如&…

元宇宙对于品牌营销有哪些影响?品牌如何加入?

元宇宙对于品牌营销带来了许多新的营销方式和策略,这些方式在传统营销中是无法实现的。以下是元宇宙对于品牌营销的主要营销方式: 1、虚拟展示: 利用元宇宙技术,品牌可以将产品或服务在虚拟世界中进行展示,用户可以通…