应用包管理-Helm

引言

对于K8s来说,应用资源配置可以定义为K8s API对象,包括DeploymentNamespaceServicePV(Persistent Volumes)PVC(PersistentVolumeClaims)等等。通常一个应用的部署会涉及很多资源的共同协作,用户会定义这些API对象到一系列Yaml文件中,然后通过kubectl来逐一进行部署。

如果说需要部署的是单一、少数服务的应用,那么完全可以使用yaml文件的方式,这样会很简单。但是在实际的项目当中,微服务的数量基本不可能是一个,可能是几十个,如果说再用yaml文件的部署方式,那就意味着需要编写几十个yaml文件,这就会导致数量多、维护难等诸多问题。,特别是微服务的项目,如果每个服务部署都需要使用kubectl apply依次执行,这将是一件很痛苦的事情,这个时候,使用Helm是一个很不错的选择。

Helm是Kubernetes的包管理器。包管理器类似于我们在Ubuntu中使用的apt、Centos中使用的yum或者Python中的pip一样,能快速查找、下载和安装软件包。helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用的部署和管理。

Helm具备以下功能:
简化部署:Helm允许使用单个命令轻松部署和管理应用程序,从而简化了整个部署过程;
高度可配置:Helm Charts提供了高度可配置的选项,可以轻松自定义和修改应用程序的部署配置;
版本控制:Helm允许管理应用程序的多个版本,从而轻松实现版本控制和回滚;
模板化:Helm Charts使用YAML模板来定义Kubernetes对象的配置,从而简化了配置过程,并提高了可重复性和可扩展性;
应用程序库:Helm具有应用程序库的概念,可以轻松地共享和重用Helm Charts,从而简化了多个应用程序的部署和管理;
插件系统:Helm拥有一个强大的插件系统,允许您扩展和定制Helm的功能,以满足特定的需求和要求。

一、helm的工作流程

以下是helm的工作流程(注意:这里使用的是helm的v3版本,该版本没有tiller,并使用了更加简单和灵活的架构,直接通过kubeconfig链接apiserver,简化安全模块,降低了用户的使用壁垒):

Helm的工作流程
如上图所示,Helm的工作流程如下:
1.开发者首先创建并编辑chart的配置;
2.接着打包并发布至helm的仓库repository
3.当管理员会用helm命令安装时,相关的依赖会从仓库下载;
4.接着helm会根据下载的配置部署资源至kubernetes;

helm 组件及相关术语

在使用helm的过程中,需要理解如下的三个核心的概念:

概念描述
chartHelm的软件包,采用tar格式,其中包含了运行一个应用所需要的镜像、依赖和资源定义等,还可能包含Kubernetes集群中的服务定义,类似Homebrew中的formula、APT的dpkg或者Yum的rpm文件
repository用于存储和管理chart。repository可以包含多个chart,用户可以从这个从这些存储库中选取需要的chart进行部署。helm支持多种类型的repository,包括官方的helm hub以及用户自定义的私有仓库等
releaserelease是chart在k8s急群中的部署实例。每个chart可以部署一个或多个release。release是chart在急群中的具体的运行实例,他代表了chart在集群中的状态和配置

helm的使用

安装helm

首先需要在本地机器或Kubernetes集群上安装Helm。可以从Helm官方网站下载适合自己平台的二进制文件,或使用包管理器安装Helm,安装教程参考官网 https://helm.sh

创建chart

使用helm create命令创建一个新的chart,chart目录包含描述应用程序的文件和目录,包括chart.yaml、templates目录等;
在生成的目录中有以下几个部分:

文件含义
charts一个普通的空文件,一般也不会写入内容
Chart.yaml当前chart属性的配置信息
templates自己定义的yaml文件存于此
values.yaml定义yaml文件的全局配置

例如:在本地机器上使用helm create命令创建一个名为wordpress的chart:

$ helm create wordpress
Creating wordpress

创建/编辑chart配置

使用编辑器编辑chart配置文件,包括chart.yaml和values.yaml

chart.yaml

chart.yaml的模板及注释如下:

apiVersion: chart API 版本 (必需)  #必须有
name: chart名称 (必需)     # 必须有 
version: 语义化2 版本(必需) # 必须有

kubeVersion: 兼容Kubernetes版本的语义化版本(可选)
description: 一句话对这个项目的描述(可选)
type: chart类型 (可选)
keywords:
  - 关于项目的一组关键字(可选)
home: 项目home页面的URL (可选)
sources:
  - 项目源码的URL列表(可选)
dependencies: # chart 必要条件列表 (可选)
  - name: chart名称 (nginx)
    version: chart版本 ("1.2.3")
    repository: (可选)仓库URL ("https://example.com/charts") 或别名 ("@repo-name")
    condition: (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled )
    tags: # (可选)
      - 用于一次启用/禁用 一组chart的tag
    import-values: # (可选)
      - ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项
    alias: (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用

maintainers: # (可选) # 可能用到
  - name: 维护者名字 (每个维护者都需要)
    email: 维护者邮箱 (每个维护者可选)
    url: 维护者URL (每个维护者可选)

icon: 用做icon的SVGPNG图片URL (可选)
appVersion: 包含的应用版本(可选)。不需要是语义化,建议使用引号
deprecated: 不被推荐的chart (可选,布尔值)
annotations:
  example: 按名称输入的批注列表 (可选).

举例:

name: nginx-helm
apiVersion: v1
version: 1.0.0
values.yaml

values.yaml包含应用程序的默认配置值,例如:

image:
  repository: nginx
  tag: '1.19.8'
templates
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-helm-{{ .Values.image.repository }}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-helm
  template:
    metadata:
      labels:
        app: nginx-helm
    spec:
      containers:
      - name: nginx-helm
        image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
        ports:
        - containerPort: 80
          protocol: TCP

将chart配置编辑完成后,我们就可以通过helm命令将其进行打包、发布、安装、管理(更新、回滚)等一系列操作,感兴趣的可以自行实验,这里就不一一列举了

helm的常用操作命令汇总

距离一些常用操作命令,直接使用在这里插入代码片helm --help`即可查看

#查看仓库
helm repo list

#更新仓库
helm repo update

#删除仓库
helm repo remove 仓库名称

#搜索应用
helm search repo 名称

#安装应用
helm install 自定义应用名称 搜索出的结果名

#查看安装后的应用
helm list
helm status 应用名称	

#创建chart
helm create chart名称

heml的执行安装顺序

最后值得一提的是,helm的安装顺序侧面反映出资源的依赖关系需要被正确的处理,一下是helm的执行安装顺序:

Namespace #首先会创建Namespace,因为它为集群内的资源提供了一个逻辑上的隔离区域

NetworkPolicy #接下来会安装NetworkPolicy,用于定义如何允许或拒绝Pod之间的网络通信

ResourceQuota #设置资源使用量的硬性限制

LimitRange #为Pod或Container设置默认的请求/限制值

PodSecurityPolicy #helm3中可能会通过其他方式管理,因为psp在k8s中已被弃用

PodDisruptionBudget #用于指定在资源中断(如节点维护)期间可以安全的中断的Pod的数量

ServiceAccount #创建sa,用于Pod的身份认证

Secret #用于存储敏感信息,如密码、OAuth令牌和ssh密钥

SecretList  #它是secret的列表表示,但通常不是直接安装的对象,而是通过列表操作查看Secret

ConfigMap #ConfigMap用于存储配置数据,这些数据可以被Pod中的容器使用

StorageClass #定义了存储“类”

PersistentVolume #是急群中存储资源的抽象

PersistentVolumeClaim #是用户对pv的请求

CustomResourceDefinition #自定义资源定义,允许用户扩展kubernetes API存储和管理新的资源对象

ClusterRole、ClusterRoleList、ClusterRoleBinding、ClusterRoleBindingList #这些资源用于定义集群级别的角色、角色列表、
角色绑定、角色绑定列表(想了解BAC的相关知识可以看我关于RBAC的文章)

Role、RoleList、RoleBinding、RoleBindingList #与ClusterRole系列资源类似,但这些资源定义的是命名空间级别的角色和角色绑定

Service #定义pod之间的通信规则,允许一个pod访问领一个pod的端口

DaemonSet、Pod、ReplicationController、ReplicaSet、Deployment、HorizontalPodAutoscaler、StatefulSet、Job、CronJob:
#这些workload资源定义了pod的部署、扩展、自动缩放和计划任务等

Ingress:ingress提供了一种将集群外部流量路由到集群内部服务的方式

本章内容已完结,感谢浏览 (完结撒花~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值