前言
Kustomize 是一個(gè)用來(lái)定制 Kubernetes 配置的工具。它提供以下功能特性來(lái)管理應(yīng)用配置文件:
- 從其他來(lái)源生成資源
- 為資源設(shè)置貫穿性(Cross-Cutting)字段
- 組織和定制資源集合
一、生成資源
ConfigMap 和 Secret 包含其他 Kubernetes 對(duì)象(如 Pod)所需要的配置或敏感數(shù)據(jù)。 ConfigMap 或 Secret 中數(shù)據(jù)的來(lái)源往往是集群外部,例如某個(gè) .properties 文件或者 SSH 密鑰文件。 Kustomize 提供 secretGenerator 和 configMapGenerator,可以基于文件或字面值來(lái)生成 Secret 和 ConfigMap。
1.1、configMapGenerator
configMapGenerator 要基于文件來(lái)生成 ConfigMap,可以在 configMapGenerator 的 files 列表中添加表項(xiàng)。 下面是一個(gè)根據(jù) .properties
文件中的數(shù)據(jù)條目來(lái)生成 ConfigMap 的示例:
# 生成一個(gè) application.properties 文件
cat <<EOF >application.properties
FOO=Bar
EOF
cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: example-configmap-1
files:
- application.properties
EOF
所生成的 ConfigMap 可以使用下面的命令來(lái)檢查:
$ kubectl kustomize ./
所生成的 ConfigMap 為:
apiVersion: v1
data:
application.properties: |
FOO=Bar
kind: ConfigMap
metadata:
name: example-configmap-1-8mbdf7882g
要從 env 文件生成 ConfigMap,請(qǐng)?jiān)?configMapGenerator 中的 envs 列表中添加一個(gè)條目。 下面是一個(gè)用來(lái)自 .env
文件的數(shù)據(jù)生成 ConfigMap 的例子:
# 創(chuàng)建一個(gè) .env 文件
cat <<EOF >.env
FOO=Bar
EOF
cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: example-configmap-1
envs:
- .env
EOF
可以使用以下命令檢查生成的 ConfigMap:
$ kubectl kustomize ./
生成的 ConfigMap 為:
apiVersion: v1
data:
FOO: Bar
kind: ConfigMap
metadata:
name: example-configmap-1-42cfbf598f
ConfigMap 也可基于字面的鍵值偶對(duì)來(lái)生成。要基于鍵值偶對(duì)來(lái)生成 ConfigMap, 在 configMapGenerator 的 literals 列表中添加表項(xiàng)。下面是一個(gè)例子, 展示如何使用鍵值偶對(duì)中的數(shù)據(jù)條目來(lái)生成 ConfigMap 對(duì)象:
cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: example-configmap-2
literals:
- FOO=Bar
EOF
可以用下面的命令檢查所生成的 ConfigMap:
$ kubectl kustomize ./
所生成的 ConfigMap 為:
apiVersion: v1
data:
FOO: Bar
kind: ConfigMap
metadata:
name: example-configmap-2-g2hdhfc6tk
要在 Deployment 中使用生成的 ConfigMap,使用 configMapGenerator 的名稱對(duì)其進(jìn)行引用。 Kustomize 將自動(dòng)使用生成的名稱替換該名稱。
這是使用生成的 ConfigMap 的 deployment 示例:
# 創(chuàng)建一個(gè) application.properties 文件
cat <<EOF >application.properties
FOO=Bar
EOF
cat <<EOF >deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: my-app
volumeMounts:
- name: config
mountPath: /config
volumes:
- name: config
configMap:
name: example-configmap-1
EOF
cat <<EOF >./kustomization.yaml
resources:
- deployment.yaml
configMapGenerator:
- name: example-configmap-1
files:
- application.properties
EOF
生成 ConfigMap 和 Deployment:
$ kubectl kustomize ./
生成的 Deployment 將通過(guò)名稱引用生成的 ConfigMap:
apiVersion: v1
data:
application.properties: |
FOO=Bar
kind: ConfigMap
metadata:
name: example-configmap-1-g4hk9g2ff8
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: my-app
name: my-app
spec:
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- image: my-app
name: app
volumeMounts:
- mountPath: /config
name: config
volumes:
- configMap:
name: example-configmap-1-g4hk9g2ff8
name: config
1.2、secretGenerator
secretGenerator 可以基于文件或者鍵值偶對(duì)來(lái)生成 Secret。要使用文件內(nèi)容來(lái)生成 Secret, 在 secretGenerator 下面的 files 列表中添加表項(xiàng)。 下面是一個(gè)根據(jù)文件中數(shù)據(jù)來(lái)生成 Secret 對(duì)象的示例:
# 創(chuàng)建一個(gè) password.txt 文件
cat <<EOF >./password.txt
username=admin
password=secret
EOF
cat <<EOF >./kustomization.yaml
secretGenerator:
- name: example-secret-1
files:
- password.txt
EOF
所生成的 Secret 如下:
apiVersion: v1
data:
password.txt: dXNlcm5hbWU9YWRtaW4KcGFzc3dvcmQ9c2VjcmV0Cg==
kind: Secret
metadata:
name: example-secret-1-t2kt65hgtb
type: Opaque
要基于鍵值偶對(duì)字面值生成 Secret,先要在 secretGenerator 的 literals 列表中添加表項(xiàng)。下面是基于鍵值偶對(duì)中數(shù)據(jù)條目來(lái)生成 Secret 的示例:
cat <<EOF >./kustomization.yaml
secretGenerator:
- name: example-secret-2
literals:
- username=admin
- password=secret
EOF
所生成的 Secret 如下:
apiVersion: v1
data:
password: c2VjcmV0
username: YWRtaW4=
kind: Secret
metadata:
name: example-secret-2-t52t6g96d8
type: Opaque
與 ConfigMap 一樣,生成的 Secret 可以通過(guò)引用 secretGenerator 的名稱在 Deployment 中使用:
# 創(chuàng)建一個(gè) password.txt 文件
cat <<EOF >./password.txt
username=admin
password=secret
EOF
cat <<EOF >deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: my-app
volumeMounts:
- name: password
mountPath: /secrets
volumes:
- name: password
secret:
secretName: example-secret-1
EOF
cat <<EOF >./kustomization.yaml
resources:
- deployment.yaml
secretGenerator:
- name: example-secret-1
files:
- password.txt
EOF
1.3、generatorOptions
generatorOptions 所生成的 ConfigMap 和 Secret 都會(huì)包含內(nèi)容哈希值后綴。 這是為了確保內(nèi)容發(fā)生變化時(shí),所生成的是新的 ConfigMap 或 Secret。 要禁止自動(dòng)添加后綴的行為,用戶可以使用 generatorOptions。 除此以外,為生成的 ConfigMap 和 Secret 指定貫穿性選項(xiàng)也是可以的。
cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: example-configmap-3
literals:
- FOO=Bar
generatorOptions:
disableNameSuffixHash: true
labels:
type: generated
annotations:
note: generated
EOF
運(yùn)行 kubectl kustomize ./
來(lái)查看所生成的 ConfigMap:
apiVersion: v1
data:
FOO: Bar
kind: ConfigMap
metadata:
annotations:
note: generated
labels:
type: generated
name: example-configmap-3
二、設(shè)置貫穿性字段
在項(xiàng)目中為所有 Kubernetes 對(duì)象設(shè)置貫穿性字段是一種常見(jiàn)操作。 貫穿性字段的一些使用場(chǎng)景如下:
- 為所有資源設(shè)置相同的名字空間
- 為所有對(duì)象添加相同的前綴或后綴
- 為對(duì)象添加相同的標(biāo)簽集合
- 為對(duì)象添加相同的注解集合
我們先來(lái)看一個(gè)例子:
# 創(chuàng)建一個(gè) deployment.yaml
cat <<EOF >./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 <<EOF >./kustomization.yaml
namespace: my-namespace
namePrefix: dev-
nameSuffix: "-001"
commonLabels:
app: bingo
commonAnnotations:
oncallPager: 800-555-1212
resources:
- deployment.yaml
EOF
執(zhí)行 kubectl kustomize ./
查看這些字段都被設(shè)置到 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
三、組織和定制資源
一種常見(jiàn)的做法是在項(xiàng)目中構(gòu)造資源集合并將其放到同一個(gè)文件或目錄中管理。 Kustomize 提供基于不同文件來(lái)組織資源并向其應(yīng)用補(bǔ)丁或者其他定制的能力。
3.1、組織
Kustomize 支持組合不同的資源。kustomization.yaml 文件的 resources 字段定義配置中要包含的資源列表。 你可以將 resources 列表中的路徑設(shè)置為資源配置文件的路徑。 下面是由 Deployment 和 Service 構(gòu)成的 NGINX 應(yīng)用的示例:
# 創(chuàng)建 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
ports:
- containerPort: 80
EOF
# 創(chuàng)建 service.yaml 文件
cat <<EOF > 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
# 創(chuàng)建 kustomization.yaml 來(lái)組織以上兩個(gè)資源
cat <<EOF >./kustomization.yaml
resources:
- deployment.yaml
- service.yaml
EOF
kubectl kustomize ./
所得到的資源中既包含 Deployment 也包含 Service 對(duì)象。
3.2、定制
補(bǔ)丁文件(Patches)可以用來(lái)對(duì)資源執(zhí)行不同的定制。 Kustomize 通過(guò) patchesStrategicMerge 和 patchesJson6902 支持不同的打補(bǔ)丁機(jī)制。 patchesStrategicMerge 的內(nèi)容是一個(gè)文件路徑的列表,其中每個(gè)文件都應(yīng)可解析為 策略性合并補(bǔ)?。⊿trategic Merge Patch)。 補(bǔ)丁文件中的名稱必須與已經(jīng)加載的資源的名稱匹配。 建議構(gòu)造規(guī)模較小的、僅做一件事情的補(bǔ)丁。 例如,構(gòu)造一個(gè)補(bǔ)丁來(lái)增加 Deployment 的副本個(gè)數(shù);構(gòu)造另外一個(gè)補(bǔ)丁來(lái)設(shè)置內(nèi)存限制。
# 創(chuàng)建 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
ports:
- containerPort: 80
EOF
# 生成一個(gè)補(bǔ)丁 increase_replicas.yaml
cat <<EOF > increase_replicas.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 3
EOF
# 生成另一個(gè)補(bǔ)丁 set_memory.yaml
cat <<EOF > 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 <<EOF >./kustomization.yaml
resources:
- deployment.yaml
patchesStrategicMerge:
- increase_replicas.yaml
- set_memory.yaml
EOF
執(zhí)行 kubectl kustomize ./
來(lái)查看 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
并非所有資源或者字段都支持策略性合并補(bǔ)丁。為了支持對(duì)任何資源的任何字段進(jìn)行修改, Kustomize 提供通過(guò) patchesJson6902 來(lái)應(yīng)用 JSON 補(bǔ)丁的能力。 為了給 JSON 補(bǔ)丁找到正確的資源,需要在 kustomization.yaml 文件中指定資源的組(group)、 版本(version)、類別(kind)和名稱(name)。 例如,為某 Deployment 對(duì)象增加副本個(gè)數(shù)的操作也可以通過(guò) patchesJson6902 來(lái)完成:
# 創(chuàng)建一個(gè) 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
ports:
- containerPort: 80
EOF
# 創(chuàng)建一個(gè) JSON 補(bǔ)丁文件
cat <<EOF > patch.yaml
- op: replace
path: /spec/replicas
value: 3
EOF
# 創(chuàng)建一個(gè) kustomization.yaml
cat <<EOF >./kustomization.yaml
resources:
- deployment.yaml
patchesJson6902:
- target:
group: apps
version: v1
kind: Deployment
name: my-nginx
path: patch.yaml
EOF
執(zhí)行 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
除了補(bǔ)丁之外,Kustomize 還提供定制容器鏡像或者將其他對(duì)象的字段值注入到容器中的能力,并且不需要?jiǎng)?chuàng)建補(bǔ)丁。 例如,你可以通過(guò)在 kustomization.yaml 文件的 images 字段設(shè)置新的鏡像來(lái)更改容器中使用的鏡像。
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
ports:
- containerPort: 80
EOF
cat <<EOF >./kustomization.yaml
resources:
- deployment.yaml
images:
- name: nginx
newName: my.image.registry/nginx
newTag: 1.4.0
EOF
執(zhí)行 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
有些時(shí)候,Pod 中運(yùn)行的應(yīng)用可能需要使用來(lái)自其他對(duì)象的配置值。 例如,某 Deployment 對(duì)象的 Pod 需要從環(huán)境變量或命令行參數(shù)中讀取讀取 Service 的名稱。 由于在 kustomization.yaml 文件中添加 namePrefix 或 nameSuffix 時(shí) Service 名稱可能發(fā)生變化,建議不要在命令參數(shù)中硬編碼 Service 名稱。 對(duì)于這種使用場(chǎng)景,Kustomize 可以通過(guò) vars 將 Service 名稱注入到容器中。
# 創(chuàng)建一個(gè) 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
# 創(chuàng)建一個(gè) service.yaml 文件
cat <<EOF > 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 <<EOF >./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
執(zhí)行 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
四、基準(zhǔn)(Bases)與覆蓋(Overlays)
Kustomize 中有 基準(zhǔn)(bases) 和 覆蓋(overlays) 的概念區(qū)分。 基準(zhǔn) 是包含 kustomization.yaml 文件的一個(gè)目錄,其中包含一組資源及其相關(guān)的定制。 基準(zhǔn)可以是本地目錄或者來(lái)自遠(yuǎn)程倉(cāng)庫(kù)的目錄,只要其中存在 kustomization.yaml 文件即可。 覆蓋 也是一個(gè)目錄,其中包含將其他 kustomization 目錄當(dāng)做 bases 來(lái)引用的 kustomization.yaml 文件。 基準(zhǔn)不了解覆蓋的存在,且可被多個(gè)覆蓋所使用。 覆蓋則可以有多個(gè)基準(zhǔn),且可針對(duì)所有基準(zhǔn)中的資源執(zhí)行組織操作,還可以在其上執(zhí)行定制。
# 創(chuàng)建一個(gè)包含基準(zhǔn)的目錄
mkdir base
# 創(chuàng)建 base/deployment.yaml
cat <<EOF > 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
# 創(chuàng)建 base/service.yaml 文件
cat <<EOF > 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
# 創(chuàng)建 base/kustomization.yaml
cat <<EOF > base/kustomization.yaml
resources:
- deployment.yaml
- service.yaml
EOF
此基準(zhǔn)可在多個(gè)覆蓋中使用。你可以在不同的覆蓋中添加不同的 namePrefix 或其他貫穿性字段。 下面是兩個(gè)使用同一基準(zhǔn)的覆蓋:
mkdir dev
cat <<EOF > dev/kustomization.yaml
bases:
- ../base
namePrefix: dev-
EOF
mkdir prod
cat <<EOF > prod/kustomization.yaml
bases:
- ../base
namePrefix: prod-
EOF
五、如何使用 Kustomize 來(lái)應(yīng)用、查看和刪除對(duì)象
在 kubectl 命令中使用 –kustomize 或 -k 參數(shù)來(lái)識(shí)別被 kustomization.yaml
所管理的資源。 注意 -k 要指向一個(gè) kustomization 目錄。例如:
$ kubectl apply -k <kustomization 目錄>/
我們?cè)賮?lái)寫(xiě)一個(gè) kustomization.yaml
文件:
# 創(chuàng)建 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
ports:
- containerPort: 80
EOF
# 創(chuàng)建 kustomization.yaml
cat <<EOF >./kustomization.yaml
namePrefix: dev-
commonLabels:
app: my-nginx
resources:
- deployment.yaml
EOF
執(zhí)行下面的命令來(lái)應(yīng)用 Deployment 對(duì)象 dev-my-nginx:
$ kubectl apply -k ./
$ deployment.apps/dev-my-nginx created
運(yùn)行下面的命令之一來(lái)查看 Deployment 對(duì)象 dev-my-nginx:
$ kubectl get -k ./
$ kubectl describe -k ./
執(zhí)行下面的命令來(lái)比較 Deployment 對(duì)象 dev-my-nginx 與清單被應(yīng)用之后集群將處于的狀態(tài):
$ kubectl diff -k ./
執(zhí)行下面的命令刪除 Deployment 對(duì)象 dev-my-nginx:
$ kubectl delete -k ./
$ deployment.apps “dev-my-nginx” deleted
六、Kustomize 功能特性列表
字段 | 類型 | 解釋 |
---|---|---|
namespace | string | 為所有資源添加名字空間 |
namePrefix | string | 此字段的值將被添加到所有資源名稱前面 |
nameSuffix | string | 此字段的值將被添加到所有資源名稱后面 |
commonLabels | map[string]string | 要添加到所有資源和選擇算符的標(biāo)簽 |
commonAnnotations | map[string]string | 要添加到所有資源的注解 |
resources | []string | 列表中的每個(gè)條目都必須能夠解析為現(xiàn)有的資源配置文件 |
configMapGenerator | []ConfigMapArgs | 列表中的每個(gè)條目都會(huì)生成一個(gè) ConfigMap |
secretGenerator | []SecretArgs | 列表中的每個(gè)條目都會(huì)生成一個(gè) Secret |
generatorOptions | GeneratorOptions | 更改所有 ConfigMap 和 Secret 生成器的行為 |
bases | []string | 列表中每個(gè)條目都應(yīng)能解析為一個(gè)包含 kustomization.yaml 文件的目錄 |
patchesStrategicMerge | []string | 列表中每個(gè)條目都能解析為某 Kubernetes 對(duì)象的策略性合并補(bǔ)丁 |
patchesJson6902 | []Patch | 列表中每個(gè)條目都能解析為一個(gè) Kubernetes 對(duì)象和一個(gè) JSON 補(bǔ)丁 |
vars | []Var | 每個(gè)條目用來(lái)從某資源的字段來(lái)析取文字 |
images | []Image | 每個(gè)條目都用來(lái)更改鏡像的名稱、標(biāo)記與/或摘要,不必生成補(bǔ)丁 |
configurations | []string | 列表中每個(gè)條目都應(yīng)能解析為一個(gè)包含 Kustomize 轉(zhuǎn)換器配置 的文件 |
crds | []string | 列表中每個(gè)條目都應(yīng)能夠解析為 Kubernetes 類別的 OpenAPI 定義文件 |
總結(jié)
全文加源碼文件文字,共計(jì)一萬(wàn)三千字,配置文件代碼占比較大。我原本打算分兩篇文章來(lái)寫(xiě),擔(dān)心分文會(huì)影響各位看官的閱讀感受。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-796165.html
看到這里了,給個(gè)雙擊唄?。?!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-796165.html
到了這里,關(guān)于【云原生 | Kubernetes 系列】K8s 實(shí)戰(zhàn) 使用 Kustomize 對(duì) Kubernetes 對(duì)象進(jìn)行聲明式管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!