1、介绍
基准(Bases)与覆盖(Overlays)
Kustomize 中有 基准(bases) 和 覆盖(overlays) 的概念区分。 这里可以理解为目录级别 yaml 资源文件的继承。基准 为父类目录,覆盖 为子类重写目录。
基准 是包含 kustomization.yaml 文件的一个目录,其中包含一组资源及其相关的定制。 基准可以是本地目录或者来自远程仓库的目录,只要其中存在 kustomization.yaml 文件即可。
覆盖 也是一个目录,其中包含将其他 kustomization 目录当做 bases 来引用的 kustomization.yaml 文件。 基准不了解覆盖的存在,且可被多个覆盖所使用。 覆盖则可以有多个基准,且可针对所有基准中的资源执行组织操作,还可以在其上执行定制。
2、基准使用
创建一个基准目录
mkdir base
在base中分别创建 nginx.yaml 和 svc.yaml
# nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
# svc.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
selector:
app: nginx
创建 kustomization.yaml 文件
resources:
- nginx.yaml
- svc.yaml
执行命令 kustomize build base 输出结果为如下,说明已创建成功
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
image: nginx:alpine
name: nginx
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
3、覆盖使用
kustomize鼓励定义多个变体——例如 dev、staging 和 prod,作为公共基础上的覆盖。
可以创建一个额外的覆盖层来将这些变体组合在一起——只需将覆盖层声明为新的自定义化的基础。
一个常见的布局如下:
├── base
│ ├── nginx.yaml
│ ├── kustomization.yaml
│ └── svc.yaml
└── overlays
├── dev
│ ├── kustomization.yaml
│ └── resource-patch.yaml
├── staging
│ ├── kustomization.yaml
│ └── resource-patch.yaml
└── prod
├── kustomization.yaml
└── env-patch.yaml
接下来我们来测试 bases + overlays 模式
首先创建目录结构如上图:
mkdir -p base overlays/{dev, staging, prod}
base目录中的资源,直接使用上面基准使用的配置信息
然后分别在 dev、staging、prod、目录创建 kustomization.yaml 和 patch.yaml 文件
# dev/resource-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
template:
spec:
containers:
- name: nginx
resources:
limits:
cpu: 1
memory: 1Gi
requests:
cpu: 1
memory: 1Gi
# staging/resource-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
template:
spec:
containers:
- name: nginx
resources:
limits:
cpu: 2
memory: 2Gi
requests:
cpu: 2
memory: 2Gi
# prod/env-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
template:
spec:
containers:
- name: nginx
env:
- name: env
valule: prod
# dev/kustomization.yaml
namePrefix: dev-
resources:
- ../../base
patches:
- path: resource-patch.yaml
target:
labelSelector: "app=nginx"
# staging/kustomization.yaml
namePrefix: stag-
resources:
- ../../base
patches:
- path: resource-patch.yaml
target:
labelSelector: "app=nginx"
# prod/kustomization.yaml
namePrefix: prod-
resources:
- ../../base
patches:
- path: env-patch.yaml
target:
labelSelector: "app=nginx"
执行命令 kustomize build base,查看输出结果,如下:
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:alpine
name: nginx
执行命令 kustomize build overlay/dev 查看输出结果,如下:
apiVersion: v1
kind: Service
metadata:
name: dev-nginx-svc
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: dev-nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:alpine
name: nginx
resources:
limits:
cpu: 1
memory: 1Gi
requests:
cpu: 1
memory: 1Gi
执行命令 kustomize build overlay/staging 查看输出结果,如下:
apiVersion: v1
kind: Service
metadata:
name: stag-nginx-svc
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: stag-nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:alpine
name: nginx
resources:
limits:
cpu: 2
memory: 2Gi
requests:
cpu: 2
memory: 2Gi
执行命令 kustomize build overlay/prod 查看输出结果,如下:
apiVersion: v1
kind: Service
metadata:
name: prod-nginx-svc
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: prod-nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- env:
- name: env
valule: prod
image: nginx:alpine
name: nginx
至此测试 基准(Bases)与 覆盖(Overlays)已经完成
评论区