乐趣区

关于kubernetes:kustomize-实践

缘起

在 kustomize 呈现之前,Kubernetes 治理利用的形式次要是通过 Helm 或者下层 Paas 来实现。这些工具通常通过特定畛域配置语言 (DSL,如 Go template、jsonnet) 来保护并治理利用,并且须要参数化模板形式(如 helm) 来自定义配置,这须要 额定学习 简单的 DSL 语法及容易出错。

kustomize 是什么

kustomize 是 kubernetes 原生 的配置管理,以 无模板形式 定制利用 的配置。kustomize 应用 k8s 原生概念帮忙创立并复用资源配置(YAML),容许用户以一个利用形容文件(YAML 文件)为根底(Base YAML),而后通过 Overlay 的形式生成最终部署利用所需的形容文件。

kustomize 解决了什么痛点

  • 如何治理不同环境或不同团队的利用的 Kubernetes YAML 资源
  • 如何以某种形式治理不同环境的渺小差别,使得资源 配置 能够 复用,缩小 copy and change 的工作量
  • 如何简化保护利用的流程,不须要额定学习模板语法

Kustomize 通过以下几种形式解决了上述问题:

  • kustomize 通过 Base & Overlays 形式形式保护不同环境的利用配置
  • kustomize 应用 patch 形式复用 Base 配置,并在 Overlay 形容与 Base 利用配置的差别局部来实现资源复用
  • kustomize 治理的都是 Kubernetes 原生 YAML 文件,不须要学习额定的 DSL 语法

官网示例

指标: 应用 kustomize 治理 stage、production 两个环境的 helloword 利用

前提

  • 两个不同的环境(演示、生产)
  • 一个 deployments 资源和 service 资源
  • 环境之间有不同的 replicas 或者 ConfigMap

最终文件构造

demo
├── base
│   ├── configMap.yaml
│   ├── deployment.yaml
│   ├── kustomization.yaml
│   └── service.yaml
└── overlays
    ├── production
    │   ├── deployment.yaml
    │   └── kustomization.yaml
    └── staging
        ├── kustomization.yaml
        └── map.yaml 

新建一个 Base 目录

这里应用官网的 helloWorld 的 YAML 资源文件作为示例,在 base 目录下新增几个 k8s YAML 资源文件,文件构造如下:

demo
└── base
    ├── configMap.yaml
    ├── deployment.yaml
    ├── kustomization.yaml
    └── service.yaml 

接下来看看 kustomization.yaml 配置文件中蕴含什么内容:

# filename: demo/base/kustomization.yaml
commonLabels:
  app: hello

resources:
- deployment.yaml
- service.yaml
- configMap.yaml 

这个文件申明了这些 YAML 资源 (deployments、services、configmap 等) 以及要利用于它们的一些自定义,如增加一个通用的标签。kustomization 还提供了 namePrefix、commonAnnoations、images 等配置项

其余几个文件别离如下:

# filename: demo/base/configMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: the-map
data:
  altGreeting: "Good Morning!"
  enableRisky: "false"
# filename: demo/base/service.yaml
kind: Service
apiVersion: v1
metadata:
  name: the-service
spec:
  selector:
    deployment: hello
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 8666
    targetPort: 8080
# filename: demo/base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: the-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      deployment: hello
  template:
    metadata:
      labels:
        deployment: hello
    spec:
      containers:
      - name: the-container
        image: monopole/hello:1
        command: ["/hello",
                  "--port=8080",
                  "--enableRiskyFeature=$(ENABLE_RISKY)"]
        ports:
        - containerPort: 8080
        env:
        - name: ALT_GREETING
          valueFrom:
            configMapKeyRef:
              name: the-map
              key: altGreeting
        - name: ENABLE_RISKY
          valueFrom:
            configMapKeyRef:
              name: the-map
              key: enableRisky

这时候,能够通过 kustomize build 命令来看残缺的配置:

kustomize build demo/base 

另外部署的时候能够间接应用上面的命令

# kubectl apply -k demo/base # 这种形式间接部署在集群中

build 进去的 YAML 每个资源对象上都会存在通用的标签 app: hello

上面为 build 后果:

apiVersion: v1
data:
  altGreeting: Good Morning!
  enableRisky: "false"
kind: ConfigMap
metadata:
  labels:
    app: hello
  name: the-map
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: hello
  name: the-service
spec:
  ports:
  - port: 8666
    protocol: TCP
    targetPort: 8080
  selector:
    app: hello
    deployment: hello
  type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: hello
  name: the-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello
      deployment: hello
  template:
    metadata:
      labels:
        app: hello
        deployment: hello
    spec:
      containers:
      - command:
        - /hello
        - --port=8080
        - --enableRiskyFeature=$(ENABLE_RISKY)
        env:
        - name: ALT_GREETING
          valueFrom:
            configMapKeyRef:
              key: altGreeting
              name: the-map
        - name: ENABLE_RISKY
          valueFrom:
            configMapKeyRef:
              key: enableRisky
              name: the-map
        image: monopole/hello:1
        name: the-container
        ports:
        - containerPort: 8080

创立 Overlays

创立一个 staging 和 production overlay,目录树结构如下所示:

demo
├── base
│   ├── configMap.yaml
│   ├── deployment.yaml
│   ├── kustomization.yaml
│   └── service.yaml
└── overlays
    ├── production
    └── staging 
演示环境 kustomization

在 staging kustomization 文件中,定义一个新的名称前辍以及一些不同的标签

# filename: demo/overlays/staging/kustomization.yaml
namePrefix: staging-
commonLabels:
  variant: staging
  org: acmeCorporation
commonAnnotations:
  note: Hello, I am staging!
bases:
- ../../base
patchesStrategicMerge:
- map.yaml 
演示环境 patch

增加一个 ConfigMap 自定义把 base 中的 ConfigMap 中的 “_Good Morning!_” 变成 “Good Night!”

# 文件门路 demo/overlays/staging/map.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: the-map
data:
  altGreeting: "Have a pineapple!"
  enableRisky: "true" 
生产环境 kustoimzation

在生产环境目录下,创立一个 kustomization.yaml 文件,定义不同的名称及标签

# filename: demo/overlays/production/kustomization.yaml
namePrefix: production-
commonLabels:
  variant: production
  org: acmeCorporation
commonAnnotations:
  note: Hello, I am production!
bases:
- ../../base
patchesStrategicMerge:
- deployment.yaml 
生产环境 patch

创立一个生产环境的 patch, 定义减少正本数量

# filename: demo/overlays/production/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: the-deployment
spec:
  replicas: 10 

部署不同环境

须要在演示环境部署利用,通过上面命令

kubectl apply -k  demo/overlays/staging

比照 base、staging 生成的文件

kustomize build demo/base > /tmp/base.yaml
kustomize build demo/overlays/staging > /tmp/staging.yaml
vimdiff /tmp/base.yaml /tmp/staging.yaml

须要在生产环境部署利用,通过上面命令

kubectl apply -k  demo/overlays/production

比照 base、production 生成的文件

kustomize build demo/base > /tmp/base.yaml
kustomize build demo/overlays/production > /tmp/production.yaml
vimdiff /tmp/base.yaml /tmp/production.yaml


参考

kustomize github 地址
kustomize 本文示例
kustomize 官网所有示例
kustomize 最简实际

退出移动版