Kustomize的基本使用 电脑版发表于:2022/7/11 23:10  >#Kustomize的基本使用 [TOC] 什么是 Kustomize? ------------ tn2>Kustomize允许您自定义原始的、无模板的 YAML 文件以用于多种用途,而原始 YAML 保持不变且可按原样使用。 kustomize 术语 ------------ tn2>在 kustomize 项目的文档中,经常会出现一些专业术语,这里总结一下常见的术语,方便后面讲解。 | 目录 | 描述 | | ------------ | ------------ | | `kustomization` | 术语 kustomization 指的是 kustomization.yaml 文件,或者指的是包含 kustomization.yaml 文件的目录以及它里面引用的所有相关文件路径 | | `base` | base 指的是一个 kustomization , 任何的 kustomization 包括 overlay (后面提到),都可以作为另一个 kustomization 的 base (简单理解为基础目录)。base 中描述了共享的内容,如资源和常见的资源配置。 | | `overlay` | overlay 是一个 kustomization, 它修改(并因此依赖于)另外一个 kustomization. overlay 中的 kustomization指的是一些其它的 kustomization, 称为其 base. 没有 base, overlay 无法使用,并且一个 overlay 可以用作 另一个 overlay 的 base(基础)。简而言之,overlay 声明了与 base 之间的差异。通过 overlay 来维护基于 base 的不同 variants(变体),例如开发、QA 和生产环境的不同 variants | | `variant` | variant 是在集群中将 overlay 应用于 base 的结果。例如开发和生产环境都修改了一些共同 base 以创建不同的 variant。这些 variant 使用相同的总体资源,并与简单的方式变化,例如 deployment 的副本数、ConfigMap使用的数据源等。简而言之,variant 是含有同一组 base 的不同 kustomization。 | | `resource` | 在 kustomize 的上下文中,resource 是描述 k8s API 对象的 YAML 或 JSON 文件的相对路径。即是指向一个声明了 kubernetes API 对象的 YAML 文件 | | `patch` | 修改文件的一般说明。文件路径,指向一个声明了 kubernetes API patch 的 YAML 文件 | 安装 Kustomize ------------ tn2>Windows安装可以使用巧克力。 ```bash choco install kustomize ``` tn2>使用脚本安装 ```bash curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash ``` 简单示例 ------------ tn2>比如我们定义一个`api.yaml`文件和一个`ocelot.yaml`文件。 ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: ocelotapi labels: name: ocelotapi spec: replicas: 2 selector: matchLabels: name: ocelotapi template: metadata: labels: name: ocelotapi spec: containers: - name: ocelotapi image: aidasi/ocelotapi:v1 ports: - containerPort: 80 imagePullPolicy: Always --- kind: Service apiVersion: v1 metadata: name: ocelotapi spec: ports: - port: 80 targetPort: 80 selector: name: ocelotapi ``` ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: ocelot labels: name: ocelot spec: replicas: 1 selector: matchLabels: name: ocelot template: metadata: labels: name: ocelot spec: containers: - name: ocelot image: aidasi/ocelot:v1 ports: - containerPort: 80 imagePullPolicy: Always --- kind: Service apiVersion: v1 metadata: name: ocelot spec: ports: - port: 80 targetPort: 80 selector: name: ocelot ``` tn2>但是我们并没有定义它们的命名空间,所以我们通过定义`kustomization.yaml`文件并通过`kustomize build`来生成不同命名空间的。 ```yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: my-namespace resources: - api.yaml - ocelot.yaml ```  tn2>我这里定义生成的是`my-namespace`的命名空间,以及所引用的资源是`api.yaml`和`ocelot.yaml`等文件。 如果我们要执行可以直接通过一下命令进行执行。 ```bash kustomize build | kubectl apply -f - ``` tn2>常用zd定义如下: | 字段 | 描述 | | ------------ | ------------ | | namePrefix | 命名 | | namespace | 名称空间 | | commonLabels | 添加标签 | | commonAnnotations | 添加Annotations | tn2>更多请参考:https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/replicas/ 多分支示例 ------------ tn2>如果我们有两个不同的环境,那么我们可以更加不同的环境进行创建不同的文件夹,目录结构如下:  tn2>`dev/kustomization.yaml`如下: ```yaml resources: - ./../../base namePrefix: dev- namespace: dev commonLabels: nowenv: dev commonAnnotations: note: Bob Ocelot Project! ``` tn2>`prod/kustomization.yaml`如下: ```yaml resources: - ./../../base namePrefix: prod- namespace: swp-prod commonLabels: nowenv: prod commonAnnotations: note: Bob Ocelot Project! replicas: - name: ocelotapi count: 4 ``` tn2>然后我们通过`kustomize build`显示不同Yaml资源的定义。 tn>关于项目地址如下:https://gitee.com/zuxiazijiahebo/k8s-ocelot/tree/master Argo CD部署 ------------ tn2>首先创建对应的命名空间。 ```bash kubectl create ns dev ``` tn2>将Argo暴露到本地 ```bash kubectl port-forward svc/argocd-server -n argocd 8080:443 --address=0.0.0.0 ``` tn2>创建应用。    tn2>然后点击Create按钮,就创建成功了。  