Kubernetes实战系列(5)

Kustomize与Helm实战解析

这一篇主要讲讲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可以回退到历史版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值