前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >容器 & 服务:Helm Charts 配置文件分析

容器 & 服务:Helm Charts 配置文件分析

作者头像
程序员架构进阶
发布2021-11-19 09:55:27
1.7K0
发布2021-11-19 09:55:27
举报
文章被收录于专栏:架构进阶架构进阶

系列文章:

容器 & 服务:Helm Charts(一)

容器 & 服务:Helm Charts(二)安装与使用

容器 & 服务:Helm Charts(三)K8s 集群信息

一 简介

chart 是 Helm 的应用打包格式。chart 由一系列文件组成,这些文件描述了 K8s 部署应用时所需要的资源,比如 Service、Deployment、PersistentVolumeClaim、Secret、ConfigMap 等。

chart可繁可简,即可以只用于部署一个单独的服务,例如mysql、nginx等等,也可以用于部署整个应用,例如由HTTP服务、数据库、缓存、中间件等共同构成的复杂应用。

在我们的应用中,chart的整个目录通常会被打成压缩包(tgz or tar等),并带有版本等信息,用于Helm执行部署。

二 chart示例

如下,test-0.1-1862.tgz就是一个chart的产出压缩包:

我们把这个文件解压后。得到目录内容如下图所示:

其中包含了configmap,deployment,service,以及chart和values.yaml配置。包含了从依赖服务,到所需变量,以及部署和service相关的配置。

更完整的目录组成如下:

•Chart.yaml: 包括仓库地址,版本信息等,描述 chart 的概要信息;

•values.yaml: chart 支持在安装的时根据参数进行定制化配置,而 values.yaml 则提供了这些配置参数的默认值;

•values.schema.json 验证values.yaml

•charts: 依赖其他包的charts文件

•requirements.yaml: 依赖的charts(v1 api)

•requirements.lock v1 api具体依赖的版本

•README.md: 开发人员自己阅读的文件

•LICENSE:版权文件

•crd目录,存放crd资源文件

templates 目录 各类 Kubernetes 资源的配置模板都放置在这里。Helm 会将 values.yaml 中的参数值注入到模板中生成标准的 YAML 配置文件。

模板是 chart 最重要的部分,也是 Helm 最强大的地方。模板增加了应用部署的灵活性,能够适用不同的环境

–deployment.yaml 创建k8s资源的yaml文件

另一个例子,mysql的chart目录结构:

三 文件内容解析

通过上面的两个例子,可见Chart文件中,比较重要的文件可以认为是5个:Chart.yaml,values.yaml,templates下的:configmap.yaml,deployment.yaml,service.yaml。接下来我们详细分析这5个文件。

3.1 Chart.yaml

内容与规则:

代码语言:javascript
复制
apiVersion: # K8s API版本,目前是用的是“v1”(必需)
name: # 工程的包名(必需)
version: # Chart版本号,需要符合 SemVer 2:http://semver.org/(语义化版本规范)(必需)
kubeVersion: # 一系列兼容的Kubernetes版本(可选)
description: # Chart描述,通常用一句话描述项目(可选)
keywords:
  - # 有关此项目的关键字列表,便于检索(可选)
home: # 项目主页URL(可选)
sources:
  - # 指向此项目源代码的URL列表(可选)
maintainers: # 维护人员信息(可选)
  - name: # 维护者姓名(每个维护者必须填写)
    email: # 维护者电子邮件(每个维护者可选)
    url: # 维护者URL(每个维护者可选)
engine: gotpl # 模板引擎名称(可选,默认为gotpl)
icon: # 要用作图标的SVG或PNG图像的URL(可选)
appVersion: # 包含的应用程序版本(可选)。这不必是SemVer
deprecated: # 此“chart”是否已弃用(可选,布尔值)
tillerVersion: 此“chart”所需的“Tiller”版本。这应该表示为SemVer范围:“>2.0.0”(可选)

示例:

代码语言:javascript
复制
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for project
name: project
version: 0.1.0

3.2 templates

templates目录中存放了Kubernetes部署文件的模版。

3.2.1 deployment

这里先再介绍一下deployment:

Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义 (declarative) 方法,用来替代以前的 ReplicationController 更方便的管理应用。

作为最常用的 Kubernetes 对象,Deployment 经常会用来创建 ReplicaSet 和 Pod,我们往往不会直接在集群中使用 ReplicaSet 部署一个新的微服务,一方面是因为 ReplicaSet 的功能其实不够强大,一些常见的更新、扩容和缩容运维操作都不支持,Deployment 的引入就是为了支持这些复杂的操作。

3.2.2 deployment.yaml

deployment文件包括以下四个部分:

  • apiVersion: 表示版本
  • kind: 表示资源
  • metadata: 表示元信息
  • spec: 资源规范字段

示例:

代码语言:javascript
复制
apiVersion: extensions/v1
kind: Deployment
metadata:
  name: {{ template "fullname" . }}
  labels:
    chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    metadata:
      labels:
        app: {{ template "fullname" . }}
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        imagePullPolicy: {{ .Values.image.pullPolicy }}
        ports:
        - containerPort: {{ .Values.service.internalPort }}
        livenessProbe:
          httpGet:
            path: /
            port: {{ .Values.service.internalPort }}
        readinessProbe:
          httpGet:
            path: /
            port: {{ .Values.service.internalPort }}
        resources:
{{ toyaml .Values.resources | indent 12 }}

需要注意的是,上面的yaml配置文件中有双大括号包扩起来的部分,这些是Go template,其中的Values是在values.yaml文件中定义的变量内容。

3.2.3 values.yaml

我们以nginx的某版本values.yaml为例:

代码语言:javascript
复制
# Default values for mychart.
# This is a yaml-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
  repository: nginx
  tag: stable
  pullPolicy: IfNotPresent
service:
  name: nginx
  type: ClusterIP
  externalPort: 80
  internalPort: 80
resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi

这样,通过values.yaml文件,以及变量映射规则,就可以把deployment.yaml中的变量替换成values.yaml中的值。另外考虑到不同环境的差异,我们也可以通过定义values-dev.yaml、values-qa.yaml、values-online.yaml来区分开发、测试、线上集中环境的变量值,结合流水线来实现不同环境的持续集成。

四 附录

4.1 关于apiVersion

apiVersion指的是kubernetes的api版本,相关资料可以查看 Which Kubernetes apiVersion Should I Use? 这篇文章。

关于Deployment apps/v1的吐槽很多,Kubernetes的官方文档中并没有对apiVersion的详细解释,而且由于K8S本身版本也在快速迭代,有些资源在低版本还在beta阶段,到了高版本就变成了stable。

代码语言:javascript
复制
1.6版本之前 apiVsersion:extensions/v1beta1
1.6版本到1.9版本之间:apps/v1beta1
1.9版本之后:apps/v1

4.2 apiVersion各版本介绍

早期的alpha、beta、stable:

alpha

  • 该软件可能包含错误。启用一个功能可能会导致bug
  • 随时可能会丢弃对该功能的支持,恕不另行通知

beta

  • 软件经过很好的测试。启用功能被认为是安全的。
  • 默认情况下功能是开启的
  • 细节可能会改变,但功能在后续版本不会被删除

stable

  • 该版本名称命名方式:vX这里X是一个整数
  • 稳定版本、放心使用
  • 将出现在后续发布的软件版本中

v1

Kubernetes API的稳定版本,包含很多核心对象:pod、service等

apps/v1beta2

在kubernetes1.8版本中,新增加了apps/v1beta2的概念,apps/v1beta1同理

DaemonSet,Deployment,ReplicaSet 和 StatefulSet的当时版本迁入apps/v1beta2,兼容原有的extensions/v1beta1

apps/v1

在kubernetes1.9版本中,引入apps/v1,deployment等资源从extensions/v1beta1, apps/v1beta1 和 apps/v1beta2迁入apps/v1,原来的v1beta1等被废弃。

apps/v1代表:包含一些通用的应用层的api组合,如:Deployments, RollingUpdates, and ReplicaSets

batch/v1

代表job相关的api组合

在kubernetes1.8版本中,新增了batch/v1beta1,后CronJob 已经迁移到了 batch/v1beta1,然后再迁入batch/v1

autoscaling/v1

代表自动扩缩容的api组合,kubernetes1.8版本中引入。

这个组合中后续的alpha 和 beta版本将支持基于memory使用量、其他监控指标进行扩缩容

extensions/v1beta1

deployment等资源在1.6版本时放在这个版本中,后迁入到apps/v1beta2,再到apps/v1中统一管理

certificates.k8s.io/v1beta1

安全认证相关的api组合

authentication.k8s.io/v1

资源鉴权相关的api组合

4.3 K8S版本及可用的apiVersion查看

4.3.1 k8s版本信息

代码语言:javascript
复制
kubectl version
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.3", GitCommit:"b3cbbae08ec52a7fc73d334838e18d17e8512749", GitTreeState:"clean", BuildDate:"2019-11-13T11:23:11Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.3", GitCommit:"b3cbbae08ec52a7fc73d334838e18d17e8512749", GitTreeState:"clean", BuildDate:"2019-11-13T11:13:49Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}

4.3.2 支持的apiVersion

代码语言:javascript
复制
[root@xxx ~]# kubectl api-versions
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
custom.metrics.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
metrics.k8s.io/v1beta1
monitoring.coreos.com/v1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
settings.k8s.io/v1alpha1
stable.example.com/v1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员架构进阶 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一 简介
  • 二 chart示例
  • 三 文件内容解析
    • 3.1 Chart.yaml
      • 3.2 templates
        • 3.2.1 deployment
        • 3.2.2 deployment.yaml
        • 3.2.3 values.yaml
    • 四 附录
    • 4.1 关于apiVersion
      • 4.3 K8S版本及可用的apiVersion查看
        • 4.3.1 k8s版本信息
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档