kustomize

Demo: hello world with variants

步骤:

  1. 下载 base 配置。
  2. 进行定制。
  3. 基于定制后的 base 新建2个不同的 overlays (stagingproduction)。
  4. 运行 kustomize 和 kubectl 来部署 staging 和 production 。

首先创建一个工作空间:

DEMO_HOME=$(mktemp -d)

或者:

DEMO_HOME=~/hello

创建 base

如果要使用 overlays 创建 variants ,必须先创建一个共同的 base

为了使本文档保持简洁,base 的资源位于补充目录中,并不在此处,请按照下面的方法下载它们:

BASE=$DEMO_HOME/base
mkdir -p $BASE

curl -s -o "$BASE/#1.yaml" "https://raw.githubusercontent.com\
/kubernetes-sigs/kustomize\
/master/examples/helloWorld\
/{configMap,deployment,kustomization,service}.yaml"

观察该目录:

tree $DEMO_HOME

可以看到:

/tmp/tmp.IyYQQlHaJP
└── base
    ├── configMap.yaml
    ├── deployment.yaml
    ├── kustomization.yaml
    └── service.yaml

这些 resources 可以立即在 k8s 集群中部署:

kubectl apply -f $DEMO_HOME/base

实例化 hello 服务, kubectl 只能识别 resources 文件。

The Base Kustomization

base 目录中包含一个 kustomization 文件:

more $BASE/kustomization.yaml

(可选)在 base 目录上运行 kustomize 将定制过的 resources 打印到标准输出:

kustomize build $BASE

定制 base

定制 app label 并应用于所有的 resources :

sed -i.bak 's/app: hello/app: my-hello/' \
    $BASE/kustomization.yaml

查看效果:

kustomize build $BASE | grep -C 3 app:

创建 Overlays

创建包含 stagingproductionoverlay

  • Staging 包含生产环境中无法应用的带有风险的功能。
  • Production 包含更多的副本数。
  • 来自这些集群 variants 的问候消息将与来自其他集群的不同。
OVERLAYS=$DEMO_HOME/overlays
mkdir -p $OVERLAYS/staging
mkdir -p $OVERLAYS/production

Staging Kustomization

staging 目录中创建一个 kustomization 文件,用来定义一个新的名称前缀和一些不同的 labels 。

cat <<'EOF' >$OVERLAYS/staging/kustomization.yaml
namePrefix: staging-
commonLabels:
  variant: staging
  org: acmeCorporation
commonAnnotations:
  note: Hello, I am staging!
resources:
- ../../base
patchesStrategicMerge:
- map.yaml
EOF

Staging Patch

新增一个自定义的 configMap 将问候消息从 Good Morning! 改为 Have a pineapple!

同时,将 risky 标记设置为 true 。

cat <<EOF >$OVERLAYS/staging/map.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: the-map
data:
  altGreeting: "Have a pineapple!"
  enableRisky: "true"
EOF

Production Kustomization

production 目录中创建一个 kustomization 文件,用来定义一个新的名称前缀和 labels 。

cat <<EOF >$OVERLAYS/production/kustomization.yaml
namePrefix: production-
commonLabels:
  variant: production
  org: acmeCorporation
commonAnnotations:
  note: Hello, I am production!
resources:
- ../../base
patchesStrategicMerge:
- deployment.yaml
EOF

Production Patch

因为生产环境需要处理更多的流量,新建一个 production patch 来增加副本数。

cat <<EOF >$OVERLAYS/production/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: the-deployment
spec:
  replicas: 10
EOF

比较 overlays

DEMO_HOME 现在包含:

  • base 目录:对拉取到的源配置进行了简单定制

  • overlays 目录:包含在集群中创建不同 stagingproduction variants 的 kustomizations 和 patches 。

查看目录结构和差异:

tree $DEMO_HOME

可以看到:

/tmp/tmp.IyYQQlHaJP1
├── base
│   ├── configMap.yaml
│   ├── deployment.yaml
│   ├── kustomization.yaml
│   └── service.yaml
└── overlays
    ├── production
    │   ├── deployment.yaml
    │   └── kustomization.yaml
    └── staging
        ├── kustomization.yaml
        └── map.yaml

直接比较 stagingproduction 输出的不同:

diff \
  <(kustomize build $OVERLAYS/staging) \
  <(kustomize build $OVERLAYS/production) |\
  more

部分比较输出:

<   altGreeting: Have a pineapple!
<   enableRisky: "true"
---
>   altGreeting: Good Morning!
>   enableRisky: "false"
8c8
<     note: Hello, I am staging!
---
>     note: Hello, I am production!
11c11
<     variant: staging
---
>     variant: production
13c13
(...truncated)

部署

输出不同 overlys 的配置:

kustomize build $OVERLAYS/staging
kustomize build $OVERLAYS/production

将上述命令传递给 kubectl 进行部署:

kustomize build $OVERLAYS/staging |\
    kubectl apply -f -
kustomize build $OVERLAYS/production |\
   kubectl apply -f -

也可使用 kubectl (v1.14.0 以上版本):

kubectl apply -k $OVERLAYS/staging
kubectl apply -k $OVERLAYS/production
posted @ 2020-04-09 15:57  hurz  阅读(555)  评论(0编辑  收藏  举报