k8s原生配置管理Kustomize利器
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.Kustomize与Helm技术对比
1.Kustomize 与 Helm 区别对比
区别对比 | Kustomize | Helm |
---|---|---|
实现方式 | 基于覆盖的策略,通过在原始资源上应用一系列覆盖来实现资源定制。 | 使用Go模板语言,将变量嵌入到YAML文件中,通过替换变量的方式生成定制资源。 |
配置管理 | 使用"kustomization.yaml"文件进行配置管理。 | 使用名为"Chart.yaml" 和"values.yaml"的文件。 |
依赖管理 | 不具备依赖管理功能。 | 支持依赖管理,允许用户将一个 Helm Chart 依赖于其他 Helm Chart。 |
发布管理 | 不具备类似功能 | 支持版本控制和回滚功能,可以管理应用的发布历史。 |
安装方式 | "Kubernetes v1.14+""起已经集成在 kubectl子命令中。 通过执行"kubectl apply -k"命令 |
需要单独安装 |
Kustomize是一款Kubernetes原生的配置管理工具,其核心理念是允许用户自定义Kubernetes资源配置,而无需直接修改原始的YAML文件。这在很大程度上提高了配置的可维护性和可重用性。
Kustomize使用声明式的方式来定制资源,通过一系列预定义的指令和规则,用户可以对基础资源进行修改、添加或删除。
Kustomize是一个独立的工具,用来通过kustomization文件定制kubernetes对象。
kustomize工具可以打包不同环境的配置,在kubernetes 1.14+版本之后,直接集成到kubectl命令中,通过执行"kubectl apply -k"命令就可以完成不同环境应用的打包,使用起来比helm更加简单方便。
推荐阅读:
https://kubernetes.io/zh-cn/docs/tasks/manage-kubernetes-objects/kustomization
https://kubectl.docs.kubernetes.io/zh/guides/bespoke/
https://kubectl.docs.kubernetes.io/zh/api-reference/kustomization/
https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/
如上表所示,Kustomize和Helm都是Kubernetes生态中流行的配置管理工具,虽然它们有许多相似之处,但在实现方式和适用场景上有所不同。
3.Kustomize 与 Helm的优缺点
软件名称 | 优点 | 缺点 |
---|---|---|
helm | (1)支持依赖管理和发布管理,提供了完整的应用生命周期管理功能; (2)使用Go模板语言,可以处理复杂的逻辑和动态生成内容; (3)拥有丰富的社区资源,如Helm Chart仓库等; |
(1)需要单独安装,并学习Go模板语言; (2)模板语言可能导致配置的复杂性增加 |
kustomize | (1)易于学习和理解,与 Kubernetes 资源本身的定义方式保持一致; (2)使用声明式方式进行资源定制,避免了模板语言带来的复杂性; (3)支持多层覆盖,有利于组织和管理复杂的配置; (4)无需安装额外工具,与 kubectl 无缝集成 |
(1)不支持依赖管理和发布管理 (2)在处理复杂逻辑和动态生成内容时,相较于Helm的模板语言,Kustomize 的能力有限 |
如上表所示,我总结了Kustomize与Helm的优缺点,总的来说从学习成本上说kustomize更轻松,而从功能上说helm更强大,但学习成本高。
3.Kustomize 与 Helm适用场景
软件名称 | ||
---|---|---|
Kustomize | (1)适用于简单到中等复杂度的 Kubernetes 资源配置管理; (2)更适合那些需要在多个环境和场景下复用基础配置的场景; (3)当对模板语言的需求较低时,Kustomize是一个更简洁的选择 |
|
Helm | (1)适用于具有复杂依赖关系和发布管理需求的应用; (2)当需要处理复杂逻辑和动态生成内容时,Helm的模板语言更具优势; (3)如果需要使用丰富的社区资源,例如 Helm Chart仓库,Helm是一个更好的选择 |
Kustomize和Helm都是优秀的Kubernetes配置管理工具,它们各自具有独特的优势和不同的适用场景。在选择Kustomize还是Helm时,需要根据实际需求和场景来权衡。
Kustomize以其简单易用、声明式的方式在Kubernetes生态中脱颖而出,特别适合那些需要在多个环境和场景下复用基础配置的场景。
而Helm则作为一个功能更为完善的应用生命周期管理工具,更适合具有复杂依赖关系和发布管理需求的应用。在处理复杂逻辑和动态生成内容时,Helm的模板语言具有显著优势。同时,Helm 也拥有丰富的社区资源,如 Helm Chart仓库等,为用户提供了更多的便利。
最终,你可以根据实际项目需求、团队技能和个人喜好来选择Kustomize或Helm。无论选择哪种工具,都能在Kubernetes配置管理方面为你带来很大的帮助。
二.使用kustomize管理对象
1.kubectl kustomize生成资源清单列表
Usage:
kubectl kustomize DIR [flags] [options]
温馨提示:
(1)查看指定目录的"kustomization.yaml"文件,从而生成K8S资源清单列表。
(2)详细信息: "kubectl kustomize --help"
2.使用"--kustomize"或者"-k"参数来应用资源清单
kubectl apply -k DIRECTORY [options]
温馨提示:
(1)其中短选项"-k"可以使用长选项"--kustomize"来替代;
(2)会查找指定目录的"kustomization.yaml"文件;
(3)详细信息: "kubectl apply --help"
3.查看资源资源对象的信息
1.查看资源的列表信息
kubectl get -K ...
2.查看资源的详细信息
kubectl describe -K ...
温馨提示:
(1)其中短选项"-k"可以使用长选项"--kustomize"来替代;
(2)会查找指定目录的"kustomization.yaml"文件;
(3)详细信息: "kubectl get --help","kubectl describe --help"
4.删除资源
Usage:
kubectl delete ([-k DIRECTORY])
温馨提示:
(1)其中短选项"-k"可以使用长选项"--kustomize"来替代;
(2)会查找指定目录的"kustomization.yaml"文件;
三.kustomize生成资源
推荐阅读:
https://www.cnblogs.com/yinzhengjie/p/18591577
四.基准(bases)与覆盖(overlays)
1.kustomize的基准(bases)与覆盖(overlays)
kustomize术语 | 概念 | 注意事项 |
---|---|---|
基准(bases) | (1)包含kustomization.yaml文件的一个目录,其中包含一组资源及其相关的定制; (2)可以是本地目录或者来自远程仓库的目录,只要其中存在kustomization.yam文件即可; |
基准(bases)不了解覆盖(overlays)的存在,且可被多个覆盖(overlays)所使用。 |
覆盖(overlays) | (1)也是一个目录,其中包含将其它kustomization目录当作bases来引用的kustomization.yaml文件; (2) |
覆盖(overlays)则可以有多个基准(bases),且可针对所有基准(bases)中的资源执行组织操作,还可以在其上执行定制。 |
如上表所示,kustomize中有基准(bases)与覆盖(overlays)的概念区分。
官网链接:
https://kubernetes.io/docs/tasks/manage-kubernetes-objects/kustomization/#bases-and-overlays
2.创建测试目录
[root@master231 yinzhengjie]# pwd
/yinzhengjie
[root@master231 yinzhengjie]#
[root@master231 yinzhengjie]# mkdir -pv kustomize/case-demo/{dev,prod,base}
mkdir: created directory 'kustomize/case-demo/dev'
mkdir: created directory 'kustomize/case-demo/prod'
mkdir: created directory 'kustomize/case-demo/base'
[root@master231 yinzhengjie]#
3.创建基准(bases)的测试数据
3.1 创建基准(bases)的deploy资源清单
[root@master231 yinzhengjie]# cat > kustomize/case-demo/base/deployments.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-xiuxian
spec:
replicas: 3
selector:
matchLabels:
apps: v1
template:
metadata:
labels:
apps: v1
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
ports:
- containerPort: 80
EOF
3.2 创建基准(bases)的创建svc资源文件
[root@master231 yinzhengjie]# cat > kustomize/case-demo/base/services.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
name: svc-xiuxian
spec:
selector:
apps: v1
ports:
- port: 80
EOF
3.3 创建基准(bases)的kustomization.yaml文件
[root@master231 yinzhengjie]# cat > kustomize/case-demo/base/kustomization.yaml <<EOF
resources:
- services.yaml
- deployments.yaml
EOF
4.创建覆盖(overlays)的测试数据
4.1 创建dev的kustomization.yaml文件
[root@master231 yinzhengjie]# cat > kustomize/case-demo/dev/kustomization.yaml <<EOF
resources:
- ../base
namePrefix: dev-
EOF
4.2 创建prod的kustomization.yaml文件
[root@master231 yinzhengjie]# cat > kustomize/case-demo/prod/kustomization.yaml <<EOF
resources:
- ../base
namePrefix: prod-
EOF
5.测试验证
5.1 测试验证dev
[root@master231 yinzhengjie]# kubectl kustomize kustomize/case-demo/dev/
apiVersion: v1
kind: Service
metadata:
name: dev-svc-xiuxian
spec:
ports:
- port: 80
selector:
apps: v1
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: dev-deploy-xiuxian
spec:
replicas: 3
selector:
matchLabels:
apps: v1
template:
metadata:
labels:
apps: v1
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
name: c1
ports:
- containerPort: 80
[root@master231 yinzhengjie]#
5.2 测试验证prod
[root@master231 yinzhengjie]# kubectl kustomize kustomize/case-demo/prod
apiVersion: v1
kind: Service
metadata:
name: prod-svc-xiuxian
spec:
ports:
- port: 80
selector:
apps: v1
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: prod-deploy-xiuxian
spec:
replicas: 3
selector:
matchLabels:
apps: v1
template:
metadata:
labels:
apps: v1
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
name: c1
ports:
- containerPort: 80
[root@master231 yinzhengjie]#
五.kustomize客户端使用
1.kustomize客户端和K8S版本对应关系
我们之前基于"kubectl kustomize"子命令来管理集群。
也可以通过kustomize客户端来管理kustomization.yam文件来管理kubernetes对象。
推荐阅读:
https://github.com/kubernetes-sigs/kustomize
2.部署kustomize客户端工具
1.下载kustomize
[root@master231 yinzhengjie]# wget https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv4.4.1/kustomize_v4.4.1_linux_amd64.tar.gz
2.将kustomize添加到PATH环境变量中
[root@master231 yinzhengjie]# tar xf kustomize_v4.4.1_linux_amd64.tar.gz -C /usr/local/bin/
[root@master231 yinzhengjie]#
[root@master231 yinzhengjie]# ll /usr/local/bin/kustomize
-rwxr-xr-x 1 root root 11849728 Nov 12 2021 /usr/local/bin/kustomize*
[root@master231 yinzhengjie]#
3.通过kustomize创建K8S资源
[root@master231 yinzhengjie]# ll kustomize/case-demo/wordpress/
total 28
drwxr-xr-x 2 root root 4096 Dec 8 09:50 ./
drwxr-xr-x 6 root root 4096 Dec 8 12:31 ../
-rw-r--r-- 1 root root 658 Dec 8 09:54 deployments.yaml
-rw-r--r-- 1 root root 237 Dec 8 09:51 kustomization.yaml
-rw-r--r-- 1 root root 545 Dec 8 09:54 replicationcontrollers.yaml
-rw-r--r-- 1 root root 150 Dec 8 09:41 svc-db.yaml
-rw-r--r-- 1 root root 164 Dec 8 09:46 svc-wp.yaml
[root@master231 yinzhengjie]#
[root@master231 yinzhengjie]#
[root@master231 yinzhengjie]# kustomize build kustomize/case-demo/wordpress/
apiVersion: v1
kind: Service
metadata:
name: test-svc-db-001
spec:
ports:
- port: 3306
targetPort: 3306
selector:
apps: db
type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
name: test-svc-wp-001
spec:
ports:
- nodePort: 30090
port: 80
targetPort: 80
selector:
apps: wp
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deploy-wp-001
spec:
replicas: 3
selector:
matchLabels:
apps: v1
template:
metadata:
labels:
apps: wp
spec:
containers:
- env:
- name: WORDPRESS_DB_HOST
value: test-svc-db-001
- name: WORDPRESS_DB_USER
value: JieGeJiangYunWei
- name: WORDPRESS_DB_PASSWORD
value: yinzhengjie
- name: WORDPRESS_DB_NAME
value: wordpress
image: harbor.yinzhengjie.com/yinzhengjie-wp/wordpress:latest
name: c1
---
apiVersion: v1
kind: ReplicationController
metadata:
name: test-rc-db-001
spec:
replicas: 1
selector:
apps: db
template:
metadata:
labels:
apps: db
spec:
containers:
- env:
- name: MYSQL_ALLOW_EMPTY_PASSWORD
value: "yes"
- name: MYSQL_USER
value: JieGeJiangYunWei
- name: MYSQL_PASSWORD
value: yinzhengjie
- name: MYSQL_DATABASE
value: wordpress
image: harbor.yinzhengjie.com/yinzhengjie-db/mysql:8.0.36-oracle
name: c1
[root@master231 yinzhengjie]#
4.通过kustomize查看配置文件信息
[root@master231 yinzhengjie]# kustomize cfg tree kustomize/case-demo/wordpress/
kustomize/case-demo/wordpress
├── [deployments.yaml] Deployment deploy-wp
├── [replicationcontrollers.yaml] ReplicationController rc-db
├── [svc-db.yaml] Service svc-db
└── [svc-wp.yaml] Service svc-wp
[root@master231 yinzhengjie]#
[root@master231 yinzhengjie]# kustomize cfg count kustomize/case-demo/wordpress/
kustomize/case-demo/wordpress//
: 1
Deployment: 1
ReplicationController: 1
Service: 2
[root@master231 yinzhengjie]#
[root@master231 yinzhengjie]# kustomize cfg cat kustomize/case-demo/wordpress/
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-wp
spec:
replicas: 3
selector:
matchLabels:
apps: v1
template:
metadata:
labels:
apps: wp
spec:
containers:
- name: c1
image: harbor.yinzhengjie.com/yinzhengjie-wp/wordpress:latest
env:
- name: WORDPRESS_DB_HOST
# 注意,此处是我引用的svc变量名称
value: "$(YINZHENGJIE_SVC_WORDPRESS_DB_HOST)"
- name: WORDPRESS_DB_USER
value: JieGeJiangYunWei
- name: WORDPRESS_DB_PASSWORD
value: yinzhengjie
- name: WORDPRESS_DB_NAME
value: wordpress
---
namePrefix: test-
nameSuffix: "-001"
resources:
- deployments.yaml
- replicationcontrollers.yaml
- svc-db.yaml
- svc-wp.yaml
vars:
- name: YINZHENGJIE_SVC_WORDPRESS_DB_HOST
objref:
apiVersion: v1
kind: Service
name: svc-db
---
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-db
spec:
replicas: 1
selector:
apps: db
template:
metadata:
labels:
apps: db
spec:
containers:
- name: c1
image: harbor.yinzhengjie.com/yinzhengjie-db/mysql:8.0.36-oracle
env:
- name: MYSQL_ALLOW_EMPTY_PASSWORD
value: "yes"
- name: MYSQL_USER
value: JieGeJiangYunWei
- name: MYSQL_PASSWORD
value: yinzhengjie
- name: MYSQL_DATABASE
value: wordpress
---
apiVersion: v1
kind: Service
metadata:
name: svc-db
spec:
type: ClusterIP
selector:
apps: db
ports:
- port: 3306
targetPort: 3306
---
apiVersion: v1
kind: Service
metadata:
name: svc-wp
spec:
type: NodePort
selector:
apps: wp
ports:
- port: 80
targetPort: 80
nodePort: 30090
[root@master231 yinzhengjie]#
5.查看kustomize的帮助信息
[root@master231 yinzhengjie]# kustomize help
Manages declarative configuration of Kubernetes.
See https://sigs.k8s.io/kustomize
Usage:
kustomize [command]
Available Commands:
build Build a kustomization target from a directory or URL.
cfg Commands for reading and writing configuration.
completion Generate shell completion script
create Create a new kustomization in the current directory
edit Edits a kustomization file
fn Commands for running functions against configuration.
help Help about any command
version Prints the kustomize version
Flags:
-h, --help help for kustomize
--stack-trace print a stack-trace on error
Additional help topics:
kustomize docs-fn [Alpha] Documentation for developing and invoking Configuration Functions.
kustomize docs-fn-spec [Alpha] Documentation for Configuration Functions Specification.
kustomize docs-io-annotations [Alpha] Documentation for annotations used by io.
kustomize docs-merge [Alpha] Documentation for merging Resources (2-way merge).
kustomize docs-merge3 [Alpha] Documentation for merging Resources (3-way merge).
kustomize tutorials-command-basics [Alpha] Tutorials for using basic config commands.
kustomize tutorials-function-basics [Alpha] Tutorials for using functions.
Use "kustomize [command] --help" for more information about a command.
[root@master231 yinzhengjie]#
本文来自博客园,作者:尹正杰,转载请注明原文链接:https://www.cnblogs.com/yinzhengjie/p/18591683,个人微信: "JasonYin2020"(添加时请备注来源及意图备注,有偿付费)
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。