这一篇主要讲讲kustomize和helm这两部分,前者通过打补丁差异化配置基础的集群对象资源,后者则是打包集群资源实现一键部署以及共享和版本控制。如果是管理应用的在多种环境下运行,Kustomize 更简单直观;如果需要像安装软件一样部署复杂的第三方应用,Helm 是事实标准。
kustomize
一般来说包含kustomization.yaml文件,并且包括base和overlay目录,这两个目录都需要定义kustomization.yaml文件。前者的话定义基础的集群资源的yml文件路径(resources),后者则是定义补丁的文件路径(patches)。
以下给出典型的kustomize项目目录结构,每个 Kustomize 目录(无论是 base 还是 overlay)的核心都是一个 kustomization.yaml
文件,它定义了如何生成最终配置。
my-app/
├── base/ # 基础配置
│ ├── kustomization.yaml # 声明 base 包含哪些资源
│ ├── deployment.yaml
│ ├── service.yaml
│ └── configmap.yaml
└── overlays/ # 环境叠加配置
├── development/
│ ├── kustomization.yaml # 声明继承 base,并定义开发环境的修改
│ └── patch_cpu.yaml # (可选)额外的补丁文件
└── production/
├── kustomization.yaml # 声明继承 base,并定义生产环境的修改
└── ingress.yaml # (可选)为生产环境额外添加的资源
以下给出基础目录中的kustomization.yml文件的内容,resources字段定义包括的集群资源文件。
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources: # 声明本目录下需要包含哪些资源文件
- deployment.yaml
- service.yaml
- configmap.yaml
# 这里也可以定义一些所有环境通用的配置,如图片名称
images:
- name: my-app
newTag: latest
至于在overlay中的Kustomization.yml文件中,需要使用base字段指出需要继承的base目录,通过patchesStrategicMerge字段指出补丁文件,resources字段可以添加新的集群资源文件。
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
# 1. 继承基础配置
bases:
- ../../base
# 2. 覆盖镜像标签
images:
- name: my-app
newTag: v1.2.3 # 覆盖 base 中的 latest
# 3. 修改副本数 (使用补丁)
patchesStrategicMerge:
- deployment_patch.yaml # 指定一个描述差异的补丁文件
# 4. 为生产环境增加一个新资源(如 Ingress)
resources:
- ingress.yaml
# 5. 使用 ConfigMap Generator 生成 ConfigMap
configMapGenerator:
- name: app-config
files:
- config/production.properties
之后我们可以通过命令行展示最终生成的yml文件,也就是基于base目录和overlay目录添加resources和patches生成的yml文件。这会将合并后的完整 YAML 输出到屏幕上,不过可以用kubectl apply -k ./overlays/production来运行。
# 使用 kustomize 命令
kustomize build ./overlays/production
# 或者使用集成到 kubectl 的命令(1.14+)
kubectl kustomize ./overlays/production
helm
helm是一种另类的包管理工具,或者说是chart管理工具。helm能够将复杂的 Kubernetes 应用打包成一个单独的、易于管理的对象,实现一键部署、版本管理和共享。
一个标准的 Chart 就是一个被打包成的特定目录结构的文件集合。可以通过 helm create mychart
命令生成一个示例 chart 来查看其结构。Chart.yaml用来描述这个 Chart 本身的信息。
mychart/
├── charts/ # 【可选】依赖的其他 Charts(子 Charts)
├── Chart.yaml # 【必需】Chart 的元数据信息(名称、版本、依赖等)
├── templates/ # 【必需】模板文件目录
│ ├── deployment.yaml # Deployment 资源的模板
│ ├── service.yaml # Service 资源的模板
│ ├── ingress.yaml # Ingress 资源的模板
│ ├── _helpers.tpl # 可在模板中复用的辅助模板
│ └── tests/ # 测试文件目录
│ └── test-connection.yaml
└── values.yaml # 【必需】模板的默认配置值
templates是模板文件,它们不是纯粹的 YAML,而是包含了 Go 模板语法的 YAML 文件,可以与 values.yaml 结合,动态生成最终的 YAML。
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-webapp
spec:
template:
spec:
containers:
- name: main
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default "latest" }}"
values.yaml提供模板渲染时使用的默认值。
image:
repository: nginx
tag: stable
以下命令能够用于安装上面的chart,不过要注意,需要先通过curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3安装helm命令行工具。Helm 安装后已预置了公共仓库(https://charts.bitnami.com/bitnami)
# 使用默认值安装
helm install my-app .
# 安装时覆盖镜像标签
helm install my-app . --set image.tag=1.21
# 使用自定义的 values 文件安装(常用于不同环境)
helm install my-app . -f values-production.yaml
以下给出常用的命令,注意上面安装好helm之后默认就配置好了仓库,可以通过helm repo list查看,或者通过helm repo add来添加仓库,然后通过helm repo update更新索引库。
可以使用helm package myapp来打包,实际上是生成.tgz的文件,如果是标准的chart目录结构,可以通过helm create mychart生成,然后通过helm install myname mychart来安装release。后面可以通过helm upgrade myname mychart --ser-image=来升级。
或者通过helm uninstall myname来卸载,可以先通过helm list查看已经安装的release,release升级之后有历史版本,通过rollback可以回退到历史版本。