【云原生 Kubernetes 系列】K8s 实战 使用 Kustomize 对 Kubernetes 对象进行声明式管理_configmapgenerator

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

EOF


运行 `kubectl kustomize ./` 来查看所生成的 ConfigMap:



apiVersion: v1
data:
FOO: Bar
kind: ConfigMap
metadata:
annotations:
note: generated
labels:
type: generated
name: example-configmap-3


## 二、设置贯穿性字段


在项目中为所有 Kubernetes 对象设置贯穿性字段是一种常见操作。 贯穿性字段的一些使用场景如下:


* 为所有资源设置相同的名字空间
* 为所有对象添加相同的前缀或后缀
* 为对象添加相同的标签集合
* 为对象添加相同的注解集合


我们先来看一个例子:



创建一个 deployment.yaml

cat <./deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
EOF

cat <./kustomization.yaml
namespace: my-namespace
namePrefix: dev-
nameSuffix: “-001”
commonLabels:
app: bingo
commonAnnotations:
oncallPager: 800-555-1212
resources:

  • deployment.yaml
    EOF

执行 `kubectl kustomize ./` 查看这些字段都被设置到 Deployment 资源上:



apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
oncallPager: 800-555-1212
labels:
app: bingo
name: dev-nginx-deployment-001
namespace: my-namespace
spec:
selector:
matchLabels:
app: bingo
template:
metadata:
annotations:
oncallPager: 800-555-1212
labels:
app: bingo
spec:
containers:
- image: nginx
name: nginx


## 三、组织和定制资源


一种常见的做法是在项目中构造资源集合并将其放到同一个文件或目录中管理。 Kustomize 提供基于不同文件来组织资源并向其应用补丁或者其他定制的能力。


### 3.1、组织


Kustomize 支持组合不同的资源。kustomization.yaml 文件的 resources 字段定义配置中要包含的资源列表。 你可以将 resources 列表中的路径设置为资源配置文件的路径。 下面是由 Deployment 和 Service 构成的 NGINX 应用的示例:



创建 deployment.yaml 文件

cat < deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
EOF

创建 service.yaml 文件

cat < service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
ports:

  • port: 80
    protocol: TCP
    selector:
    run: my-nginx
    EOF

创建 kustomization.yaml 来组织以上两个资源

cat <./kustomization.yaml
resources:

  • deployment.yaml
  • service.yaml
    EOF

`kubectl kustomize ./` 所得到的资源中既包含 Deployment 也包含 Service 对象。


### 3.2、定制


补丁文件(Patches)可以用来对资源执行不同的定制。 Kustomize 通过 patchesStrategicMerge 和 patchesJson6902 支持不同的打补丁机制。 patchesStrategicMerge 的内容是一个文件路径的列表,其中每个文件都应可解析为 策略性合并补丁(Strategic Merge Patch)。 补丁文件中的名称必须与已经加载的资源的名称匹配。 建议构造规模较小的、仅做一件事情的补丁。 例如,构造一个补丁来增加 Deployment 的副本个数;构造另外一个补丁来设置内存限制。



创建 deployment.yaml 文件

cat < deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
EOF

生成一个补丁 increase_replicas.yaml

cat < increase_replicas.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 3
EOF

生成另一个补丁 set_memory.yaml

cat < set_memory.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
template:
spec:
containers:
- name: my-nginx
resources:
limits:
memory: 512Mi
EOF

cat <./kustomization.yaml
resources:

  • deployment.yaml
    patchesStrategicMerge:
  • increase_replicas.yaml
  • set_memory.yaml
    EOF

执行 `kubectl kustomize ./` 来查看 Deployment:



apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 3
selector:
matchLabels:
run: my-nginx
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- image: nginx
name: my-nginx
ports:
- containerPort: 80
resources:
limits:
memory: 512Mi


并非所有资源或者字段都支持策略性合并补丁。为了支持对任何资源的任何字段进行修改, Kustomize 提供通过 patchesJson6902 来应用 JSON 补丁的能力。 为了给 JSON 补丁找到正确的资源,需要在 kustomization.yaml 文件中指定资源的组(group)、 版本(version)、类别(kind)和名称(name)。 例如,为某 Deployment 对象增加副本个数的操作也可以通过 patchesJson6902 来完成:



创建一个 deployment.yaml 文件

cat < deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
EOF

创建一个 JSON 补丁文件

cat < patch.yaml

  • op: replace
    path: /spec/replicas
    value: 3
    EOF

创建一个 kustomization.yaml

cat <./kustomization.yaml
resources:

  • deployment.yaml

patchesJson6902:

  • target:
    group: apps
    version: v1
    kind: Deployment
    name: my-nginx
    path: patch.yaml
    EOF

执行 `kubectl kustomize ./` 以查看 replicas 字段被更新:



apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 3
selector:
matchLabels:
run: my-nginx
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- image: nginx
name: my-nginx
ports:
- containerPort: 80


除了补丁之外,Kustomize 还提供定制容器镜像或者将其他对象的字段值注入到容器中的能力,并且不需要创建补丁。 例如,你可以通过在 kustomization.yaml 文件的 images 字段设置新的镜像来更改容器中使用的镜像。



cat < deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
EOF

cat <./kustomization.yaml
resources:

  • deployment.yaml
    images:
  • name: nginx
    newName: my.image.registry/nginx
    newTag: 1.4.0
    EOF

执行 `kubectl kustomize ./` 以查看所使用的镜像已被更新:



apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 2
selector:
matchLabels:
run: my-nginx
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- image: my.image.registry/nginx:1.4.0
name: my-nginx
ports:
- containerPort: 80


有些时候,Pod 中运行的应用可能需要使用来自其他对象的配置值。 例如,某 Deployment 对象的 Pod 需要从环境变量或命令行参数中读取读取 Service 的名称。 由于在 kustomization.yaml 文件中添加 namePrefix 或 nameSuffix 时 Service 名称可能发生变化,建议不要在命令参数中硬编码 Service 名称。 对于这种使用场景,Kustomize 可以通过 vars 将 Service 名称注入到容器中。



创建一个 deployment.yaml 文件(引用此处的文档分隔符)

cat <<‘EOF’ > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
command: [“start”, “–host”, “$(MY_SERVICE_NAME)”]
EOF

创建一个 service.yaml 文件

cat < service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
ports:

  • port: 80
    protocol: TCP
    selector:
    run: my-nginx
    EOF

cat <./kustomization.yaml
namePrefix: dev-
nameSuffix: “-001”

resources:

  • deployment.yaml
  • service.yaml

vars:

  • name: MY_SERVICE_NAME
    objref:
    kind: Service
    name: my-nginx
    apiVersion: v1
    EOF

执行 `kubectl kustomize ./` 以查看注入到容器中的 Service 名称是 dev-my-nginx-001:



apiVersion: apps/v1
kind: Deployment
metadata:
name: dev-my-nginx-001
spec:
replicas: 2
selector:
matchLabels:
run: my-nginx
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- command:
- start
- --host
- dev-my-nginx-001
image: nginx
name: my-nginx


## 四、基准(Bases)与覆盖(Overlays)


Kustomize 中有 基准(bases) 和 覆盖(overlays) 的概念区分。 基准 是包含 kustomization.yaml 文件的一个目录,其中包含一组资源及其相关的定制。 基准可以是本地目录或者来自远程仓库的目录,只要其中存在 kustomization.yaml 文件即可。 覆盖 也是一个目录,其中包含将其他 kustomization 目录当做 bases 来引用的 kustomization.yaml 文件。 基准不了解覆盖的存在,且可被多个覆盖所使用。 覆盖则可以有多个基准,且可针对所有基准中的资源执行组织操作,还可以在其上执行定制。



创建一个包含基准的目录

mkdir base

创建 base/deployment.yaml

cat < base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
EOF

创建 base/service.yaml 文件

cat < base/service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
ports:

  • port: 80
    protocol: TCP
    selector:
    run: my-nginx
    EOF

创建 base/kustomization.yaml

cat < base/kustomization.yaml
resources:

  • deployment.yaml
  • service.yaml
    EOF

此基准可在多个覆盖中使用。你可以在不同的覆盖中添加不同的 namePrefix 或其他贯穿性字段。 下面是两个使用同一基准的覆盖:



mkdir dev
cat < dev/kustomization.yaml
bases:

  • …/base
    namePrefix: dev-
    EOF

mkdir prod
cat < prod/kustomization.yaml
bases:

  • …/base
    namePrefix: prod-
    EOF

## 五、如何使用 Kustomize 来应用、查看和删除对象


在 kubectl 命令中使用 **–kustomize 或 -k** 参数来识别被 `kustomization.yaml` 所管理的资源。 注意 -k 要指向一个 kustomization 目录。例如:



> 
> $ kubectl apply -k <kustomization 目录>/
> 
> 
> 


我们再来写一个 `kustomization.yaml` 文件:



创建 deployment.yaml 文件

cat < deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
EOF

创建 kustomization.yaml

cat <./kustomization.yaml
namePrefix: dev-
commonLabels:
app: my-nginx
resources:

  • deployment.yaml
    EOF

执行下面的命令来应用 Deployment 对象 dev-my-nginx:



> 
> $ kubectl apply -k ./
> 
> 
> 



> 
> $ deployment.apps/dev-my-nginx created
> 
> 
> 


运行下面的命令之一来查看 Deployment 对象 dev-my-nginx:



> 
> $ kubectl get -k ./
> 
> 
> 



> 
> $ kubectl describe -k ./
> 
> 
> 


执行下面的命令来比较 Deployment 对象 dev-my-nginx 与清单被应用之后集群将处于的状态:



> 
> $ kubectl diff -k ./  
>  执行下面的命令删除 Deployment 对象 dev-my-nginx:
> 
> 
> 



> 
> $ kubectl delete -k ./
> 
> 
> 



> 
> $ deployment.apps “dev-my-nginx” deleted
> 
> 
> 


## 六、Kustomize 功能特性列表




![img](https://img-blog.csdnimg.cn/img_convert/80815fb7f0039a91ccbba45196a5228f.png)
![img](https://img-blog.csdnimg.cn/img_convert/93ac4a998c55a7092e856d1319837f88.png)
![img](https://img-blog.csdnimg.cn/img_convert/4112b9e9d04d1c26e35b0af2ce07ffd8.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

> $ kubectl get -k ./
> 
> 
> 



> 
> $ kubectl describe -k ./
> 
> 
> 


执行下面的命令来比较 Deployment 对象 dev-my-nginx 与清单被应用之后集群将处于的状态:



> 
> $ kubectl diff -k ./  
>  执行下面的命令删除 Deployment 对象 dev-my-nginx:
> 
> 
> 



> 
> $ kubectl delete -k ./
> 
> 
> 



> 
> $ deployment.apps “dev-my-nginx” deleted
> 
> 
> 


## 六、Kustomize 功能特性列表




[外链图片转存中...(img-DOrioyvg-1715707021310)]
[外链图片转存中...(img-3wQujrUU-1715707021310)]
[外链图片转存中...(img-BjMIw0Ek-1715707021311)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值