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

news2025/1/11 11:01:12

什么是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          23m

NAME                         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   27m

NAME                                  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-nginx
  labels:
    helm.sh/chart: chart-nginx-0.1.0
    app.kubernetes.io/name: chart-nginx
    app.kubernetes.io/instance: RELEASE-NAME
    app.kubernetes.io/version: "1.0.0"
    app.kubernetes.io/managed-by: Helm
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: chart-nginx
    app.kubernetes.io/instance: RELEASE-NAME
---
# Source: chart-nginx/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: RELEASE-NAME-chart-nginx
  labels:
    helm.sh/chart: chart-nginx-0.1.0
    app.kubernetes.io/name: chart-nginx
...

再通过 helm lint检查语法

==> Linting chart-nginx
[INFO] Chart.yaml: icon is recommended

1 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          3m59s

NAME                             TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/chart-nginx-1644771770   NodePort   10.96.231.61   <none>        80:32631/TCP   3m59s

NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/chart-nginx-1644771770   2/2     2            2           3m59s

NAME                                                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中发布应用。 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FastAPI解决跨域报错net::ERR_FAILED 200 (OK)

目录 一、跨域问题的本质 二、FastAPI中的CORS处理 1. 安装FastAPI和CORS中间件 2. 配置CORS中间件 3. 运行FastAPI应用 三、解决跨域报错的步骤 四、案例&#xff1a;解决Vue.js与FastAPI的跨域问题 1. Vue.js前端应用 2. FastAPI后端API 3. 配置CORS中间件 4. 运行…

ThinkPHP+Layui开发的ERP管理系统

ERP采购生产销售系统&#xff0c;一款基于ThinkPHPLayui开发的ERP管理系统&#xff0c;帮助中小企业实现ERP管理规范化&#xff0c;此系统能为你解决五大方面的经营问题&#xff1a;1.采购管理 2.销售管理 3.仓库管理 4.资金管理 5.生产管理&#xff0c;适用于&#xff1a;服装…

数字化转型中的架构整合:业务、数据、应用与技术架构的协同发展

一、引言 在当今快速发展的数字经济时代&#xff0c;企业面临着前所未有的挑战与机遇。数字化转型已成为企业提升竞争力和适应市场变化的关键策略。然而&#xff0c;成功的数字化转型不仅仅依赖于技术的引入&#xff0c;更需要对企业内部架构的深刻理解与整合。本文将探讨业务架…

C语言实例_26之根据输入计算星期几

1. 问题 请输入星期几的第一个字母来判断一下是星期几&#xff0c;如果第一个字母一样&#xff0c;则继续判断第二个字母。 2. 实现思路 思路一&#xff1a;嵌套if-else语句实现 首先接收用户输入的第一个字母&#xff0c;使用if-else语句进行判断。如果输入的是M&#xff0…

ceph安装P版本

文章目录 1、搭建的要求1、OSD约束2、ceph部署方式1、cephadm的部署原理红帽版本搭建(RHCS5.0部署) 2、cephadm安装P版本1、环境要求2、配置主机名&#xff0c;关闭防火墙&#xff0c;时间同步3、检查python环境和容器运行时环境4、部署引导节点(下载cephadm脚本)1、获取脚本2、…

git 使用配置

新拿到机器想配置git 获取代码权限&#xff0c;需要的配置方法 1. git 配置用户名和邮箱 git config --global user.name xxxgit config --global user.email xxemail.com 2. 生成ssh key ssh-keygen -t rsa -C "xxemail.com" 3. 获取ssh key cat ~/.ssh/id_rsa.…

Python使用Selenium自动实现表单填写之蛇年纪念币蛇钞预约(附源码,源码有注释解析,已测试可用

Python实现纪念币预约自动填写表单 声明:本文只做技术交流,不可用代码为商业用途,文末有源码下载,已测试可用。 Part 1 配置文件改写(源码 有详细的注释说明 读取配置文件,自己组数据库,录入信息 配置文件 Part 2 主函数 每一期的xpath路径都不一样 所以需要提前去网站…

Hyper-V创建虚拟机配置IP等网络配置原理(Linux、Windows为例)

Hyper-V创建虚拟机配置IP等网络配置原理&#xff08;Linux、Windows为例&#xff09; 大家知道Windows系统里面内置了Hyper-V管理器&#xff0c;用来创建和管理本地虚拟机环境。今天我创建了两台虚拟机&#xff0c;一台是CentOS7.9&#xff08;Linux&#xff09;&#xff0c;另…

Angular由一个bug说起之十一:排序之后无法展开 Row

问题现象 在使用 Material Table 时&#xff0c;排序功能触发了一个奇怪的 Bug&#xff1a;表格的 Row 无法展开。最终排查发现&#xff0c;问题的根源在于 trackBy 的错误使用。trackBy 方法接受两个参数&#xff1a;index&#xff08;数据索引&#xff09;和 row&#xff08;…

Miller-Rabin 米勒拉宾素性检测

1、什么是Miller-Rabin Miller - Rabin 算法是一种用于判断一个数是否为素数的概率性算法。在密码学等领域&#xff0c;经常需要快速判断一个大整数是否为素数。传统的试除法对于大整数效率极低&#xff0c;而 Miller - Rabin 算法能够在较短时间内以较高的概率判断一个数是否…

【MySQL系列】MySQL 中的 SQL_MODE 设置:ANSI_QUOTES 选项解析与应用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

HarmonyOS 5.0应用开发——Ability与Page数据传递

【高心星出品】 文章目录 Ability与Page数据传递Page向Ability传递数据Ability向Page传递数据 Ability与Page数据传递 基于当前的应用模型&#xff0c;可以通过以下几种方式来实现UIAbility组件与UI之间的数据同步。 使用EventHub进行数据通信&#xff1a;在基类Context中提供…

MFC扩展库BCGControlBar Pro v36.0新版亮点:黑色主题中的自动反转图标

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v36.0已全新发布了&#xff0c;这个版本在黑暗主题中添加自动图标反转、新增一个全新的S…

查找 排序算法(系列)

复习一下排序算法吧&#xff0c;数据结构有点难&#xff0c;虽然我已经看过一遍了&#xff0c;重温一遍还是很有收获&#xff01; 本文会出一系列&#xff08;主讲算法排序&#xff09;&#xff0c;欢迎订阅&#xff01;&#xff01;&#xff01; Python中常用的排序算法有以…

Y20030053 JSP+SSM+MYSQL+LW+旅游系统的设计与实现 源码 配置 文档 全套资料

旅游系统的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 摘 要 随着旅游业的蓬勃发展和人们对休闲度假需求的不断增加&#xff0c;旅游业管理面临着越来越多的挑战。为了提高管理效率、优化客户体验并增强市场竞争力&#xff0c;本文介绍…

3D 生成重建016-SA3D从nerf中分割一切

3D 生成重建016-SA3D从nerf中分割一切 文章目录 0 论文工作1 方法介绍2 实验结果 0 论文工作 1 SAM的背景和目标&#xff1a; SAM 是一种强大的二维视觉基础模型&#xff0c;能够在 2D 图像中进行任意物体的分割。传统上&#xff0c;SAM 在二维空间表现出色&#xff0c;但其无…

Leetcode—374. 猜数字大小【简单】

2024每日刷题&#xff08;202&#xff09; Leetcode—374. 猜数字大小 C实现代码 /** * Forward declaration of guess API.* param num your guess* return -1 if num is higher than the picked number* 1 if num is lower than the picked number* …

数字孪生与大型模型强强联合,共塑工业制造崭新前景

随着新一代信息技术与实体经济的加速融合&#xff0c;工业领域的数字化、智能化转型趋势愈发显著&#xff0c;孕育出一系列制造业数字化转型的新模式与新业态。在此背景下&#xff0c;数字孪生技术作为关键支撑力量&#xff0c;正在全球范围内迅速崛起并得到广泛应用&#xff0…

vue+mars3d点击图层展示炫酷的popup弹窗

展示效果 目录 一&#xff1a;叠加数据图层到地图上&#xff0c;此时需要使用bindPopup绑定popup 二、封装自定义的popup&#xff0c;样式可以自行调整 一&#xff1a;叠加数据图层到地图上&#xff0c;此时需要使用bindPopup绑定popup 这里我根据数据不同&#xff0c;展示的…

springboot利用easypoi实现简单导出Excel

vue springboot利用easypoi实现简单导出 前言一、easypoi是什么&#xff1f;二、使用步骤 1.传送门2.前端vue3.后端springboot 3.1编写实体类&#xff08;我这里是dto,也一样&#xff09;3.2控制层结尾 前言 今天玩了一下springboot利用easypoi实现excel的导出&#xff0c;以前…