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]# 

posted @ 2024-12-07 05:59  尹正杰  阅读(162)  评论(0编辑  收藏  举报