跳至主要內容

helm打包工具

知识库容器技术kubernetes建设kubernetes大约 7 分钟

Helm 介绍

一、前言

在 k8s 中,我们很多时候需要部署很多个应用,特别是微服务的项目,如果每个服务部署都需要使用kubectl apply依次执行,这将是一件很痛苦的事。

这个时候,如果一键部署所有应用,使用 Helm (https://helm.sh)是一个很不错的选择,它具备如下的能力:open in new window

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

Helm本质就是一个k8s的包管理器。

二、Helm工作流程

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

图片
图片

如上图所示,Helm的工作流程总结如下:

  1. 开发者首先创建并编辑chart的配置;
  2. 接着打包并发布至Helm的仓库(Repository);
  3. 当管理员使用helm命令安装时,相关的依赖会从仓库下载;
  4. 接着helm会根据下载的配置部署资源至k8s。

三、Helm概念

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

概念描述
Chart一个Helm包,其中包含了运行一个应用所需要的镜像、依赖和资源定义等,还可能包含Kubernetes集群中的服务定义,类似Homebrew中的formula、APT的dpkg或者Yum的rpm文件
Repository存储Helm Charts的地方
ReleaseChart在k8s上运行的Chart的一个实例,例如,如果一个MySQL Chart想在服务器上运行两个数据库,可以将这个Chart安装两次,并在每次安装中生成自己的Release以及Release名称
ValueHelm Chart的参数,用于配置Kubernetes对象
Template使用Go模板语言生成Kubernetes对象的定义文件
NamespaceKubernetes中用于隔离资源的逻辑分区

四、Helm的使用

下面简单讲下Helm的使用。

4.1 安装Helm

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

4.2 创建Chart

使用helm create命令创建一个新的Chart,Chart目录包含描述应用程序的文件和目录,包括Chart.yaml、values.yaml、templates目录等;

4.3 配置Chart

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

Chart.yaml包含Chart的元数据和依赖项

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的SVG或PNG图片URL (可选)
appVersion: 包含的应用版本(可选)。不需要是语义化,建议使用引号
deprecated: 不被推荐的chart (可选,布尔值)
annotations:
  example: 按名称输入的批注列表 (可选).

4.4 打包Chart

使用helm package命令将Chart打包为一个tarball文件,例如在wordpress目录中使用helm package命令将Chart打包为一个tarball文件,这将生成一个名为wordpress-0.1.0.tgztarball文件:

helm package wordpress/

4.5 发布Chart

将打包好的Chart发布到一个Helm Repository中。可以使用 helm repo add 命令添加一个Repository,然后使用helm push命令将Chart推送到Repository中,例如:

helm repo add myrepo https://example.com/chartshelm push wordpress-0.1.0.tgz myrepo

4.6 安装Release

使用helm install命令安装Chart的Release,可以通过命令行选项或指定values.yaml文件来配置Release,例如:

helm install mywordpress myrepo/wordpress

这将在Kubernetes集群中创建一个名为mywordpressRelease,包含WordPress应用程序和MySQL数据库。

4.7 管理Release

使用helm ls命令查看当前运行的Release列表,例如:

## 升级 `mywordpress` 的`WordPress`应用程序镜像版本为`5.7.3-php8.0-fpm-alpine`。
helm upgrade mywordpress myrepo/wordpress --set image.tag=5.7.3-php8.0-fpm-alpine
## 可以使用`helm rollback`命令回滚到先前版本
helm rollback mywordpress 1

4.8 更新Chart

在应用程序更新时,可以更新Chart配置文件和模板,并使用helm package命令重新打包Chart。然后可以使用helm upgrade命令升级已安装的Release,可以按照以下步骤更新Chart:

  1. 在本地编辑Chart配置或添加新的依赖项;
  2. 使用helm package命令打包新的Chart版本;
  3. 使用helm push命令将新的Chart版本推送到Repository中;
  4. 使用helm repo update命令更新本地或远程的Helm Repository;
  5. 使用helm upgrade命令升级现有Release到新的Chart版本。

例如,可以使用以下命令更新WordPress的Chart版本:

## 这将升级mywordpress的Chart版本到0.2.0,其中包括新的配置和依赖项。
helm upgrade mywordpress myrepo/wordpress --version 0.2.0

## 如果需要删除一个Release,可以使用helm uninstall命令。
helm uninstall mywordpress

## 如果需要删除与Release相关的PersistentVolumeClaim,可以使用helm uninstall命令的--delete-data选项,例如:
helm uninstall mywordpress --delete-data

五、Helm的执行安装顺序

Helm按照以下顺序安装资源:

  • Namespace
  • NetworkPolicy
  • ResourceQuota
  • LimitRange
  • PodSecurityPolicy
  • PodDisruptionBudget
  • ServiceAccount
  • Secret
  • SecretList
  • ConfigMap
  • StorageClass
  • PersistentVolume
  • PersistentVolumeClaim
  • CustomResourceDefinition
  • ClusterRole
  • ClusterRoleList
  • ClusterRoleBinding
  • ClusterRoleBindingList
  • Role
  • RoleList
  • RoleBinding
  • RoleBindingList
  • Service
  • DaemonSet
  • Pod
  • ReplicationController
  • ReplicaSet
  • Deployment
  • HorizontalPodAutoscaler
  • StatefulSet
  • Job
  • CronJob
  • Ingress
  • APIService

Helm 客户端不会等到所有资源都运行才退出,可以使用 helm status 来追踪 release 的状态,或是重新读取配置信息:

helm status mynginx
## NAME: mynginx
## LAST DEPLOYED: Fri Oct 29 14:27:32 2021
## NAMESPACE: default
## STATUS: deployed
## REVISION: 1
## TEST SUITE: None

Helm 安装

下载地址:https://github.com/helm/helm/releasesopen in new window

## Helm V3
## 在 <https://github.com/helm/helm/releases> 找到对应系统的二进制包下载,比如下载v3.0.0-beta.3 的 linux amd64 版:
wget https://get.helm.sh/helm-v3.11.1-linux-amd64.tar.gz
## 查看 helm 版本
helm version

## Helm V2
# curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash

Helm 仓库

## 查看当前仓库
helm repo list
## 增加仓库
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add bitnami https://charts.bitnami.com/bitnami
## 跳过ssl证书认证
helm repo add --insecure-skip-tls-verify --username='admin' --password=12345 devops https://docker.devops.tr/chartrepo/bedrock 
## 指定ca.crt证书
helm repo add --ca-file ca.crt --username=admin --password=123456 library https://docker.devops.kk/chartrepo/library

Helm 查找

## 查询 bitnami 下的 charts
helm search repo bitnami
## 搜索 harbor 应用
helm search repo harbor

Helm 部署

## 下载远程仓库jenkins应用到本地
helm pull bitnami/harbor

## 部署 bitnami/harbor 应用
helm install --name harbor bitnami/harbor --namespace=harbor --create-namespace
## 查看应用状态
helm status harbor

## 列出已部署的应用
helm list
## 删除应用版本
helm uninstall harbor
## 列出已删除的应用版本
helm ls --deleted

## 列出历史版本
helm history harbor
## 回退上一个版本
helm rollback harbor 1

Helm 应用

helm repo add devops https://docker.devops.kk --username admin --password Harbor12345
## 创建一个名为mychart的chart
helm create mychart
## 打包chart
helm package mychart/
## 上传chart
helm registry login docker.devops.kk --insecure --username admin --password Harbor12345 --ca-file ca.crt 
helm push blog-docs-0.2.0.tgz oci://docker.devops.kk/chartrepo/bedrock --ca-file ca.crt