第九篇: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.mzph.cn/bicheng/63877.shtml

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

相关文章

【CSS in Depth 2 精译_072】第 12 章 CSS 排版与间距概述 + 12.1 间距设置(上):究竟该用 em 还是 px

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 ✔️ 12.1.1 使用 em 还是 px ✔️12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 文章目录 第 12 章 排版与间距…

el-thee懒加载删除某条数据 ,el-thee懒加载重置,el-thee刷新某个节点

一、懒加载的tree已经全部展开&#xff0c;外部点击删除的时候不需要重新展开点击获取下一层数据 <template> <el-treeref"tree":data"treeData":props"defaultProps"render-after-expandhighlight-currentlazy:expand-on-click-node&q…

【问题记录】07 MAC电脑,使用FileZilla(SFTP)连接堡垒机不成功

项目场景&#xff1a; 使用MAC电脑&#xff0c;以子账号&#xff08;非root&#xff09;的形式登录&#xff0c;连接堡垒机CLB&#xff08;传统型负载均衡&#xff09;&#xff0c;使用FileZilla&#xff08;SFTP&#xff09;进行FTP文件传输。 问题描述&#xff1a; MAC电脑…

狗为啥会咬自己的尾巴

狗啃咬自己的尾巴&#xff0c;这一现象并非简单的好奇或贪玩之举&#xff0c;其背后可能隐藏着诸多复杂的原因&#xff0c;值得我们深入探究与深思。 从生理层面来看&#xff0c;尾巴部位出现皮肤疾病、寄生虫感染或受伤疼痛是常见诱因。例如&#xff0c;湿疹、跳蚤、蜱虫等问…

【数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;编写一个程序实现顺序栈的基本运算。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 初始化栈、销毁栈、判断栈是否为空、进栈、出栈、取…

Codeforces Round 992 (Div. 2)

传送门&#xff1a;Dashboard - Codeforces Round 992 (Div. 2) - Codeforces A. Game of Division 思路&#xff1a;模拟 AC代码&#xff1a;Submission #295676347 - Codeforces B. Paint a Strip 思路&#xff1a;数学 贪心 放置的位置一定是 1 4 10 22 48 ....…

前端(五)css属性

css属性 文章目录 css属性一、字体属性二、文本属性三、背景属性四、盒子模型 一、字体属性 font-weight&#xff1a;文字粗细&#xff0c;在100到900之间&#xff0c;normal(400),bord(700),inherit(继承父类) font-style&#xff1a;文字风格&#xff0c;normal表示正常(默认…

Linux网络之“桥接模式”和“NAT模式”配置

介绍虚拟机的“桥接模式”和“NAT模式”配置。 1、“桥接模式”介绍 “桥接模式”将虚拟机的虚拟网络适配器与主机的“物理网络适配器”进行交接&#xff0c;虚拟机中的“虚拟网络适配器”通过主机中的“物理网络适配器”访问外部网络。物理主机的网卡好比是一个“虚拟的交换机…

shell编程(完结)

shell编程&#xff08;完结&#xff09; 声明&#xff01; 学习视频来自B站up主 ​泷羽sec​​ 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其…

爬虫自动化之drissionpage+SwitchyOmega实现随时切换代理ip

本文介绍了如何使用DrizzlePage进行爬虫自动化,并重点讲解了首次启动时设置代理IP以及通过SwitchyOmega插件实现随时切换代理IP的方法。 安装一次,后面调用就不会再去安装了 下载地址:https://github.com/FelisCatus/SwitchyOmega/releases 这两个文件随便那个都可以,下载…

Ariba Procurement: Administration_Integration Basics

Ariba Procurement: Administration_Integration Basics SAP Ariba 和SAP ERP 的主数据集成 对于主数据,CIG 仅仅做数据传输,在CIG系统里无任何转换逻辑。在CIG中,不需要给主数据创建项目。SAP中以所需的文件格式或模式提取主数据(MD)。文件格式为CSV。然后,所有文件都…

HDOJ 1735:字数统计 ← 贪心

【题目来源】https://acm.hdu.edu.cn/showproblem.php?pid1735【题目描述】 一天&#xff0c;淘气的 Tom 不小心将水泼到了他哥哥 Jerry 刚完成的作文上。原本崭新的作文纸顿时变得皱巴巴的&#xff0c;更糟糕的是由于水的关系&#xff0c;许多字都看不清了。可怜的 Tom 知道他…

解决创建laravel项目,使用国外镜像超时,国内镜像缺包的问题

解决创建laravel项目&#xff0c;使用国外镜像超时&#xff0c;国内镜像缺包的问题 一、前言二、切换镜像三、创建最新版本四、创建指定版本 一、前言 最近想下载 laravel 框架看看&#xff0c;但也遇到了些麻烦&#xff0c;这里做个记录。 二、切换镜像 先查看镜像源&#…

图片添加水印的实验原理,实验代码,实验现象

一、图片添加水印的实验原理 1. 选择水印类型 可见水印&#xff1a;这些水印可以直接被肉眼看到&#xff0c;通常用于防止未经授权的使用。它们可以是文字、标志或图案等形式&#xff0c;并且放置在图像的显著位置。不可见水印&#xff1a;这类水印不容易被察觉&#xff0c;但…

【机器学习算法】——决策树之集成学习:Bagging、Adaboost、Xgboost、RandomForest、XGBoost

集成学习 **集成学习(Ensemble learning)**是机器学习中近年来的一大热门领域。其中的集成方法是用多种学习方法的组合来获取比原方法更优的结果。 使用于组合的算法是弱学习算法&#xff0c;即分类正确率仅比随机猜测略高的学习算法&#xff0c;但是组合之后的效果仍可能高于…

MySQL常用运维操作(一):快速复制一张表

假设有如下表结构&#xff1a; -- 创建表db1.t create database db1; use db1; create table t(id int primary key,a int, b int, index(a))engineinnodb;-- 向表t写入1000行数据 delimiter ;;create procedure idata()begindeclare i int;set i1;while(i<1000)doinsert i…

Autosar CP RTE:一个例子简要介绍工作原理

以下是一个示例&#xff0c;展示如何通过AUTOSAR的RTE机制利用配置&#xff08;ARXML文件&#xff09;来实现软件组件集成&#xff0c;包含对应的C源代码以及模拟自动生成的RTE框架代码的示例。请注意&#xff0c;实际的AUTOSAR项目会复杂得多&#xff0c;这里只是一个简化且示…

实践项目3:温度采集系统

一、功能说明 基于AVR单片机设计一温度采集系统。该系统由一个主机和一个从机构成&#xff0c;能够实时检测并显示现场温度&#xff0c;当温度超过预置温度时&#xff0c;进行声光报警。 二、具体要求 1、主机与从机之间采用串口通信&#xff1b; 2、从机采集温度并通过串口…

React简单入门 - [Next.js项目] - 页面跳转、AntD组件、二级目录等

须知 1Next.js 官网(英文)https://nextjs.org/2Next.js 文档(中文)https://nextjscn.org/docs/3Ant Design组件总览https://ant-design.antgroup.com/components/overview-cn4tailwindcss类名大全 官网https://www.tailwindcss.cn/docs/justify-content 5tailwindcss常用类…

Python知识分享第25天-快速排序算法

快速排序算法 快速排序&#xff08;QuickSort&#xff09;是一种基于分治法的高效排序算法。它通过选择一个“基准”元素&#xff0c;将数组分成两个子数组&#xff0c;其中一个子数组的所有元素都比基准小&#xff0c;另一个子数组的所有元素都比基准大&#xff0c;然后递归地…