系列文章:
容器 & 服务: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