一、什么是Helm

  • Helm是Kubernetes的包管理器,类似于Python的pip centos的yum,主要用来管理 Charts。
  • Helm Chart是用来封装Kubernetes原生应用程序的一系列YAML文件。可以在你部署应用的时候自定义应用程序的一些Metadata,以便于应用程序的分发。对于应用发布者而言,可以通过Helm打包应用、管理应用依赖关系、管理应用版本并发布应用到软件仓库。

二、Helm带来的便捷

  • 我们日常在K8S中部署可用应用时,需要涉及到很多的K8S资源的共同协作(Controller、Service、Configmap、Secret、RBAC、PV、PVC、Ingress等一系列资源),这些资源过于分散,不方便管理以及定义方式的局限性,直接提供kubectl来管理和生效YAML配置创建可用应用,让人头疼,不便于维护。
  • 在部署一个应用,会遇到哪些问题:
  • 如何统一管理、配置和更新这些分散的k8s的应用资源文件;
  • 如何分发和复用应用模板;
  • 如何将应用的一系列资源当做一个软件包管理;
  • 对于使用者而言,使用Helm后不用需要编写复杂的应用部署文件,可以以简单的方式在K8S上查找、安装、升级、回滚、卸载应用程序;

三、 Helm 工作原理及架构演变

3.1、工作原理

用helm部署k8s监控_nginx

Chart Install 过程

  • Helm 从指定的目录或者 TAR 文件中解析出 Chart 结构信息。
  • Heml 将指定的 Chart 结构和 Values 信息通过 gRPC 传递给 Tiller。
  • Tiller 根据 Chart 和 Values 生成一个 Release。
  • Tiller 根据 Release 发送给 Kubernetes 用于生成 Release。

Chart Update 过程

  • Helm 从指定的目录或者 TAR 文件中解析出 Chart 结构信息。
  • Helm 将需要更新的 Release 的名称、Chart结构和 Values 信息传递给 Tiller。
  • Tiller 生成 Release 并更新指定名称的 Release 和 History。
  • Tiller 将 Release 发送给 Kubernetes 用于更新 Release。

Chart Rollback 过程

  • Helm 将要回滚的 Release 的名称传递给 Tiller。
  • Tiller 根据 Release 的名称查找 History。
  • Tiller 从 History 中获取上一个 Release。
  • Tiller 将上一个 Release 发送给 Kubernetes 用于替换当前 Release。

3.2、架构演变

  • 在2019 年 11 月 4 日,Helm 社区 repo 中提供 安全审计报告 , Helm v3 中的访问控制与 Helm v2 中的访问控制发生变更;
  • 移除 Tiller
  • 支持将 Chart 推送至 Docker 镜像仓库中
  • 使用JSONSchema验证chart values
  • 给helm charts添加test了,通过helm test命令 针对部署的应用跑tests
  • 部署时release name必须指定,helm2时可自动随机生成
  • 删除时无须再使用 –purge
  • 为了更好地协调其他包管理者的措辞 Helm CLI 个别更名;helm delete更名为helm uninstall,helm inspect更名为helm show,helm fetch更名为helm pull
  • 不再需要requirements.yaml, 依赖关系是直接在chart.yaml中定义
  • 移除了用于本地临时搭建 Chart Repository的 helm serve 命令

用helm部署k8s监控_运维_02

用helm部署k8s监控_nginx_03

五、Helm 组件及相关术语

  • Helm : 命令行下的客户端工具,主要用于 K8S 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。
  • Chart:Helm 包,采用 TAR 格式。其中包含了运行一个应用所需要的镜像、依赖和资源定义等,还可能包含 Kubernetes 集群中的服务定义,类似 Homebrew 中的 formula、APT 的 dpkg 或者 Yum 的 rpm 文件。
  • Release:在 Kubernetes 集群上运行的 Chart 的一个实例。在同一个集群上,一个 Chart 可以安装很多次。每次安装都会创建一个新的 release。每次安装都会生成自己的 Release,会有自己的 Release 名称。
  • Repository:用于发布和存储 Chart 的存储库。
  • Tiller : (v2版本)Helm 的服务端。Tiller 负责接收 Helm 的请求,与 k8s 的 apiserver 交互,根据chart 来生成一个 release 并管理 release。

六、Helm常用命令

命令

描述

create

创建一个chart并指定名字

dependency

管理chart依赖

get

下载一个release。可用子命令:all、hooks、manifest、notes、values

history

获取release历史

install

安装一个chart

list

列出release

package

将chart目录打包到chart存档文件中

pull

从远程仓库中下载chart并解压到本地 # helm pull stable/mysql --untar

repo

添加,列出,移除,更新和索引chart仓库。可用子命令:add、index、list、remove、update

rollback

从之前版本回滚

search

根据关键字搜索chart。可用子命令:hub、repo

show

查看chart详细信息。可用子命令:all、chart、readme、values

status

显示已命名版本的状态

template

本地呈现模板

uninstall

卸载一个release

upgrade

更新一个release

version

查看helm客户端版本

七、推荐仓库

  • 难免需要安装一些三方的基础服务,常用仓库如下 :
  • bitnami官方地址: https://bitnami.com/
  • 微软仓库 : http://mirror.azure.cn/kubernetes/charts/
  • 阿里云仓库 : https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
  • 官方仓库 : https://hub.kubeapps.com/charts/incubator
  • elasticsearch : https://helm.elastic.co
添加微软仓库为 stable
$ helm repo add stable http://mirror.azure.cn/kubernetes/charts
"stable" has been added to your repositories
 
添加阿里云仓库为 aliyun
$ helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts 
"aliyun" has been added to your repositories

查看本地已添加的仓库
$ helm repo list 
NAME    URL                                                   
stable  http://mirror.azure.cn/kubernetes/charts              
aliyun  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

查看仓库所有的包
$ helm search repo stable

移除仓库
$ helm repo remove stable

列出仓库中相关的包
$ helm search repo mysql

八、Charts

8.1、目录结构

demochart/
├── charts                          # 目录用于存放所依赖的子chart
├── Chart.yaml                      # 描述这个 Chart 的相关信息、包括名字、描述信息、版本等
├── templates                       # 模板目录,通常会使用values.yaml配置内容进行填充,板引擎渲染此目录的文件后Tiller将渲染得到的结果 提交给Kubernetes创建响应的对象
│   ├── deployment.yaml             # deployment 控制器的 Go 模板文件
│   ├── _helpers.tpl                # 模板助手文件,定义的值可在模板中使用
│   ├── ingress.yaml                # ingress 的模板文件 
│   ├── NOTES.txt                   # Chart 部署到集群后的一些信息,例如:如何使用、列出缺省值,可以理解为帮助文档
│   ├── serviceaccount.yaml
│   ├── service.yaml                # service 的 Go 模板文件
└── values.yaml                     # 模板的值文件,这些值会在安装时应用到 GO 模板生成部署文件

8.2、构建一个无状态应用模版charts

部分常用语法说明 : http://masterminds.github.io/sprig/strings.html

  • 目录结构
$ tree demochart/
demochart/
├── charts
├── Chart.yaml
├── templates                   
│   ├── deployment.yaml  
└── values.yaml
  • Chart.yaml
apiVersion: v2
name: demochart
description: A Helm chart for Kubernetes, The author is Daizhe
type: application
version: 0.1.0
appVersion: 1.16.0
  • templates/deployment.yaml
$ vim templates/deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: deployment
  name: {{ .Values.Name }}
spec:
  replicas: {{ .Values.replicas }}
  selector:
    matchLabels:
      app: deployment
  template:
    metadata:
      labels:
        app: deployment
    spec:
      containers:
      - image: {{ .Values.image }}
        name: nginx
  • values.yaml
Name: demo-deploy-nginx
replicas: 1
image: nginx:latest
  • install 安装
$ helm install nginx-dep demochart/ --dry-run
$ helm install nginx-dep demochart/
$ helm list
  • upgrade 升级
$ helm upgrade -f values.yaml nginx-dep demochart
  • rollback 回滚
$ helm history nginx-dep
$ helm rollback nginx-dep 1