云原生的应用管理中心—Helm详解

1、Helm 背景

2016年,随着k8s成为编排领域事实上的标准,很多公司的PaaS平台都转向以k8s为基础容器化平台,但是Deishelm公司)是一个地地道道的PaaS服务商,在这片云原生的红海中步履维艰,幸运的是,凭借敏锐的技术嗅觉最终还是拯救了这个的团队。2016年底,Deis开始全面转向k8s体系,它不像其它公司一样把k8s作为PaaS基础设施工具,而是围绕k8s产生的编排文件做了应用包管理器helm云原生的应用管理中心—Helm详解_第1张图片

我们知道,k8s是工业级的编排平台,要想服务在这个编排平台上运行,编排文件必不可缺,常见的有svc.yaml、config.yaml、deployment.yaml、ingress.yaml,正常情况下服务正常运行起来,要执行四次kubectl apply -f,这个处理起来比较简单,可以通过脚本或者合并编排文件,执行一次启动服务,但是如何管理这些编排文件呢?开发、测试、生产...不同环境运行的编排文件大致相同,但是会有所区别,特别对于微服务场景下,存在大量的服务,很多配置环境配置,比如副本数量、资源配置都是一样的,如何进行管理?且看下文。

2、Helm 介绍

Helm提出了一种非常简单的思路,首先它提出了应用的概念,它把k8s编排文件打包为Chart,而这个Chart对应的正是我们应用安装包。具体格式如下所示:

云原生的应用管理中心—Helm详解_第2张图片

其中Chart中会存储应用的元信息:

apiVersion: v2
name: hello-world
description: A Helm chart for Kubernetes
# 包类型可以 'application' 或者 'library'
type: application
# chart版本号
version: 0.1.0
# 应用版本号
appVersion: 1.16.0

template目录下面则存放着我们熟悉的编排文件,比如下面的deployment的编排文件,里面把replicas定义为变量,helm进行注入和渲染。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
  labels:
    hello-world
spec:
{{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.replicaCount }}
{{- end }}


......

values则提供了默认的参数配置,如下所示:

replicaCount: 1
image:
  repository: nginx
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart appVersion.
  tag: ""


imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
......

通过上面的chart,就可以通过修改外层values中的变量,helm把变量注入到模板中,从而完成了配置的修改。你可以直接直接helm install app app/helloword就完成了服务配置的修改和编排文件的启动,当然helm允许你打成压缩包,上传到Helm Hub,别人就可以把Chart应用直接下载,启动。所以Helm Hub成了类似于docker Hub的应用分发中心。成为了云原生技术体系中被广泛使用的开源项目之一。2019 kubeCON大会,Kubernetes、Prometheus、Helm被评为最受关注的开源项目。

云原生的应用管理中心—Helm详解_第3张图片

3、helm v2和v3版本

最为显著的变化删除了tiller。从上面背景介绍可以看出helm所在公司作为一个PaaS提供商,仍然幻想在PaaS占有一席之地,但是随着k8s的强势崛起,这个梦想也跟随着破灭。云原生的应用管理中心—Helm详解_第4张图片另外还有Release名字可缩小至Namespace范围,需要显示启用选项 --generate-name,这进一步规范和完善了Helm应用的名称问题;合并描述应用依赖的requirements.yamlChart.yaml,进一步减小用户的学习负担;支持helm push到远端Helm Hub,支持登陆认证;支持在容器镜像 Registry中存储Charts,消除Helm HubDockerHub的重合定位,命令方面由helm fetch也改成了helm pull,为下一步像docker pull拉取镜像一样拉取chart做准备;对values.yaml里的内容进行验证等变化。

总而言之,就像python2python3一样,选择helm3就对了,如果之前使用的v2版本,其实也没关系,helm官方提供的有转换升级工具。

4、安装和测试使用

4.1、安装配置

  • 下载 https://github.com/helm/helm/releases

  • 解压

    tar xf helm-v3.2.4-linux-amd64.tar.gz & mv linux-amd64/helm /usr/local/bin/helm

  • 配置仓库

    helm repo add stable https://kubernetes-charts.storage.googleapis.com/

4.2、测试使用

安装完成helm之后,就可以进行应用的创建,打包和运行。

  1. 模板创建

helm create my-app

云原生的应用管理中心—Helm详解_第5张图片
  1. 模板修改

初看helm模板,有点懵,不知怎么回事,而且模板里面用了go的模板语法,仔细分析下就会发现非常简单,请看下图:

云原生的应用管理中心—Helm详解_第6张图片这两张图,左边的是deployment.yaml编排模板,右边的是values.yaml,如上图所示deployment中有很多以{{}}包裹起来的变量,这些变量大多是以.Values或者.Chart开头的变量,这些变量都是从Chart.yaml或者values.yaml获取出来的。

例如:上图所示replicas中副本数量没有写在编排文件中,而是定义在了values.yaml中,其中的replicaCount就是Pod运行后的副本数量,同样的,镜像也是一样的方式暴露在values.yaml中。Helm在执行安装的时候,首先会取出valueschart中的值渲染到模板中,然后执行渲染后的k8s编排文件,渲染由Helm帮助我们去做,我们只需要在values中填写变化的配置部分即可。

这部分也是很多人困惑的地方,没有写过这种编排模板语法,甚至连k8s yaml编排文件的格式还没搞明白,忽然上手感觉别扭,虽然helm提供的有创建模板功能,但这种创建的helloword编排文件不能满足自己需求,不要担心,比葫芦画瓢即可。

  • 第一步你要先创建一个chart应用;

  • 第二步修改镜像中的内容;

  • 第三步如果应用和创建简单的helloword编排文件不相符合,举个例子,自己应用是有状态应用,基于statefulset的编排,或者包含各种数据卷定义,执行如下命令,拉取到本地,解压后,模仿下即可。

云原生的应用管理中心—Helm详解_第7张图片当然,如何学习和参考chart仓库,建议直接去helm官方学习,具体参考地址如下所示:

https://helm.sh/docs/intro/using_helm/
https://hub.helm.sh

官方网站包含详细安装,如何使用helm完成应用管理。云原生的应用管理中心—Helm详解_第8张图片harbor里面会包含常见应用的编排,比如MySQL、redis、ES等等。

云原生的应用管理中心—Helm详解_第9张图片
  1. 打包

打包之前可以先检查下有没有语法上错误,如果没有就可以执行如下命令进行打包。云原生的应用管理中心—Helm详解_第10张图片

  1. 运行

我们可以执行helm install来安装我们应用,另外使用kubectl查看应用是否正常运行,当然在helm install使用--set来修改values中配置信息,也可以使用新编写一个values.yaml,使用-f命令覆盖压缩包中的values.yaml云原生的应用管理中心—Helm详解_第11张图片如上图所示,可以看出Pod已经正启动,而且helm给出友好提示,有些场景下,我们的chart应用是根据别的应用改造而来,这个时候会出现提示语不合适的问题,我们可以通过修改模板下的NOTES.txt订正提示语。云原生的应用管理中心—Helm详解_第12张图片当然,应用的打包肯定是周期性进行的,当我们修改镜像或者更改编排文件中的内容的时候,只需要修改下Chart.yaml中的version,然后执行helm upgrade myapp *.tgz即可完成应用的升级。

  1. 应用上传

官方提供的有CHARTMUSEUM,通过这个工具可以构建自己的chart仓库,当然也可以复用现有docker harbor,新版本的harbor支持chart压缩包上传与下载,当然也可以使用公有云上镜像仓库,比如:阿里云等这部分不过多赘述。

5、总结

k8s把应用抽象成各种资源对象,通过编排文件的形式体现出来。Helm建立在k8s编排文件之上,把编排文件制作成模板,模板中的配置信息放置到模板之外,在安装过程中动态注入到模板中,从而抽象出了应用的概念即chart,通过chart实现了应用的部署、测试、发布等全生命周期的管理。以上就是我对helm使用过程中的一点心得总结,如有问题或者想深入讨论的同学请关注公众号,加我微信,希望能够帮助到大家,谢谢。

推荐阅读

基于helm部署Kubernetes下的高可用redis

Kustomize 轻松解决多环境 yaml 编排文件的管理


原创不易,随手关注或者”在看“,诚挚感谢!

你可能感兴趣的:(云原生的应用管理中心—Helm详解)