kustomize 作为最贴近gitops的维护yaml的工具,整理以下具体的用法
准备工作
首先创建yehe/base/deployment.yaml
apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: nginxappspec:replicas: 1template:metadata:labels:app: flaskappversion: v1spec:containers:- name: nginxappimage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80
接下来创建kustomize.yaml
resources:- deploy.yaml
执行kustomize build . 会看到渲染除了对应的deployment与pod的输出
添加
在kustomize中执行添加操作,创建目录yehe/overlays/add, overlays 可以继承base目录下所有kustomize中的yaml,如果要添加一些元素,例如添加新的ingress、service等就用下面的方法
添加新的资源
在add目录中添加一个service.yaml
apiVersion: v1kind: Servicemetadata:name: nginxlabels:app: nginxspec:selector:app: nginxports:- name: httpport: 80targetPort: 80
新建一个kustomize.yaml
bases:- ../../baseresources:- service.yaml
执行命令kustomize build overlays/add,可以看到添加了一个service
添加新的字段
如果想添加一个字段,可以用补丁的方式添加 创建一个补丁文件overlays/add/resource-patch.yaml
apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: nginxspec:replicas: 1template:spec:containers:- name: nginxresources:requests:memory: "64Mi"cpu: "250m"limits:memory: "64Mi"cpu: "250m"
上面添加了resource字段 修改 overlays/add/kustomize.yaml,加入补丁:
bases:- ../../baseresources:- service.yamlpatchesStrategicMerge:- resource-patch.yaml
执行命令kustomize build overlays/add,可以看到,补丁已经打上
新建configmap
在 overlays/add/config.ini
version=v1
新增的 configMapGenerator 要求使用 config.ini 生成一个 ConfigMap。然后再做一个补丁文件 env-patch.yaml,用来加载 Config
apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: nginxspec:replicas: 1template:spec:containers:- name: nginxenv:- name: CONFIGvalueFrom:configMapKeyRef:name: config-inikey: config.ini
修改kustomization.yaml,加入configmap与补丁
bases:- ../../baseresources:- service.yamlconfigMapGenerator:- name: config-inifiles:- config.inipatchesStrategicMerge:- resource-patch.yaml- env-patch.yamlgeneratorOptions:disableNameSuffixHash: true
执行命令kustomize build overlays/add,可以看到,congimap已经使用了,进入pod 也可以看到新的环境变量
kubectl exec -it nginx-xxxxxxxx-xxxxx env | grep CONFIGCONFIG=version=v1
在argocd中添加label
如果现在argocd中添加label,需要一些额外的操作,因为如果直接添加,argocd会报错,我们添加一个文件
apiVersion: builtinkind: LabelTransformermetadata:name: notImportantHerelabels:eks_cluster_name: xxxxapp: nginxversion: v1fieldSpecs:- path: metadata/labelscreate: true- kind: Deploymentpath: spec/template/metadata/labelscreate: true~
修改kustomize.yaml 文件
transformers:- 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
bases:- ../addpatches:- remove-svc.yaml
remoce-svc.yaml
kind: ServiceapiVersion: v1metadata:name: nginx$patch: delete
与模型 kustomize build overlays/delete,可以看到,Service已经被删除
删除一个字段
我们用类似的方法,删除之前的env 创建一个remove-filed.yaml
apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: flaskappspec:replicas: 1template:metadata:labels:app: flaskappversion: v1spec:containers:- name: flaskappimage: dustise/flaskappenv:- name: CONFIG$patch: delete
再把补丁加入kustomization.yaml
bases:- ../addpatchesStrategicMerge:- remove-svc.yaml- remove-field.yaml
再次使用kustomize build overlays/delete,可以看到新的环境变量已经被删除
