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

简介: chart 是 Helm 的应用打包格式。chart 由一系列文件组成,这些文件描述了 K8s 部署应用时所需要的资源,比如 Service、Deployment、PersistentVolumeClaim、Secret、ConfigMap 等。 chart可繁可简,即可以只用于部署一个单独的服务,例如mysql、nginx等等,也可以用于部署整个应用,例如由HTTP服务、数据库、缓存、中间件等共同构成的复杂应用。

系列文章:

容器 & 服务: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

内容与规则:

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”(可选)

示例:

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: 资源规范字段

示例:

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为例:

# 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来区分开发、测试、线上集中环境的变量值,结合流水线来实现不同环境的持续集成。

四 附录:关于apiVersion

关于apiVersion:

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

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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3天前
|
机器学习/深度学习 监控 Kubernetes
【Docker 专栏】Docker 容器内服务的自动扩展与缩容
【5月更文挑战第9天】本文探讨了Docker容器服务的自动扩展与缩容原理及实践,强调其在动态业务环境中的重要性。通过选择监控指标(如CPU使用率)、设定触发条件和制定扩展策略,实现资源的动态调整。方法包括云平台集成和使用Kubernetes等框架。实践中,电商平台和实时数据处理系统受益于此技术。注意点涉及监控数据准确性、扩展速度和资源分配。未来,智能算法将提升扩展缩容的效率和准确性,成为关键技术支持。
【Docker 专栏】Docker 容器内服务的自动扩展与缩容
|
16天前
|
关系型数据库 MySQL 开发工具
docker如何修改容器的配置文件
docker如何修改容器的配置文件
18 0
|
5月前
|
运维 监控 数据可视化
日志管理:收集和分析Docker容器日志
容器化技术的普及使得应用的部署和管理更加便捷,但随之而来的挑战之一是有效地管理和分析容器产生的大量日志。本文将深入探讨Docker容器日志管理的重要性,介绍常用的日志收集工具,以及如何分析和利用这些日志数据,提供更为丰富和实际的示例代码,帮助大家更好地理解和应用日志管理的关键技术。
|
22天前
|
存储 安全 网络安全
群晖部署容器魔方并结合内网穿透实现远程访问本地服务
群晖部署容器魔方并结合内网穿透实现远程访问本地服务
|
1月前
|
监控 安全 Java
有了容器化,还有必要制作 system service 来启动服务吗?
尽管有容器化技术,将服务作为 systemd 系统服务管理仍具有价值,因为它能实现系统整合、自动化管理、依赖处理、资源限制、安全增强及长期运行服务支持。systemd 允许设置服务间依赖、控制资源配额、日志监控和安全上下文。在 DevOps 环境中,通过 systemd 单元文件实现基础设施即代码,促进一致性与自动化部署。创建 systemd 服务涉及编写服务文件,定义描述、依赖、执行命令、重启策略等。
26 0
|
2月前
|
关系型数据库 MySQL Nacos
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
56 1
|
2月前
|
消息中间件 Linux 开发工具
rabbitmq使用docker容器挂载宿主机配置文件时无法访问控制台
rabbitmq使用docker容器挂载宿主机配置文件时无法访问控制台
|
2月前
|
Kubernetes Go 开发者
Go语言与Docker容器结合的实践应用与案例分析
【2月更文挑战第23天】本文通过分析实际案例,探讨了Go语言与Docker容器技术结合的实践应用。通过详细阐述Go语言在容器化环境中的开发优势,以及Docker容器技术在Go应用部署中的重要作用,本文旨在为读者提供Go语言与Docker容器结合的具体实现方法和实际应用场景。
|
2月前
|
运维 应用服务中间件 调度
|
3月前
|
监控 安全 Linux