kustomize 作为最贴近gitops的维护yaml的工具,整理以下具体的用法

准备工作

首先创建yehe/base/deployment.yaml

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: nginxapp
  5. spec:
  6. replicas: 1
  7. template:
  8. metadata:
  9. labels:
  10. app: flaskapp
  11. version: v1
  12. spec:
  13. containers:
  14. - name: nginxapp
  15. image: nginx
  16. imagePullPolicy: IfNotPresent
  17. ports:
  18. - containerPort: 80

接下来创建kustomize.yaml

  1. resources:
  2. - deploy.yaml

执行kustomize build . 会看到渲染除了对应的deployment与pod的输出

添加

在kustomize中执行添加操作,创建目录yehe/overlays/add, overlays 可以继承base目录下所有kustomize中的yaml,如果要添加一些元素,例如添加新的ingress、service等就用下面的方法

添加新的资源

在add目录中添加一个service.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: nginx
  5. labels:
  6. app: nginx
  7. spec:
  8. selector:
  9. app: nginx
  10. ports:
  11. - name: http
  12. port: 80
  13. targetPort: 80

新建一个kustomize.yaml

  1. bases:
  2. - ../../base
  3. resources:
  4. - service.yaml

执行命令kustomize build overlays/add,可以看到添加了一个service

添加新的字段

如果想添加一个字段,可以用补丁的方式添加 创建一个补丁文件overlays/add/resource-patch.yaml

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: nginx
  5. spec:
  6. replicas: 1
  7. template:
  8. spec:
  9. containers:
  10. - name: nginx
  11. resources:
  12. requests:
  13. memory: "64Mi"
  14. cpu: "250m"
  15. limits:
  16. memory: "64Mi"
  17. cpu: "250m"

上面添加了resource字段 修改 overlays/add/kustomize.yaml,加入补丁:

  1. bases:
  2. - ../../base
  3. resources:
  4. - service.yaml
  5. patchesStrategicMerge:
  6. - resource-patch.yaml

执行命令kustomize build overlays/add,可以看到,补丁已经打上

新建configmap

在 overlays/add/config.ini

  1. version=v1

新增的 configMapGenerator 要求使用 config.ini 生成一个 ConfigMap。然后再做一个补丁文件 env-patch.yaml,用来加载 Config

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: nginx
  5. spec:
  6. replicas: 1
  7. template:
  8. spec:
  9. containers:
  10. - name: nginx
  11. env:
  12. - name: CONFIG
  13. valueFrom:
  14. configMapKeyRef:
  15. name: config-ini
  16. key: config.ini

修改kustomization.yaml,加入configmap与补丁

  1. bases:
  2. - ../../base
  3. resources:
  4. - service.yaml
  5. configMapGenerator:
  6. - name: config-ini
  7. files:
  8. - config.ini
  9. patchesStrategicMerge:
  10. - resource-patch.yaml
  11. - env-patch.yaml
  12. generatorOptions:
  13. disableNameSuffixHash: true

执行命令kustomize build overlays/add,可以看到,congimap已经使用了,进入pod 也可以看到新的环境变量

  1. kubectl exec -it nginx-xxxxxxxx-xxxxx env | grep CONFIG
  2. CONFIG=version=v1

在argocd中添加label

如果现在argocd中添加label,需要一些额外的操作,因为如果直接添加,argocd会报错,我们添加一个文件

  1. apiVersion: builtin
  2. kind: LabelTransformer
  3. metadata:
  4. name: notImportantHere
  5. labels:
  6. eks_cluster_name: xxxx
  7. app: nginx
  8. version: v1
  9. fieldSpecs:
  10. - path: metadata/labels
  11. create: true
  12. - kind: Deployment
  13. path: spec/template/metadata/labels
  14. create: true
  15. ~

修改kustomize.yaml 文件

  1. transformers:
  2. - metadataLabelTransformer.yaml

只有这样才能在argocd中修改label,具体原因地址找不到了

删除

先说几个一下patch的区别

  • patchesStrategicMerge:将所有的文件解析为Strategic Merge Patch
  • patchesJSON6902:将所有的文件解析为Json Path
  • patches:它会自动检测是patchesStrategicMerge还是patchesJSON6902 在使用这三个patch的时候,按道理来说是应该区别对待 ,但是第三个可以自动检测,我在生产环境中都是使用第三个patches,让它自动解析格式进行,不知道是否有坑,目前没有遇到过

创建一个新的目录,yehe/overlays/delete 使用patches语法,可以删除指定内容

删除一个对象

我们使用上一章创建的service对象,去测试删除语法, 首先集成overlays/add 的Kustomization,在overlays/delete 中创建kustomization.yaml

  1. bases:
  2. - ../add
  3. patches:
  4. - remove-svc.yaml

remoce-svc.yaml

  1. kind: Service
  2. apiVersion: v1
  3. metadata:
  4. name: nginx
  5. $patch: delete

与模型 kustomize build overlays/delete,可以看到,Service已经被删除

删除一个字段

我们用类似的方法,删除之前的env 创建一个remove-filed.yaml

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: flaskapp
  5. spec:
  6. replicas: 1
  7. template:
  8. metadata:
  9. labels:
  10. app: flaskapp
  11. version: v1
  12. spec:
  13. containers:
  14. - name: flaskapp
  15. image: dustise/flaskapp
  16. env:
  17. - name: CONFIG
  18. $patch: delete

再把补丁加入kustomization.yaml

  1. bases:
  2. - ../add
  3. patchesStrategicMerge:
  4. - remove-svc.yaml
  5. - remove-field.yaml

再次使用kustomize build overlays/delete,可以看到新的环境变量已经被删除