侧边栏壁纸
博主头像
背锅小王子博主等级

我从事运维工作有十年之久,主要从事云原生相关的工作,对k8s、devops、servicemesh、可观察性等较为熟悉!

  • 累计撰写 59 篇文章
  • 累计创建 64 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Kustomize企业实战教程(二)

背锅小王子
2023-04-03 / 0 评论 / 0 点赞 / 304 阅读 / 1,108 字
温馨提示:
本文最后更新于 2023-04-03,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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)已经完成

0

评论区