第九篇: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中发布应用。 

 

 

 

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

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

相关文章

微信小程序配置less并使用

1.在VScode中下载Less插件 2.在微信小程序中依次点击如下按钮 选择 从已解压的扩展文件夹安装… 3.选中刚在vscode中下载安装的插件文件 如果没有修改过插件的安装目录&#xff0c;一般是在c盘下C:\用户\用户名.vscode\extensions\mrcrowl.easy-less-2.0.2 我的路径是&#xf…

RabbitMQ 客户端工程环境配置

RabbitMQ 客户端工程环境配置 下面分别以 C# 控制台应用程序 、 Unity 工程为例 一 C# 控制台应用程序 &#xff08;1&#xff09;新建项目 (2) RabbitMQ 需要通过 NuGet 安装 打开项目解决方案 -> 依赖项(右键) -> 管理 NuGet 程序包 -> 搜索 RabbitMQ.Client -&…

chrome使用问题记录

1. http自动跳转https问题 step1. 地址栏输入&#xff1a; chrome://net-internals/#hsts step2. 找到底部Delete domain security policies一栏&#xff0c;输入想处理的域名&#xff0c;点击delete。 注意&#xff1a;输入域名时去掉前缀http step3. 搞定了&#xff0c;再…

Applied Intelligence投稿

一、关于手稿格式&#xff1a; 1、该期刊是一个二区的&#xff0c;模板使用Springer nature格式&#xff0c; 期刊投稿要求&#xff0c;详细期刊投稿指南&#xff0c;大部分按Soringernature模板即可&#xff0c;图片表格声明参考文献命名要求需注意。 2、参考文献&#xff…

数据结构初阶--算法复杂度(1)

以下我用C语言实现基础的数据结构。 目录 初识数据结构与算法 数据结构 算法 算法效率 练习&#xff1a;轮转数组(不完全版) 时间复杂度 大O的渐进表示法 例一&#xff1a; 例二&#xff1a; 例三&#xff1a; 例四&#xff1a; 例五&#xff1a; 总结&#xff…

C# 中LINQ的详细介绍

文章目录 前言一、 LINQ 的基本概念二、查询语法与方法语法三、LINQ 的投影操作四、LINQ 的排序操作五、LINQ 的过滤操作六、LINQ 的分组操作七、LINQ 的连接操作八、LINQ 的聚合操作九、LINQ 的延迟执行十、LINQ 的错误处理十一、LINQ 的合并操作十二、LINQ 的自定义对象查询十…

mongo开启慢日志及常用命令行操作、数据备份

mongo开启慢日志及常用命令行操作、数据备份 1.常用命令行操作2.mongo备份3.通过命令临时开启慢日志记录4.通过修改配置开启慢日志记录 1.常用命令行操作 连接命令行 格式&#xff1a;mongo -u用户名 -p密码 --host 主机地址 --port 端口号 库名&#xff1b; 如&#xff1a;连…

lyapunov指数的绘制

有如下方程&#xff1a; %% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)绘制其对应的lyapunov指数。 MATLAB实现方式&#xff1a; clc; clearvars; close all;%% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)%% 代码 N 1000; a (0:0.001:1.4); b 0.3; na length(a…

数字时代的文化宝库:存储技术与精神生活

文章目录 1. 文学经典的数字传承2. 音乐的无限可能3. 影视艺术的数字化存储4. 结语 数字时代的文化宝库&#xff1a;存储技术与精神生活 在数字化的浪潮中&#xff0c;存储技术如同一座桥梁&#xff0c;连接着过去与未来&#xff0c;承载着人类文明的瑰宝。随着存储容量的不断增…

关于csgo游戏搬砖作弊与封禁

关于csgo的游戏作弊与封禁 一.关于作弊 什么叫作弊&#xff1f; 1.换肤&#xff0c;换库存 2.各种参&#xff08;回溯&#xff0c;自瞄&#xff0c;透视&#xff0c;急停&#xff0c;连跳&#xff0c;假身&#xff0c;子弹跟踪等&#xff09; 3.某一部分更改游戏内存&…

Arduino IDE for mac 无法加载界面

打开软件后&#xff0c;无法加载界面的问题 1.手动删除“~/Library/Arduino15”文件夹 2.终端中输入sudo nano /etc/hosts&#xff0c;在里面添加“127.0.0.1 localhost”

Go的Gin比java的Springboot更加的开箱即用?

前言 隔壁组的云计算零零后女同事&#xff0c;后文简称 云女士 &#xff0c;非说 Go 的 Gin 框架比 Springboot 更加的开箱即用&#xff0c;我心想在 Java 里面 Springboot 已经打遍天下无敌手&#xff0c;这份底蕴岂是 Gin 能比。 但是云女士突出一个执拗&#xff0c;非我要…

使用国内镜像源加速Qt“更新/安装”的方法

QT更新/安装时&#xff0c;国外源下载很慢&#xff0c;国内镜像源也因网络环境的不同而速度各异&#xff0c;下文给出国内镜像源的配置方法。 一、命令行 1、切换对应目录&#xff0c;更新器默认目录是 C:\Qt 2、文件名镜像源 安装示例&#xff1a; .\qt-unified-windows-x…

Hbase整合Mapreduce案例2 hbase数据下载至hdfs中——wordcount

目录 整合结构准备数据下载pom.xmlMain.javaReduce.javaMap.java操作 总结 整合结构 和案例1的结构差不多&#xff0c;Hbase移动到开头&#xff0c;后面跟随MR程序。 因此对于输入的K1 V1会进行一定的修改 准备 在HBASE中创建表&#xff0c;并写入数据 create "wunaii…

python 装饰器学习与实践

目录 装饰器学习1、最基本装饰器2、函数带参数的装饰器3、装饰器带参数4、类中函数的装饰器5、装饰器实践6、pyqt5类中方法的装饰器实现时遇到的问题 装饰器学习 先假定一个场景 在之前的一篇文章中&#xff0c;分享了一个pyqt5将日志实时展示在gui界面上的功能python在pyqt5l…

OCR的评价指标和常用数据集

1.OCR任务简介 OCR(Optical Character Recognition,光学字符识别)是指对包含文本内容的图像或者视频进行处理识别&#xff0c;并提取其中所包含的文字及排版信息的过程。例如&#xff0c;一个常见的应用是将包含文档图像的不可编辑状态的 PDF 文档通过 OCR 技术识别后&#xf…

解决el-select数据量过大的3种方法

在准备上线的后台管理系统中&#xff0c;我们发现有两个下拉框&#xff08;select&#xff09;&#xff0c;其选项数据量超过 1 万条&#xff0c;而在测试环境中这些数据量只有几百条。这导致在页面加载时&#xff0c;浏览器性能出现瓶颈&#xff0c;页面卡顿甚至崩溃。 想了一…

计算机网络 第5章 运输层

计算机网络 &#xff08;第8版&#xff09; 第 5 章 传输层5.4 可靠传输的原理5.4.1 停止等待协议5.4.2 连续ARQ协议 5.5 TCP报文段的首部格式5.6 TCP可靠传输的实现5.6.1 以字节为单位的滑动窗口5.6.2 超时重传时间的选择 5.7 TCP的流量控制5.7.1 利用滑动窗口实现流量控制 5.…

【PyTorch】(基础三)---- 图像读取和展示

图像读取和展示 pytorch本身并不提供图像的读取和展示功能&#xff0c;利用pytorch执行计算机视觉任务的时候&#xff0c;通常是利用opencv等工具先进行图像处理&#xff0c;然后将结果转化成tensor类型传递给pytorch&#xff0c;在pytorch执行之后&#xff0c;也可以将tensor…

Java课程设计项目-servlet+jsp美食系统、菜品管理系统

文章目录 Java课程设计项目-servletjsp美食系统一、项目介绍二、技术介绍2.1 环境需要2.2 技术栈 环境需要三、功能实现3.1登录注册3.2首页菜品展示、轮播图3.3美食菜品分类、查询3.4作品动态、个人简介、菜品收藏3.5创建菜谱、添加步骤 四、系统代码展示4.1项目架构&#xff0…