基本认识

使用K8S集群架构的项目,利用流水线部署应用到集群上,一般是这样:

  • 准备应用的镜像(对应持续集成阶段【CI】):使用dockerfile构建容器镜像,此时与K8S集群还无关
    • 构建镜像
    • 推送镜像到指定仓库Registry
    • 打标签
  • 准备K8S集群使用到的yaml文件(对应持续部署【CD】准备阶段):将多个资源的yaml定义文件准备好,这是关于将容器镜像部署调度到Pod以及各种环境和资源配置
    • 使用诸如sed,Kustomize工具将镜像名称和标签动态化(参数化)填充或替换到YAML模版中
  • 执行部署(对应持续部署【CD】执行阶段):应用资源的yaml文件,将应用的容器镜像调度到合适的节点上
    • 常用kubectl apply -f ...yaml执行
    • Deployment策略通常有滚动更新、金丝雀发布等

kustomize

参考链接:

kustomize 是一个通过kustomization文件(kustomization.yml)来定制生成k8s的yaml文件的工具,一个典型的场景是针对同一个应用多个环境生成定制化的各环境的yaml(大部分配置相同)

基本概念

  • 基准 bases : 可以被多个overlays引用
  • 覆盖 overlays :会指定某kustomization目录作为bases来引用,可以引用多个bases

覆盖策略

Strategic Merge Patch (战略合并补丁)算法:它根据字段类型和标识键来决定是替换、追加还是其他操作。这是主要以及默认使用的策略。

情况 使用的策略 是否需要显式指定或配置?
在 kustomization.yaml 中使用 patchesStrategicMerge 字段 Strategic Merge Patch (SMP) 。这是默认行为,只需按格式提供补丁文件即可。
在 Overlay 目录中放置补丁文件并依赖默认行为 Strategic Merge Patch (SMP) 。Kustomize 会自动尝试用 SMP 合并同名文件。
使用 patchesJson6902 字段 JSON Patch 。必须显式声明该字段和目标资源。
使用 imagesreplicas 等转换器 内部等效于 SMP 。必须在 kustomization.yaml 中显式配置这些字段。
在补丁文件中使用 $patch: delete/replace Strategic Merge Patch (带指令) 。必须在补丁文件内部显式写入这些指令。

典型目录结构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
my-app/
├── base/                   # 基础定义
│   ├── kustomization.yaml  # 声明 base 的资源
│   ├── deployment.yaml
│   └── service.yaml
└── overlays/
    ├── development/        # 开发环境 overlay
    │   ├── kustomization.yaml # 指向 base,并定义开发环境的修改
    │   └── patch.yaml      # (可选)一个补丁文件
    └── production/         # 生产环境 overlay
        ├── kustomization.yaml # 指向 base,并定义生产环境的修改
        └── configmap.yaml  # (可选)增加新的资源

构建

  1. 构建+应用 kubectl apply -k <kustomization-directory>/ 这个命令是包含用kustomize构建(build)成目标yaml文件,然后应用(apply)目标yaml文件创建目标资源。

  2. 先构建,再应用

  • kustomize build <kustomization-directory>/ > generated-manifest.yaml
  • kubectl apply -f generated-manifest.yaml