当前位置: 首页 > news >正文

第九篇:k8s 通过helm发布应用

什么是helm?

Helm 是 Kubernetes 的包管理器。Helm 是查找、分享和使用软件构建 Kubernetes 的最优方式。

在红帽系的Linux中我们使用yum来管理RPM包,类似的,在K8s中我们可以使用helm来管理资源对象(Deployment、Service、Ingress...)实现K8s中应用的快速发布、升级、维护和分享。helm 官方文档[1]

helm中的几个关键概念

  • Chart 是Helm 中的包。包含一组用于部署应用程序的 K8s 资源对象定义(即资源清单的集合)。
  • Repository 即chart图表的仓库。我们可以从网络仓库中搜索、下载和安装chart。
  • Release 即chart部署后的实例。通过 helm install命令,在 Kubernetes 集群上安装该chart的新版本。
helm实现哪些功能?

Helm (v3版本)为 K8s 提供的功能包括:

  1. 通过单个 CLI 命令部署 Kubernetes 应用(chart)。实现本地chart的创建、管理和发布。
  2. Helm 将chart中资源对象配置文件模板化,实现在多个集群环境中重用一个 Helm chart,同时可打包进行网络共享。
  3. Helm 通过自动维护发布的所有版本来简化 Kubernetes 应用程序的回滚,防止部署问题。
  4. 通过helm轻松实现 Kubernetes 中工作负载的 CI/CD 管道。
helm 基本使用

Helm可以用源码或构建的二进制版本安装。参考:安装 Helm[2]

Artifact Hub[3] 是一个开源项目,我们通过它来查找、安装或发布k8s应用

除了通过web搜索,也可以通过helm命令行方式:

#helm search hub redis
URL                                                   CHART VERSION   APP VERSION         DESCRIPTION
https://hub.helm.sh/charts/bitnami/redis              16.4.0          6.2.6               Redis(TM) is an opensource, advanced key-value...
https://hub.helm.sh/charts/wenerme/redis              16.4.0          6.2.6               Redis(TM) is an opensource, advanced key-value...
...

找到redis版本为6.2.6,chart版本16.4.0的包,访问 url https://hub.helm.sh/charts/bitnami/redis 新版本已被重定向到 artifacthub.io

由图上信息可以知redis是一个来自Bitnami仓库(由VMware主导的开源软件仓库),通过验证的版本,仓库地址 https://charts.bitnami.com/bitnami

要安装这个应用我们应先将Bitnami仓库添加到本地配置中。

#helm repo add bitnami https://charts.bitnami.com/bitnami

安装redis,release名称为 redis-dev

# helm install redis-dev bitnami/redis
NAME: redis-dev
LAST DEPLOYED: Sun Feb 13 20:09:30 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: redis
CHART VERSION: 16.4.0
APP VERSION: 6.2.6

这样我们可以轻松发布一个一主三从的redis集群到k8s中

# helm list
NAME                               NAMESPACE   REVISION    UPDATED                                 STATUS      CHART   APP VERSION
redis-dev                          default     1           2022-02-13 20:09:30.755534484 +0800 CST deployed    redis-16.4.0

Helm 通过向资源对象中添加标签来跟踪安装在 Kubernetes 集群上的chart。这些标签看起来像 app.kubernetes.io/managed-by=Helmapp.kubernetes.io/instance:myapp

#  kubectl get all -l app.kubernetes.io/instance=redis-dev
NAME                       READY   STATUS    RESTARTS   AGE
pod/redis-dev-master-0     1/1     Running   0          27m
pod/redis-dev-replicas-0   1/1     Running   0          27m
pod/redis-dev-replicas-1   1/1     Running   0          24m
pod/redis-dev-replicas-2   1/1     Running   0          23mNAME                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/redis-dev-headless   ClusterIP   None            <none>        6379/TCP   27m
service/redis-dev-master     ClusterIP   10.96.52.104    <none>        6379/TCP   27m
service/redis-dev-replicas   ClusterIP   10.96.230.162   <none>        6379/TCP   27mNAME                                  READY   AGE
statefulset.apps/redis-dev-master     1/1     27m
statefulset.apps/redis-dev-replicas   3/3     27m

删除 redis-dev的发布,将会移除标签跟踪的所有资源对象。

# helm uninstall redis-dev
release "redis-dev" uninstalled
创建自己的helm chart

显然大多数时候我们更想发布自己的应用到K8s中或者需要对将要发布的开源软件做一些配置上的修改,所以我们可以通过helm自己构建一个chart或者使用 helm pull下载一个chart做修改后再上传的内部或外部仓库中。

下面来创建一个简易的nginx chart

# helm create chart-nginx
Creating chart-nginx

chart的目录结构,你可以删除模板中的所有文件自建或使用默认模板

# tree chart-nginx/
chart-nginx/
├── charts  #依赖的chart目录
├── Chart.yaml #chart版本信息
├── templates #资源对象模板目录
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt #提示信息
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml #模板值3 directories, 10 files

Chart.yaml声明了版本信息,我们可以进行自定义

# Chart.yaml
apiVersion: v2
name: chart-nginx
description: A Helm chart for Kubernetes
type: application
version: 0.1.0 #chart版本
appVersion: 1.0.0 #app版本

helm默认创建的模板文件deployment.yaml如下:

helm 采用go模板,官方文档Chart 模板[4]

通过deployment模板中可以看到 image的值会引用value文件中定义的image.repository和tag,如果tag值为空则返回默认引用Chart.appVersion的值。

接着根据需要更新value.yaml文件中 imageservice等相关信息,同时关闭serviceAccount、ingress、hpa的创建。

模板文件service.yaml定义好了type和pod的引用。

一个基本的nginx chart创建好了。通过 helmtemplate 命令渲染模板查看一下

# helm template chart-nginx
---
# Source: chart-nginx/templates/service.yaml
apiVersion: v1
kind: Service
metadata:name: RELEASE-NAME-chart-nginxlabels:helm.sh/chart: chart-nginx-0.1.0app.kubernetes.io/name: chart-nginxapp.kubernetes.io/instance: RELEASE-NAMEapp.kubernetes.io/version: "1.0.0"app.kubernetes.io/managed-by: Helm
spec:type: NodePortports:- port: 80targetPort: httpprotocol: TCPname: httpselector:app.kubernetes.io/name: chart-nginxapp.kubernetes.io/instance: RELEASE-NAME
---
# Source: chart-nginx/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: RELEASE-NAME-chart-nginxlabels:helm.sh/chart: chart-nginx-0.1.0app.kubernetes.io/name: chart-nginx
...

再通过 helm lint检查语法

==> Linting chart-nginx
[INFO] Chart.yaml: icon is recommended1 chart(s) linted, 0 chart(s) failed

ok,通过 helm install发布到k8s,参照NOTES说明可进行访问。

# helm install chart-nginx --generate-name
NAME: chart-nginx-1644771770
LAST DEPLOYED: Mon Feb 14 01:02:50 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services chart-nginx-1644771770)export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")echo http://$NODE_IP:$NODE_PORT

查看资源正常。

# kubectl get all -l app.kubernetes.io/name=chart-nginx
NAME                                          READY   STATUS    RESTARTS   AGE
pod/chart-nginx-1644771770-69bbb4fdf8-gqdk7   1/1     Running   0          3m59s
pod/chart-nginx-1644771770-69bbb4fdf8-wwxw2   1/1     Running   0          3m59sNAME                             TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/chart-nginx-1644771770   NodePort   10.96.231.61   <none>        80:32631/TCP   3m59sNAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/chart-nginx-1644771770   2/2     2            2           3m59sNAME                                                DESIRED   CURRENT   READY   AGE
replicaset.apps/chart-nginx-1644771770-69bbb4fdf8   2         2         2       3m59s
通过仓库分发应用

首先通过 helm packge将chart-nginx打包

# helm package chart-nginx
Successfully packaged chart and saved it to: .../../chart-nginx-0.1.0.tgz

建立chart私有仓库,可参考开源项目chartmuseum,如有必要你也可将仓库提交至 artifacthub发布到互联网。

chart-nginx-0.1.0.tgz上传至仓库后,通过curl列出chart信息如下:

# curl http://192.168.1.123:8088/api/charts |python -m json.tool
{"chart-nginx": [{"apiVersion": "v2","appVersion": "1.0.0","created": "2022-02-13T17:37:43.653117345Z","description": "A Helm chart for Kubernetes","digest": "58a687be62a2a2a2b1dd177675bbc5aa49ac754df2219149bb4798636662b57c","name": "chart-nginx","type": "application","urls": ["charts/chart-nginx-0.1.0.tgz"],"version": "0.1.0"}]
}

将仓库添加到你的其他k8s集群helm中,实现应用共享和发布。

# helm repo add chartmuseum http://192.168.1.123:8088
"chartmuseum" has been added to your repositories

搜索 chart-nginx

# helm search repo chart-nginx
NAME                       CHART VERSION   APP VERSION DESCRIPTION
chartmuseum/chart-nginx    0.1.0           1.0.0       A Helm chart for Kubernetes

通过仓库发布 chart-nginx

# helm install my-chart-nginx chartmuseum/chart-nginx
NAME: my-chart-nginx
LAST DEPLOYED: Mon Feb 14 01:54:34 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
...

以上我们对helm进行了基本介绍以及如何创建一个自己的 helm chart,如何结合私有仓库 chartmuseum在K8s中发布应用。 

 

 

 

相关文章:

第九篇:k8s 通过helm发布应用

什么是helm&#xff1f; Helm 是 Kubernetes 的包管理器。Helm 是查找、分享和使用软件构建 Kubernetes 的最优方式。 在红帽系的Linux中我们使用yum来管理RPM包&#xff0c;类似的&#xff0c;在K8s中我们可以使用helm来管理资源对象&#xff08;Deployment、Service、Ingress…...

dataTable

在 C# 中&#xff0c;DataTable 是 .NET Framework 中用于处理数据表格的一个类&#xff0c;属于 System.Data 命名空间。它是一种内存中表示数据表的结构&#xff0c;通常用于临时存储和操作数据&#xff0c;类似于数据库中的表。DataTable 的主要特点是行列结构&#xff0c;其…...

json+Tomact项目报错怎么办?

在响应请求的时候&#xff0c;如果http响应没有指定响应数据的content-type&#xff0c;浏览器就不知道按照什么格式解析响应体的数据&#xff0c;因为浏览器只知道怎样解析http的行和头&#xff0c;再从头里获取响应体的字节长度和类型&#xff0c;按照你给的长度去截流&#…...

Flume——sink连接Hive的参数配置(属性参数)

目录 配置文件官网属性参数例子 配置文件官网 可以参考官网的说明 属性参数 属性名默认值说明type无&#xff08;必须指定&#xff09;组件类型名称&#xff0c;必须是"hive"hive.metastore无&#xff08;必须指定&#xff09;元数据仓库地址&#xff0c;例如&…...

Netty面试内容整理-Netty 的应用场景

Netty 是一个高性能、异步的事件驱动网络框架,广泛应用于各种需要高并发、高吞吐量的网络通信场景。以下是 Netty 的常见应用场景: RPC 框架 ● 应用描述: ○ 远程过程调用(RPC)框架用于跨网络调用远程服务,就像调用本地方法一样。 ○...

波特图方法

在电路设计中&#xff0c;波特图为最常用的稳定性余量判断方法&#xff0c;波特图的根源是如何来的&#xff0c;却鲜有人知。 本章节串联了奈奎斯特和波特图的渊源&#xff0c;给出了其对应关系和波特图相应的稳定性余量。 理论贯通&#xff0c;不在于精确绘…...

服务器数据恢复—硬盘掉线导致热备盘同步失败的RAID5阵列数据恢复案例

服务器存储数据恢复环境&#xff1a; 华为S5300存储中有12块FC硬盘&#xff0c;其中11块硬盘作为数据盘组建了一组RAID5阵列&#xff0c;剩下的1块硬盘作为热备盘使用。基于RAID的LUN分配给linux操作系统使用&#xff0c;存放的数据主要是Oracle数据库。 服务器存储故障&#…...

在Ubuntu中运行和管理AppImage

文章目录 什么是AppImage&#xff1f;如何在Ubuntu中运行AppImage&#xff1f;如何管理AppImage&#xff1f;安装AppImageLauncher如何添加AppImage到系统&#xff1f;如何从系统中移除AppImage&#xff1f; 总结 什么是AppImage&#xff1f; AppImage是一种将应用程序打包为单…...

如何查看电脑的屏幕刷新率?

1、按一下键盘的 win i 键&#xff0c;打开如下界面&#xff0c;选择【系统】&#xff1a; 2、选择【屏幕】-【高级显示设置】 如下位置&#xff0c;显示屏幕的刷新率&#xff1a;60Hz 如果可以更改&#xff0c;则选择更高的刷新率&#xff0c;有助于电脑使用起来界面更加流…...

浏览器数据存储方法深度剖析:LocalStorage、IndexedDB、Cookies、OPFS 与 WASM - SQLite

在当今的 Web 开发领域&#xff0c;选择合适的浏览器数据存储方法对于构建高效、功能丰富的应用程序至关重要。随着 Web 应用的不断演进&#xff0c;从早期的静态 HTML 页面到如今复杂的单页应用和本地优先应用&#xff0c;数据存储需求也日益多样化。本文将深入探讨 LocalStor…...

面向金融场景的大模型 RAG 检索增强解决方案

概述 在现代信息检索领域&#xff0c;检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;模型结合了信息检索与生成式人工智能的优点&#xff0c;从而在特定场景下提供更为精准和相关的答案。在特定场景下&#xff0c;例如金融等领域&#xff0c;用户通…...

经典蓝牙(BT/EDR)蓝牙配对与连接

经典蓝牙的连接过程包括跳频&#xff0c;扫描&#xff0c;配置交换等过程。对ACL链路以及sco的连接过程也做详细的分析。 1. 为什么不配对便无法建立连接&#xff1f; 任何无线通信技术都存在被监听和破解的可能&#xff0c;蓝牙SIG为了保证蓝牙通信的安全性&#xff0c;采用…...

Flask: flask框架是如何实现非阻塞并发的

写在前面:Flask框架是通过多线程/多进程+阻塞的socket实现非阻塞,其本质是基于python的源库socketserver实现的 前言 认识WSGI协议 认识Werkzeug flask是如何实现非阻塞的 本文使用的flask框架为最新的1.1.1版本,所有代码基于python3运行 一:前言 使用过flask或者其他web框…...

JAVA |日常开发中连接Oracle数据库详解

JAVA &#xff5c;日常开发中连接Oracle数据库详解 前言一、Oracle 数据库概述1.1 定义与特点1.2 适用场景 二、Java 连接 Oracle 数据库的准备工作2.1 添加 Oracle JDBC 驱动依赖2.2 了解连接信息 三、建立数据库连接3.1 代码示例&#xff08;使用服务名&#xff09;3.2 步骤解…...

头歌 进程管理之二(wait、exec、system的使用)

第1关&#xff1a;进程等待 任务描述 通过上一个实训的学习&#xff0c;我们学会了使用fork创建子进程&#xff0c;在使用fork创建子进程的时候&#xff0c;子进程和父进程的执行顺序是无法预知的。本关我们将介绍如何使得fork创建出来的子进程先执行&#xff0c;随后父进程再…...

详解日志格式配置:XML 与 Spring Boot 配置文件格式

详解日志格式配置&#xff1a;XML 与 Spring Boot 配置文件格式 日志是现代应用程序中不可或缺的一部分&#xff0c;通过定制化日志格式和颜色&#xff0c;开发人员可以更方便地调试和监控应用。本文将深入讲解如何在 XML 配置文件 和 Spring Boot 配置文件 中设置日志格式&am…...

JDK21新特性

目录 虚拟线程&#xff08;JEP 444&#xff09;&#xff1a; 顺序集合&#xff08;JEP 431&#xff09;&#xff1a; 字符串模板&#xff08;JEP 430&#xff09;&#xff1a; 模式匹配的增强&#xff08;JEP 440、441以及443&#xff09;&#xff1a; 结构化并发和作用域值…...

SqlDataAdapter

SqlDataAdapter 是 .NET Framework 和 .NET Core 中提供的一个数据适配器类&#xff0c;属于 System.Data.SqlClient 命名空间&#xff08;或在 .NET 6 中属于 Microsoft.Data.SqlClient 命名空间&#xff09;。它的作用是充当数据源&#xff08;如 SQL Server 数据库&#xff…...

AI赋能:构建安全可信的智能电子档案库

在档案的政策与法规上&#xff0c;《中华人民共和国档案法》2020年修订新增&#xff0c;对电子档案的合法要件、地位和作用、安全管理要求和信息化系统建设等方面作出了明确规定&#xff0c;保障数字资源的安全保存和有效利用。 日前&#xff0c;国家档案局令第22号公布《电子…...

分类预测 | PSO-PNN粒子群优化概率神经网络多特征分类预测

分类预测 | PSO-PNN粒子群优化概率神经网络多特征分类预测 目录 分类预测 | PSO-PNN粒子群优化概率神经网络多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现PSO-PNN粒子群优化概率神经网络多特征分类预测&#xff0c;运行环境Matlab2018b及以…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...