搭建你的 K3s 环境 -- 使用 Kustomize 简化部署
目录
在上一篇文章中,我们已经成功地在 K3s 上部署了 WordPress。通过一系列手动配置,我们设置了 MySQL 数据库、WordPress 前端、持久卷和负载均衡等,并验证了它们在 K3s 环境中的运行。
虽然上述步骤为我们提供了一种强大的部署方式,但随着配置的增加,部署和管理 Kubernetes 的应用可能会非常复杂,特别是当涉及到多环境配置和应用的扩展时。本文将带你进一步探索,学习如何使用 Kustomize 来自动化和简化在 K3s 上部署 WordPress 的过程。
Kustomize 是 Kubernetes的一种原生配置管理工具。通过 Kustomize,我们可以编写一组基础的 YAML 配置文件,并通过覆盖(overlays)
和补丁(patch)
来扩展或更改这些基础配置。
Kustomize 的使用可以使得配置文件的组织更加结构化,能够清晰地反映出不同环境或部署场景下的特定配置。与手动编辑 YAML 文件相比,使用 Kustomize 可以大大简化配置管理过程,并提高部署的灵活性和可维护性。
安装和配置 Kustomize #
根据你的操作系统,Kustomize的安装方法可能会有所不同。以下是一些通用的安装指导:
对于 Linux:
wget https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv5.1.0/kustomize_v5.1.0_linux_amd64.tar.gz
tar -xvzf kustomize_v5.1.0_linux_amd64.tar.gz
sudo mv kustomize /usr/local/bin/
对于 macOS:
brew install kustomize
对于 Windows: 可以从Github Releases页面下载适合 Windows 的版本,并将其添加到系统路径。
Kustomize 基本概念 #
Kustomize通过以下几个主要概念和组件来组织配置:
- 基础(Base): 包含资源的通用配置,例如 Pods、Services、Deployments 等。
- 覆盖(Overlays): 在基础配置之上,为特定环境或场景提供额外的配置和修改。
- 变量和替换(Variables and Replacements): 允许在配置中使用变量,并在不同的覆盖层中替换它们。
基础配置通常放置在一个名为base
的目录中,而覆盖配置则可以组织在名为overlays
的目录结构中,例如overlays/development
和overlays/production
等。
以下是一个典型的Kustomize目录结构示例:
my-app/
├── base/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── kustomization.yaml
└── overlays/
├── development/
│ ├── cpu_count.yaml
│ ├── replica_count.yaml
│ └── kustomization.yaml
└── production/
├── cpu_count.yaml
├── replica_count.yaml
└── kustomization.yaml
使用 Kustomize 部署 #
延续上一章节的内容,我们当前的目录结构应当为
k3s-wordpress/
├── mysql/
├── configmap.yaml
├── secret.yaml
├── statefulset.yaml
├── pv-claim.yaml
└── service.yaml
└── wordpress/
├── deployment.yaml
└── service.yaml
接下来我们需要将其改造成使用 Kustomize 的部署方式,需要进行下面两步操作
- 分别在
mysql
和wordpress
目录建立base
目录,并将目录下的所有 YAML 文件移入到子目录中 - 分别在每个 base 目录下建立名为
kustomization.yaml
的 YAML 文件,用户告知 Kustomize 哪些是我们需要其接管的 YAML 文件
完成后目录结构应当如下:
k3s-wordpress/
├── mysql/
└── base/
├── configmap.yaml
├── secret.yaml
├── statefulset.yaml
├── pv-claim.yaml
├── service.yaml
└── kustomization.yaml
└── wordpress/
└── base/
├── deployment.yaml
├── service.yaml
└── kustomization.yaml
其中,./mysql/base/kustomization.yaml
的内容如下
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- configmap.yaml
- secret.yaml
- pv-claim.yaml
- statefulset.yaml
- service.yaml
./wordpress/base/kustomization.yaml
的内容如下:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
接下来我们可以用下面的命令让 Kustomize 帮我们执行部署
kustomize build ./mysql/base | kubectl apply -f -
kustomize build ./wordpress/base | kubectl apply -f -
使用 Kustomize 构建多环境部署 #
前文提到,当涉及到多环境配置和应用的扩展时,Kustomize 能帮助我们简化部署流程,接下来我们假设有如下需求:
出于节省成本的考量,wordpress 在 `development` 环境只需要启动 1 个 pod,在生产环境需要启动 3 个 pod 来满足日常的用户访问需求。
那么我们可以使用 Kustomize 来满足这个需求。
使用 Overlay 进行环境定制 #
- 首先我们需要在
wordpress
目录下增加一个新目录overlays
,overlays
目录应当和base
目录平级 - 接着在
overlays
目录下分别增加两个子目录,名为development
和production
- 在
development
和production
目录分别增加两个 YAML 文件,kustomization.yaml
和replica_count.yaml
新增的目录结构应当如下:
k3s-wordpress/
├── mysql/
└── base/
├── ...
└── wordpress/
├── base/
├── ...
└── overlays/
├── development/
├── kustomization.yaml
└── replica_count.yaml
└── production/
├── kustomization.yaml
└── replica_count.yaml
开发环境配置 #
./wordpress/overlays/development/replica_count.yaml
内容为:
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 1
./wordpress/overlays/development/kustomization.yaml
内容为:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patchesStrategicMerge:
- replica_count.yaml
生产环境配置 #
./wordpress/overlays/production/replica_count.yaml
内容为:
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 3
./wordpress/overlays/production/kustomization.yaml
内容为:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patchesStrategicMerge:
- replica_count.yaml
部署开发环境或生产环境 #
这样,你可以根据需要部署开发或生产环境:
开发环境:kustomize build ./wordpress/overlays/development | kubectl apply -f -
生产环境:kustomize build ./wordpress/overlays/production | kubectl apply -f -
写在最后 #
Kustomize 提供了一种更高效、灵活的解决方案。通过实际的练习和深入理解,你将能更好地掌握 Kustomize 和 Kubernetes 的组合使用。虽然我们已经覆盖了许多方面,但 Kustomize 还有更多值得探索的功能,例如插件、变量替换等。各位可以继续深入学习和实践。