介绍
一般应用都会在多套环境中部署,比如生产环境,预发环境,测试环境等。不同环境间的差异可能只是镜像的tag,应用的labels等,而这些不同环境下的yaml文件可能经常会因为人为疏忽导致配置错误。这时就可以使用kustomize来管理这些yaml文件。
Base
是包含kustomization.yaml文件的一个目录,其中包含一组资源及其相关的定制。可以是本地目录或者来自远程仓库的目录,只要其中存在 kustomization.yaml 文件即可。
Overlays
也是一个目录,包含指定了Base目录的kustomization.yaml文件和定制资源文件。Base不了解Overlays的存在,且可被多个Overlays所使用。
特点
- 有一个统一的Base模板可以管理项目的Kubernetes部署结构。
- 通过Overlays方式管理不同环境之间的差异。
- 管理的都是Kubernetes原生yaml文件,没有额外的学习成本。
使用
GitHub地址:https://github.com/kubernetes-sigs/kustomize
官方文档:https://kubernetes.io/zh-cn/docs/tasks/manage-kubernetes-objects/kustomization/
在kubernetes 1.14版本以上,已经集成到kubectl中了,我的环境是1.22,使用的版本是v4.5.5。
安装
可以直接采用shell安装:
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
也可以下载安装包:
wget https://github.91chi.fun//https://github.com//kubernetes-sigs/kustomize/releases/download/kustomize%2Fv4.5.5/kustomize_v4.5.5_linux_amd64.tar.gz
tar xvf kustomize_v4.5.5_linux_amd64.tar.gz
cp kustomize /usr/local/bin/
实例
创建Base基础模版
- 创建base目录
mkdir base
- 创建/base/deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx:latest imagePullPolicy: Never name: nginx ports: - containerPort: 80 protocol: TCP
- 创建 base/service.yaml
apiVersion: v1 kind: Service metadata: name: nginx spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: ClusterIP
- 创建 base/kustomization.yaml
resources: - deployment.yaml - service.yaml
这样基础模板就创建好了,我们可以使用如下命令将所有文件连在一起。
kustomize build ../base
创建应用可以使用以下方式:# 直接使用kubectl apply -k (集群版本要高于1.14) kubectl apply -k ../base/ # 还可以通过kustomize命令 kustomize build ../base | kubectl apply -f -
删除应用的话:kubectl delete -k ../base/ kustomize build ../base | kubectl delete -f -
创建不同环境的Overlays
- 创建overlays目录
mkdir -p overlays/{dev,prod,stag}
- 在dev目录下配置自定义需求
cat replica_count.yaml apiVersion: v1 kind: Deployment metadata: name: nginx spec: replicas: 3 cat svc.yaml apiVersion: v1 kind: Service metadata: name: nginx spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: NodePort
- 创建kustomization.yaml
namePrefix: dev- commonLabels: variant: dev commonAnnotations: note: Hello, This is dev! patches: - replica_count.yaml - svc.yaml resources: - ../../base namespace: dev
stag预发环境和prod生产环境大同小异。
- 发布应用
kustomize build overlays/dev/ | kubectl apply -f -
- 查看应用
修改镜像/namespace
使用下面的命令实现:
kustomize edit set
比如修改dev环境下的镜像地址为nginx:v2
cd overlays/dev
kustomize edit set image new-nginx:latest=nginx:v2
cat kustomization.yaml
查看区别
kubectl diff -k ./
修改namespace为prod
kustomize edit set namespace prod