使用 kustomize 对 kubernetes 对象进行声明式管理

补丁实战

策略合并补丁

基准文件:/test/bases/deploy.yml

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: shark
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80

覆盖中的补丁文件:/test/dev/add_my-nginx2.yml

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: shark
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 3
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx2
        image: nginx
        ports:
        - containerPort: 80

覆盖中的 /test/dev/kustomization.yaml

yaml 复制代码
resources:
  - ../bases
patches:
  - path: add_my-nginx2.yml

执行构建

bash 复制代码
kubectl kustomize  /test/dev

得到如下 YAML

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
  namespace: shark
spec:
  replicas: 3
  selector:
    matchLabels:
      run: my-nginx
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - image: nginx    # 补丁新增
        name: my-nginx2
        ports:
        - containerPort: 80
      - image: nginx
        name: my-nginx
        ports:
        - containerPort: 80

JSON 补丁

非所有资源或者字段都支持策略性合并补丁。为了支持对任何资源的任何字段进行修改, Kustomize 提供通过 patchesJson6902 来应用 JSON 补丁的能力。 为了给 JSON 补丁找到正确的资源,需要在 kustomization.yaml 文件中指定资源的组(group)、 版本(version)、类别(kind)和名称(name)。

示例如下:

基准中的 Ingress 对象的文件: /test/bases/shark-ing.yml

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: shark
  name: shark-ingress-gateway
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: "/spms-standard"
        pathType: Prefix
        backend:
          service:
            name: shark-gateway
            port:
              number: 8080

覆盖中的 Ingress 对象的 JSON 补丁文件: /test/dev/shark-ing.yml

注意: 这里是增加了两个

yaml 复制代码
- op: add
  path: /spec/rules/0/http/paths/-
  value:
     path: "/spms-digital"
     pathType: Prefix
     backend:
       service:
         name: shark-gateway
         port:
           number: 8080
- op: add
  path: /spec/rules/0/http/paths/-
  value:
     path: "/spms-shark"
     pathType: Prefix
     backend:
       service:
         name: shark-gateway
         port:
           number: 8080
  • op 是预算符,值可以是: add remove replace
  • path 是被操作的对象的YAML文件的路径
    /spec/rules/0/http/paths/ 对象如下内容:
yaml 复制代码
spec:
 rules:
 - http:
     paths:

列表中的第一个元素的索引是 0, - 表示列表的最后位置

覆盖中的 /test/dev/kustomization.yaml

yaml 复制代码
resources:
  - ../bases
patches:
  - target:
      group: networking.k8s.io
      version: v1
      kind: Ingress
      namespace: shark
      name: shark-ingress-gateway
    path: shark-ing.yml

以上文件中的

  • group 对应基准中的 Ingress 对象文件: /test/bases/shark-ing.yml 中 apiVersion 的值中 networking.k8s.io 部分。
  • version 对应基准中的 Ingress 对象文件: /test/bases/shark-ing.yml 中 apiVersion 的值中 v1 部分。
  • kind 对应基准中的 Ingress 对象文件: /test/bases/shark-ing.yml 中 kind 的值。
  • namespace对应基准中的 Ingress 对象文件: /test/bases/shark-ing.yml 中 namespace 的值。
  • name对应基准中的 Ingress 对象文件: /test/bases/shark-ing.yml 中 name 的值。

执行构建

bash 复制代码
kubectl kustomize  /test/dev

将会得到如下完整的 YAML 文件

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: shark-ingress-gateway
  namespace: shark
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - backend:
          service:
            name: shark-gateway
            port:
              number: 8080
        path: /spms-standard
        pathType: Prefix
      - backend:
          service:
            name: shark-gateway
            port:
              number: 8080
        path: /spms-digital
        pathType: Prefix
      - backend:
          service:
            name: shark-gateway
            port:
              number: 8080
        path: /spms-shark
        pathType: Prefix
相关推荐
fruge1 小时前
飞牛OS部署Flare导航页:Docker Compose、YAML书签配置与cpolar公网访问
运维·docker·容器
xiaoligangting1 小时前
太原防火岗亭
云原生
Zhou1411361 小时前
Docker_02_Dockerfile与存储网络
网络·docker·容器
bllovepigpig2 小时前
操作系统个人学习笔记(四):K8s基础
笔记·学习·kubernetes
键盘鼓手苏苏4 小时前
ESLint 规则渐进式升级:从 0 警告到全面开启的迁移策略(续篇)
云原生·kubernetes·k8
guo_wen_qiang4 小时前
云服务器elasticsearch环境搭建-单台
运维·elasticsearch·容器
逐流人6 小时前
Ceph对象存储与文件系统存储管理:从RADOS网关、S3与Swift到CephFS快照同步
linux·运维·ceph·云原生·云计算·swift·rados
分布式存储与RustFS6 小时前
日志目录的预算是 2 GiB:轮转、保留和压缩这三件事
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
江湖有缘7 小时前
Docker实战 | 使用Docker部署Bibliotheca阅读习惯管理工具
java·docker·容器
万联WANFLOW7 小时前
Docker Hub 镜像拉取慢、timeout 的排查方法
运维·docker·云原生·容器·eureka