前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >云原生的应用管理中心—Helm详解

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

作者头像
用户5166556
发布2020-07-14 10:18:09
2.1K0
发布2020-07-14 10:18:09
举报

1、Helm 背景

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

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

2、Helm 介绍

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

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

代码语言:javascript
复制
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进行注入和渲染。

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
  labels:
    hello-world
spec:
{{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.replicaCount }}
{{- end }}


......

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

代码语言:javascript
复制
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被评为最受关注的开源项目。

3、helm v2和v3版本

最为显著的变化删除了tiller。从上面背景介绍可以看出helm所在公司作为一个PaaS提供商,仍然幻想在PaaS占有一席之地,但是随着k8s的强势崛起,这个梦想也跟随着破灭。

另外还有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

  1. 模板修改

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

这两张图,左边的是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的编排,或者包含各种数据卷定义,执行如下命令,拉取到本地,解压后,模仿下即可。

当然,如何学习和参考chart仓库,建议直接去helm官方学习,具体参考地址如下所示:

代码语言:javascript
复制
https://helm.sh/docs/intro/using_helm/
https://hub.helm.sh

官方网站包含详细安装,如何使用helm完成应用管理。

harbor里面会包含常见应用的编排,比如MySQL、redis、ES等等。

  1. 打包

打包之前可以先检查下有没有语法上错误,如果没有就可以执行如下命令进行打包。

  1. 运行

我们可以执行helm install来安装我们应用,另外使用kubectl查看应用是否正常运行,当然在helm install使用--set来修改values中配置信息,也可以使用新编写一个values.yaml,使用-f命令覆盖压缩包中的values.yaml

如上图所示,可以看出Pod已经正启动,而且helm给出友好提示,有些场景下,我们的chart应用是根据别的应用改造而来,这个时候会出现提示语不合适的问题,我们可以通过修改模板下的NOTES.txt订正提示语。

当然,应用的打包肯定是周期性进行的,当我们修改镜像或者更改编排文件中的内容的时候,只需要修改下Chart.yaml中的version,然后执行helm upgrade myapp *.tgz即可完成应用的升级。

  1. 应用上传

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

5、总结

k8s把应用抽象成各种资源对象,通过编排文件的形式体现出来。Helm建立在k8s编排文件之上,把编排文件制作成模板,模板中的配置信息放置到模板之外,在安装过程中动态注入到模板中,从而抽象出了应用的概念即chart,通过chart实现了应用的部署、测试、发布等全生命周期的管理。以上就是我对helm使用过程中的一点心得总结。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、Helm 背景
  • 2、Helm 介绍
  • 3、helm v2和v3版本
  • 4、安装和测试使用
    • 4.1、安装配置
      • 4.2、测试使用
      • 5、总结
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档