Kubernetes-编排工具篇-01-Kustomize与Helm对比

Kustomize与Helm对比

0、前言

K8s 是一个开源容器编排平台,可自动执行容器化应用程序的部署、扩展和管理。近年来,K8s 已成为采用云原生架构和容器化技术的组织的标准。

但是由于K8s的复杂性,所以很多公司以及开源组织都在开发相关的工具来简化k8s的使用门槛,这其中就包括两个很优秀的开源工具,Kustomize
(K8s 的配置管理器)和Helm (K8s 的包管理器)。

本文将针对二者来进行对比。

KustomizeHelm
操作方法overlaystemplating
使用成本简单复杂
是否支持封装
kubectl集成
声明式/命令式声明式命令式

1、Kustomize

Kustomize 是 k8s集群的配置定制工具。它允许管理员使用非模板文件进行声明性更改,而不影响原始清单文件。

来看一下kubebuilder生成项目的Kustomize配置,以/config/crd目录为例:

├── crd
│   ├── bases
│   │   └── apps.kubenode.alibaba-inc.com_myapps.yaml
│   ├── kustomization.yaml
│   ├── kustomizeconfig.yaml
│   └── patches
│       ├── cainjection_in_myapps.yaml
│       └── webhook_in_myapps.yaml

其中config/crd目录是执行kubebuilder create api后生成的,最原始的目录结构是:

├── crd
│   ├── kustomization.yaml
│   └── kustomizeconfig.yaml

所以bases子目录和patches子目录都是执行make manifests后生成的。

执行kubebuilder create api可以参考:https://blog.csdn.net/qq_41004932/article/details/142702284
执行make manifests可以参考:https://blog.csdn.net/qq_41004932/article/details/142703870

在 Kubebuilder 生成的项目中,config/crd 目录下的文件主要用于管理和配置自定义资源定义(Custom Resource Definitions, CRDs)。这些文件通过 Kustomize 工具进行管理,以便于在不同的环境中部署和管理 CRDs。下面是每个文件的作用解释:

  1. bases 目录
    bases/apps.kubenode.alibaba-inc.com_myapps.yaml:
    这个文件包含了自定义资源定义(CRD)的 YAML 描述。它定义了你的自定义资源(Custom Resource, CR)的结构和元数据。
    例如,如果我们创建了一个名为 MyApp 的自定义资源,这个文件将描述 MyApp 的 API 版本、资源名称、字段等。
  2. kustomization.yaml
    kustomization.yaml:
    这个文件是 Kustomize 的配置文件,用于定义如何组合和修改 Kubernetes 资源文件。
    它指定了哪些资源文件(如 CRD 文件)需要被应用,并且可以包含补丁文件和其他配置选项。
    例如,它可以指定 bases 目录中的 CRD 文件,以及 patches 目录中的补丁文件。
  3. kustomizeconfig.yaml
    kustomizeconfig.yaml:
    这个文件通常用于配置 Kustomize 的一些高级选项,但在这个上下文中可能不是必需的。它可能会包含一些特定的配置项,用于定制 Kustomize 的行为。
    在大多数情况下,这个文件可能不需要手动编辑。
  4. patches 目录
    patches/cainjection_in_myapps.yaml:

这个文件是一个补丁文件,用于在 CRD 上应用 Webhook 注入(例如,证书注入)。
例如,如果你的 CRD 需要与 mutating 或 validating webhooks 一起工作,这个补丁文件会确保 Webhook 配置正确地注入到 CRD 中。
patches/webhook_in_myapps.yaml:

这个文件也是一个补丁文件,用于在 CRD 上应用 Webhook 配置。
例如,它可能会添加或修改 Webhook 的配置,以便在创建或更新自定义资源时触发特定的行为。
总结
bases 目录:包含 CRD 的基本定义文件。
kustomization.yaml:Kustomize 的配置文件,用于定义如何组合和修改资源文件。
kustomizeconfig.yaml:Kustomize 的高级配置文件(可选)。
patches 目录:包含用于修改 CRD 的补丁文件,通常用于注入 Webhook 配置。

如果我们像让这个crd根据不同的环境做针对性部署的,例如下面的目录结构:

├── crd
│   ├── bases
│   │   └── apps.kubenode.alibaba-inc.com_myapps.yaml
│   ├── development
│   │   ├── kustomization.yaml
│   │   └── patches
│   │       └── webhook_in_myapps.yaml
│   ├── testing
│   │   ├── kustomization.yaml
│   │   └── patches
│   │       └── webhook_in_myapps.yaml
│   ├── production
│   │   ├── kustomization.yaml
│   │   └── patches
│   │       └── webhook_in_myapps.yaml
│   ├── kustomization.yaml
│   ├── kustomizeconfig.yaml
│   └── patches
│       ├── cainjection_in_myapps.yaml
│       └── webhook_in_myapps.yaml

所有自定义规范都包含在 kustomization.yaml 文件中,该文件将规范叠加在现有清单之上以生成资源的自定义版本。
所以我们可以根据这一特性,针对不同的环境,对crd进行定制。

2、Helm

Helm 是一个能够在 K8s 上打包、部署和管理应用程序的工具,即使是最复杂的 K8s 应用程序它都可以帮助定义,安装和升级,同时Helm 也是 CNCF 的毕业项目。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里涉及到了以及关于helm的重要概念:

  • Helm Charts:预先配置yaml的模板,在这里叫Chart,用于描述 K8s 应用程序的yaml和配置
  • Helm Client:用于与 Helm 交互并管理这些Chart版本的命令行界面
  • Chart 仓库:管理Chart的仓库,跟Maven的Nexus一个意思,比如在公司环境构建上传,在客户的机房连接到这Chart 仓库下载Chart,并部署到k8s中。

2.1 helm示例

helm的示例需要用到kubectl、helm以及k8s集群,相应的安装参考:

  • mac环境:https://blog.csdn.net/qq_41004932/article/details/142684319
  • ubuntu环境:https://blog.csdn.net/qq_41004932/article/details/142691490
  • kind集群:https://blog.csdn.net/qq_41004932/article/details/142691490

Helm Charts 是预先配置的 K8s 资源包。Helm Chart 包含部署特定应用程序或服务所需的所有信息,包括 K8s 清单、环境变量和其他配置

目录名称是Chart的名称,如Helm 文档所示,我们通过helm create demo命令创建一个Chart,执行完以后,默认会生成一个 nginx 的Chart。

helm create demo

结果:

$ helm create demo                                                                                                                      [10:33:35]
Creating demo

查看目录结构:

.
├── Chart.yaml
├── charts
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml3 directories, 10 files

2.2 Chart.yaml

定义了当前 chart版本,以及描述当前chart用途,其中 name 参数表示 chart 名称,后期上传下载都会用此名称

apiVersion: v2
name: demo
description: A Helm chart for Kubernetes# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
type: application# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.0# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes.
appVersion: "1.16.0"

2.3 values.yaml

可变参数,都是在此文件中定义,在yaml模板中引用,比如:image.repository,而引用则通过.Values+变量的名进行引用

# Default values for demo.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.replicaCount: 1image:repository: nginxpullPolicy: IfNotPresent# Overrides the image tag whose default is the chart appVersion.tag: ""imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""serviceAccount:# Specifies whether a service account should be createdcreate: true# Annotations to add to the service accountannotations: {}# The name of the service account to use.# If not set and create is true, a name is generated using the fullname templatename: ""podAnnotations: {}podSecurityContext: {}# fsGroup: 2000securityContext: {}# capabilities:#   drop:#   - ALL# readOnlyRootFilesystem: true# runAsNonRoot: true# runAsUser: 1000service:type: ClusterIPport: 80ingress:enabled: falseclassName: ""annotations: {}# kubernetes.io/ingress.class: nginx# kubernetes.io/tls-acme: "true"hosts:- host: chart-example.localpaths:- path: /pathType: ImplementationSpecifictls: []#  - secretName: chart-example-tls#    hosts:#      - chart-example.localresources: {}# We usually recommend not to specify default resources and to leave this as a conscious# choice for the user. This also increases chances charts run on environments with little# resources, such as Minikube. If you do want to specify resources, uncomment the following# lines, adjust them as necessary, and remove the curly braces after 'resources:'.# limits:#   cpu: 100m#   memory: 128Mi# requests:#   cpu: 100m#   memory: 128Miautoscaling:enabled: falseminReplicas: 1maxReplicas: 100targetCPUUtilizationPercentage: 80# targetMemoryUtilizationPercentage: 80nodeSelector: {}tolerations: []affinity: {}

2.4 _helpers.tpl

定义通用代码块,然后yaml 文件会通过 include 引用
定义:

{{- define "demo.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}

引用:

{{ include "demo.fullname" . }}

2.5 templates

此目录主要存放的是要部署的 yaml文件模板,同时也包含_helpers.tpl文件,模板会引用values.yaml、Chart.yaml定义的参数,以及_helpers.tpl定义的通用代码块

apiVersion: apps/v1
kind: Deployment
metadata:name: {{ include "demo.fullname" . }}labels:{{- include "demo.labels" . | nindent 4 }}
spec:{{- if not .Values.autoscaling.enabled }}replicas: {{ .Values.replicaCount }}{{- end }}selector:matchLabels:{{- include "demo.selectorLabels" . | nindent 6 }}template:metadata:{{- with .Values.podAnnotations }}annotations:{{- toYaml . | nindent 8 }}{{- end }}labels:{{- include "demo.selectorLabels" . | nindent 8 }}spec:{{- with .Values.imagePullSecrets }}imagePullSecrets:{{- toYaml . | nindent 8 }}{{- end }}serviceAccountName: {{ include "demo.serviceAccountName" . }}securityContext:{{- toYaml .Values.podSecurityContext | nindent 8 }}containers:- name: {{ .Chart.Name }}securityContext:{{- toYaml .Values.securityContext | nindent 12 }}image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"imagePullPolicy: {{ .Values.image.pullPolicy }}ports:- name: httpcontainerPort: {{ .Values.service.port }}protocol: TCPlivenessProbe:httpGet:path: /port: httpreadinessProbe:httpGet:path: /port: httpresources:{{- toYaml .Values.resources | nindent 12 }}{{- with .Values.nodeSelector }}nodeSelector:{{- toYaml . | nindent 8 }}{{- end }}{{- with .Values.affinity }}affinity:{{- toYaml . | nindent 8 }}{{- end }}{{- with .Values.tolerations }}tolerations:{{- toYaml . | nindent 8 }}{{- end }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"

2.5 部署

如果想部署的话,可以使用瞎买呢命令进行

helm package helm-demo

可以发现,这里helm是将要部署的资源当作一个整体来进行操作的,也就是讲一个资源的所有yaml配置作为一个整体的形式来进行操作。

3、主要差异

3.1 操作方法

Kustomize 依赖特定于目录的kustomization.yaml文件来构建各个资源并对其进行更改。这些文件将补丁和覆盖应用到共享基文件夹中声明的资源,以提供自动化的多环境配置。

Helm 通过引用value.yaml文件作为变量源,使用模板生成有效的 K8s 配置。模板目录托管 Helm Chart在部署期间用于创建资源的文件。

3.2 便捷性

从K8s 版本 1.14 开始,Kustomize 与 kubectl CLI 捆绑在一起,因此不需要掌握任何其他工具。Kustomize 支持声明式部署,并对每个文件使用纯 YAML,从而更容易使用。

Helm 为K8s包管理任务添加了额外的抽象层,从而加快了希望简化集群配置和发布自动化的团队的学习曲线。Helm Chart 相对Kustomize复杂,不过功能更加强大。

3.3 打包

Kustomize 缺乏的打包功能,并且每个资源都必须在基本文件夹中声明,并在覆盖kustomization.yaml文件中单独声明变体。

而Helm将所有必需的K8s资源都打包到一个文件夹中,该文件夹可以根据需要重复使用。Helm 还允许设置应用程序默认值,并且使用values.yaml文件修改参数,从而注入引用的 yaml 文件中。

3.4 原生 kubectl 集成

从 K8s 1.14 版开始,Kustomize 就预装了 kubectl,Helm 并未与 K8s 预先集成,因此必须手动安装 Helm。

3.5 Kustomize 与 Helm - 何时使用

3.5.1 何时使用 Kustomize

Kustomize允许在不改变原始文件的情况下进行精确更改。 因此可以有以下场景

  • 应用配置的变体管理:当你需要管理多个环境(例如开发、测试、生产)中应用的变体时,Kustomize 是一个很好的选择。它允许你为不同的环境创建不同的配置,并使用一套基础配置来定义通用部分。
  • 持续集成和持续部署(CI/CD)流水线:Kustomize 可以与 CI/CD 工具集成,帮助你实现自动化部署。通过在流水线中使用 Kustomize,你可以根据需要生成特定环境的配置,并将其应用到集群中。

3.5.2 何时使用 Helm

Helm 将所有 K8s 对象封装到一个包中,减少了与各个yaml 文件的交互。除此之外,大多数第三方供应商还提供预构建的 Helm 图表,以简化将其产品部署到 K8s 中的过程。因此,Helm 通常是安装现成解决方案(例如监控、数据库和消息中间件等)的首选

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

确定图像的熵和各向异性 Halcon entropy_gray 解析

1、图像的熵 1.1 介绍 图像熵(image entropy)是图像“繁忙”程度的估计值,它表示为图像灰度级集合的比特平均数,单位比特/像素,也描述了图像信源的平均信息量。熵指的是体系的混乱程度,对于图像而言&#…

数字IC后端设计实现之Innovus自动修复Min Step DRC Violation方案

在实际IC后端项目中我们经常会遇到min step的DRC Violation,如下图所示。 在咱们IC后端训练营项目中也会遇到这类DRC Violation。这类DRC Violation的本质是出现Metal的Notch,即metal有凹槽。 如果是pg net的 Min Step问题,我们可以使用下面的…

进程相关内容

进程内容 进程类型守护进程进程的概念查看进程信息父子进程创建子进程进程结束 – exit/_exit进程回收 –wait waitpid 进程类型 交互进程 (Interactive Process) 交互进程是由用户通过终端或图形界面直接启动的进程,例如我们在命令行输入的命令。它通常需要等待用…

石墨舟氮气柜:半导体制造中的关键保护设备

石墨舟是由高纯度石墨材料制成的,主要用于承载硅片或其他基板材料通过高温处理过程,是制造半导体器件和太阳能电池片的关键设备之一。 石墨舟在空气中容易与氧气发生反应,尤其是在高温处理后,表面可能更为敏感;石墨舟具…

rabbitMq双节点高可用集群安装(亲测可用)

查询系统版本 cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) rabbitmq v3.9.13 (centos7支持比较大的版本了,后面版本貌似都是centos8以上) erlang erlang-23.3.4.11-1.el7.x86_64 (需要和rabbitmq版本匹配&…

简单介绍一下mvvm mvc mvp以及区别、历史

MVC(Model - View - Controller) 因MVC架构的灵活性,架构图形式很多,仅供参考 历史: MVC 是最早出现的软件架构模式之一,其历史可以追溯到 20 世纪 70 年代,最初被用于 Smalltalk - 80 环境。…

Nordic SoftDevice蓝牙主机操作流程

Nordic SoftDevice蓝牙主机操作流程 之前学习nordic的nus client 主机例程时做了些笔记,现在有空重新整理了一下发出来。 NRF_SDH_BLE_OBSERVER 宏介绍 这个宏可以设置多个BLE事件的回调函数,并按设置的优先级依次执行。这么一来,就可以将…

C++生成高斯分布随机数

简单实现 在 C 中&#xff0c;可以使用 头文件中的功能来生成正态分布&#xff08;高斯分布&#xff09;随机数。以下是一个示例&#xff0c;展示如何使用 C11 及以上版本的标准库生成正态分布随机数。 #include <iostream> #include <random> #include <cmat…

SL6115降压恒流 60V降压恒流芯片,高精度1%,PWM模拟调光

一、核心参数与性能 工作电压范围&#xff1a;5.5V至60V&#xff0c;宽输入电压范围使其能够适应多种应用场景。 最大输出电流&#xff1a;根据公开发布的信息&#xff0c;SL6115的最大输出电流可达到1.2A至1.5A&#xff0c;具体取决于不同版本或制造商的规格说明。这一高输出…

lnmp:自己的“百度网盘”

一、项目简介 有人会问&#xff0c;什么是lnmp储存&#xff0c;相信大家都用过百度网盘&#xff0c;他的原理和lnmp的作用相同&#xff0c;都是将数据储存在私有云中。LNMP也是用来储存自己的数据&#xff0c;可以假象成这是一个属于自己的数据库。 二、详细概述 所谓LNMP便是…

「实战应用」如何用图表控件LightningChart .NET在WPF中制作表格?(一)

LightningChart .NET完全由GPU加速&#xff0c;并且性能经过优化&#xff0c;可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D&#xff0c;高级3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D饼/甜甜圈&#xff0c;地理地图和GIS图表以及适用于科…

鸿蒙进阶篇-网格布局 Grid/GridItem(二)

hello大家好&#xff0c;这里是鸿蒙开天组&#xff0c;今天让我们来继续学习鸿蒙进阶篇-网格布局 Grid/GridItem&#xff0c;上一篇博文我们已经学习了固定行列、合并行列和设置滚动&#xff0c;这一篇我们将继续学习Grid的用法&#xff0c;实现翻页滚动、自定义滚动条样式&…

SpringBoot框架:共享汽车管理的创新工具

5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 共享汽车管理系统的系统管理员可以管理用户&#xff0c;可以对用户信息修改删除以及查询操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.1.2 投放地区管理 系统管理员可以对投放地区信息进行添加&#…

uniapp上拉刷新下拉加载

方法一&#xff1a; z-paging 的组件库&#xff1a; show-loading-more-no-more-view"false" 该属性控制是否显示 "加载更多" 或 "没有更多" 的提示。如果设为 false&#xff0c;则不会显示这些提示。如果设为 true&#xff0c;当数据加载完毕…

【Pikachu靶场:XSS系列】xss之过滤,xss之htmlspecialchars,xss之herf输出,xss之js输出通关啦

一、xss之过滤 <svg onloadalert("过关啦")> 二、xss之htmlspecialchars javascript:alert(123) 原理&#xff1a;输入测试文本为herf的属性值和内容值&#xff0c;所以转换思路直接变为js代码OK了 三、xss之href输出 JavaScript:alert(假客套) 原理&#x…

微分段如何防止勒索软件攻击

微分段通过隔离关键资产、限制网络横向移动、提供细粒度的最小特权访问、实现快速隔离、简化恢复、提高网络弹性以及减少爆炸半径来防止勒索软件攻击。 勒索软件攻击已成为各种规模的组织面临的越来越危险的威胁。 勒索软件利用横向移动技术来感染和加密尽可能多的端点和服务…

后端Node学习项目-项目基础搭建

前言 各位好&#xff0c;我是前端SkyRain。最近为了响应公司号召&#xff0c;开始对后端知识的学习&#xff0c;作为纯粹小白&#xff0c;记录下每一步的操作流程。 项目仓库&#xff1a;https://gitee.com/sky-rain-drht/drht-node 因为写了文档&#xff0c;代码里注释不是很…

SQL server 中 CROSS APPLY的使用

CROSS APPLY 是 SQL Server 中的一个操作符&#xff0c;用于将一个表表达式&#xff08;如子查询、函数等&#xff09;与外部表进行连接。CROSS APPLY 类似于 INNER JOIN&#xff0c;但它允许你在一个查询中多次引用外部表的行&#xff0c;并且可以动态地生成结果集。 基本语法…

低空经济之星eVTOL研发技术详解

低空经济之星eVTOL&#xff08;Electric Vertical Take-off and Landing&#xff09;是一种采用储能电池、电机驱动以及螺旋桨推进方式&#xff0c;并具备垂直起降功能的新型航空器。以下是对eVTOL研发技术的详解&#xff1a; 一、技术特点 1. 分布式推进系统 结构简单性与轻…

算法每日双题精讲——双指针(快乐数,盛最多水的容器)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#xff01;&#x1f4aa;…