kustomize 作为最贴近gitops的维护yaml的工具,整理以下具体的用法
准备工作
首先创建yehe/base/deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginxapp
spec:
replicas: 1
template:
metadata:
labels:
app: flaskapp
version: v1
spec:
containers:
- name: nginxapp
image: nginx
imagePullPolicy: IfNotPresent
ports:
- 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: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 80
新建一个kustomize.yaml
bases:
- ../../base
resources:
- service.yaml
执行命令kustomize build overlays/add,可以看到添加了一个service
添加新的字段
如果想添加一个字段,可以用补丁的方式添加 创建一个补丁文件overlays/add/resource-patch.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 1
template:
spec:
containers:
- name: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "64Mi"
cpu: "250m"
上面添加了resource字段 修改 overlays/add/kustomize.yaml,加入补丁:
bases:
- ../../base
resources:
- service.yaml
patchesStrategicMerge:
- resource-patch.yaml
执行命令kustomize build overlays/add,可以看到,补丁已经打上
新建configmap
在 overlays/add/config.ini
version=v1
新增的 configMapGenerator 要求使用 config.ini 生成一个 ConfigMap。然后再做一个补丁文件 env-patch.yaml,用来加载 Config
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 1
template:
spec:
containers:
- name: nginx
env:
- name: CONFIG
valueFrom:
configMapKeyRef:
name: config-ini
key: config.ini
修改kustomization.yaml,加入configmap与补丁
bases:
- ../../base
resources:
- service.yaml
configMapGenerator:
- name: config-ini
files:
- config.ini
patchesStrategicMerge:
- resource-patch.yaml
- env-patch.yaml
generatorOptions:
disableNameSuffixHash: true
执行命令kustomize build overlays/add,可以看到,congimap已经使用了,进入pod 也可以看到新的环境变量
kubectl exec -it nginx-xxxxxxxx-xxxxx env | grep CONFIG
CONFIG=version=v1
在argocd中添加label
如果现在argocd中添加label,需要一些额外的操作,因为如果直接添加,argocd会报错,我们添加一个文件
apiVersion: builtin
kind: LabelTransformer
metadata:
name: notImportantHere
labels:
eks_cluster_name: xxxx
app: nginx
version: v1
fieldSpecs:
- path: metadata/labels
create: true
- kind: Deployment
path: spec/template/metadata/labels
create: 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:
- ../add
patches:
- remove-svc.yaml
remoce-svc.yaml
kind: Service
apiVersion: v1
metadata:
name: nginx
$patch: delete
与模型 kustomize build overlays/delete,可以看到,Service已经被删除
删除一个字段
我们用类似的方法,删除之前的env 创建一个remove-filed.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: flaskapp
spec:
replicas: 1
template:
metadata:
labels:
app: flaskapp
version: v1
spec:
containers:
- name: flaskapp
image: dustise/flaskapp
env:
- name: CONFIG
$patch: delete
再把补丁加入kustomization.yaml
bases:
- ../add
patchesStrategicMerge:
- remove-svc.yaml
- remove-field.yaml
再次使用kustomize build overlays/delete,可以看到新的环境变量已经被删除