如何使用 Kustomize 管理 Kubernetes 配置

作者选择了 多样性在技术基金作为 写给捐款计划的一部分接受捐款。

介绍

你部署了一些 Pods,由 部署支持,可在 服务中定义的可用性。

此外,您的应用程序可能需要与数据库进行通信,管理网页内容,或设置日志编辑功能。此外,这些参数可能需要取决于您正在部署的环境而有所不同。

Kustomize是一个开源的配置管理工具,旨在帮助解决这些问题,因为Kubernetes 1.14 kubectl完全支持Kustomize和 customization文件

在本指南中,您将构建一个小型的Web应用程序,然后使用Customize来管理您的配置扩展. 您将部署您的应用程序到具有不同配置的开发和生产环境中。

如果您正在寻找一个管理的Kubernetes托管服务,请查看我们的简单的,用于增长的管理的Kubernetes服务(https://www.digitalocean.com/products/kubernetes)。

前提条件

对于这个教程,你将需要:

若要在 DigitalOcean 上创建一个 Kubernetes 集群,请阅读我们的 Kubernetes Quickstart。 若要连接到集群,请阅读 如何连接到 DigitalOcean Kubernetes 集群

步骤 1 — 部署您的应用程序而无需定制

在使用 Kustomize 部署您的应用之前,您将首先以更传统的方式部署应用程序。在这种情况下,您将部署一个在 Nginx托管的静态 Web 应用程序的开发版本。您将将您的 Web 内容作为数据存储在 ConfigMap中,您将在部署中安装在 Pod 上。 每个应用程序都需要一个单独的 YAML 文件,现在您将创建。

首先,为您的应用程序和所有配置文件创建一个文件夹,这是您将在本教程中运行所有命令的地方。

在您的主目录中创建一个新文件夹,并导航:

1mkdir ~/sammy-app && cd ~/sammy-app

现在使用您喜爱的文本编辑器创建并打开名为 'configmap.yml'的文件:

1nano configmap.yml

添加以下内容:

 1[label ~/sammy-app/configmap.yml]
 2---
 3apiVersion: v1
 4kind: ConfigMap
 5metadata:
 6  name: sammy-app
 7  namespace: default
 8data:
 9  body: >
10    <html>
11      <style>
12        body {
13          background-color: #222;
14        }
15        p {
16          font-family:"Courier New";
17          font-size:xx-large;
18          color:#f22;
19          text-align:center;
20        }
21      </style>
22      <body>
23        <p>DEVELOPMENT</p>
24      </body>
25    </html>    

此规范会创建一个新的 ConfigMap 对象,您将其命名为sammy-app,并将一些 HTML 网页内容存储在data:内。

保存并关闭文件。

现在创建并打开第二个名为deployment.yml的文件:

1nano deployment.yml

添加以下内容:

 1[label ~/sammy-app/deployment.yml]
 2---
 3apiVersion: apps/v1
 4kind: Deployment
 5metadata:
 6  name: sammy-app
 7  namespace: default
 8  labels:
 9    app: sammy-app
10spec:
11  replicas: 1
12  selector:
13    matchLabels:
14      app: sammy-app
15  template:
16    metadata:
17      labels:
18        app: sammy-app
19    spec:
20      containers:
21      - name: server
22        image: nginx:1.17
23        volumeMounts:
24          - name: sammy-app
25            mountPath: /usr/share/nginx/html
26        ports:
27        - containerPort: 80
28          protocol: TCP
29        resources:
30          requests:
31            cpu: 100m
32            memory: "128M"
33          limits:
34            cpu: 100m
35            memory: "256M"
36        env:
37        - name: LOG_LEVEL
38          value: "DEBUG"
39      volumes:
40      - name: sammy-app
41        configMap:
42          name: sammy-app
43          items:
44          - key: body
45            path: index.html

此规范创建了一个新的部署对象. 您正在添加sammy-app的名称和标签,将复制件数设置为1,并指定对象使用 Nginx 版本 1.17 容器图像。

保存并关闭文件。

现在将这两个文件部署到您的 Kubernetes 集群中。 stdin 创建多个对象,将 cat 命令导管到 kubectl:

1cat configmap.yml deployment.yml | kubectl apply -f -

等待几分钟,然后使用kubectl来检查您的应用程序的状态:

1kubectl get pods -l app=sammy-app

您最终会在准备列中看到一个Pod与您的应用程序运行和1/1容器:

1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3sammy-app-56bbd86cc9-chs75 1/1 Running 0 8s

您的 Pod 正在运行并受部署支持,但您仍然无法访问您的应用程序. 首先,您需要添加服务。

创建并打开第三个 YAML 文件,名为 service.yml:

1nano service.yml

添加以下内容:

 1[label ~/sammy-app/service.yml]
 2---
 3apiVersion: v1
 4kind: Service
 5metadata:
 6  name: sammy-app
 7  labels:
 8    app: sammy-app
 9spec:
10  type: LoadBalancer
11  ports:
12  - name: sammy-app-http
13    port: 80
14    protocol: TCP
15    targetPort: 80
16  selector:
17    app: sammy-app

此规格创建了一个名为sammy-app的新服务对象。 对于大多数云提供商,将spec.type设置为LoadBalancer将提供负载平衡器. DigitalOcean Managed Kubernetes (DOKS),例如,将提供一个 DigitalOcean LoadBalancer以使您的应用程序可用于互联网。

保存并关闭文件。

现在将服务部署到您的 Kubernetes 集群:

1kubectl apply -f service.yml

等待几分钟,然后使用kubectl来检查您的应用程序的状态:

1kubectl get services -w

最终,在EXTERNAL-IP列下,您的服务将出现一个公共IP,而不是your_external_ip:

1[secondary_label Output]
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)        AGE
3kubernetes ClusterIP 10.245.0.1       <none>              443/TCP 7h26m
4sammy-app LoadBalancer 10.245.186.235   <pending>           80:30303/TCP 65s
5sammy-app LoadBalancer 10.245.186.235 your_external_ip 80:30303/TCP 2m29s

复制所显示的 IP 地址并在您的 Web 浏览器中输入它,您将看到您的应用程序的DEVELOPMENT版本。

sammy-app in development

从您的终端,键入CTRL + C,停止观看您的服务。

在此步骤中,您在 Kubernetes 中部署了「sammy-app」的开发版本。在步骤 2 和 3 中,您将使用 Kustomize 重新部署「sammy-app」的开发版本,然后部署具有略有不同配置的生产版本。

步骤 2 — 部署您的应用程序与自定义

在此步骤中,您将部署完全相同的应用程序,但在Kustomize预计的格式中,而不是默认的Kubernetes模式。

您的檔案系統目前看起來如下:

1sammy-app/
2├── configmap.yml
3├── deployment.yml
4└── service.yml

要使此应用程序可使用 Kustomize 部署,您需要添加一个文件,即 kustomization.yml

1nano kustomization.yml

至少,该文件应该指定在运行kubectl时要管理哪些资源,使用 [-k] 选项,该选项将指示kubectl处理自定义`文件(https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands)。

添加以下内容:

1[label ~/sammy-app/kustomization.yml]
2---
3resources:
4- configmap.yml
5- deployment.yml
6- service.yml

保存并关闭文件。

现在,在重新部署之前,请从步骤 1 中删除现有 Kubernetes 资源。

1kubectl delete deployment/sammy-app service/sammy-app configmap/sammy-app

然后再部署它们,但这次使用自定义:

1kubectl apply -k .

相反,您提供-f选项,以便kubectl指示Kubernetes从一个文件中创建资源,您提供-k和一个目录(在这种情况下,.表示当前目录),这指示kubectl使用自定义并检查该目录的customization.yml

这将创建所有三个资源: ConfigMap、部署和服务. 使用get pods命令来检查部署:

1kubectl get pods -l app=sammy-app

您将再次看到一个Pod与您的应用程序运行和1/1容器在准备列。

现在重新启动获取服务命令,您还将看到您的服务具有公开可访问的EXTERNAL-IP:

1kubectl get services -l app=sammy-app

您现在正在成功地使用Kustomize来管理您的Kubernetes配置。在下一步,您将部署sammy-app到生产中,其配置略有不同。

步骤 3 — 管理应用程序变量与自定义

Kubernetes 资源的配置文件一旦您开始处理多个资源类型,特别是当环境之间存在小差异时(例如开发与生产)。

想象一下,当一个新的版本的 Nginx Docker 图像发布时会发生什么,你想开始使用它。也许你在 deployment-development.yml 中测试了新的版本,想继续,但然后你忘了将 deployment-production.yml 更新到新的版本。

请记住,你现在有一个文件系统,包含你的 Kubernetes 配置文件和一个 kustomization.yml:

1sammy-app/
2├── configmap.yml
3├── deployment.yml
4├── kustomization.yml
5└── service.yml

想象一下,你现在已经准备好将sammy-app部署到生产中了,你还决定你的应用程序的生产版本将以以下方式与其开发版本有所不同:

*复制件将从1增加到3。 *容器资源请求将从100m CPU 和128M内存增加到250m CPU 和256M内存。 *容器资源限制将从100m CPU 和256M内存增加到1 CPU 和1G内存。

首先,创建一些新的目录,以便以更定制的方式组织事物:

1mkdir base

这将保留你的默认配置—your base

现在将当前的sammy-app/配置移动到此目录中:

1mv configmap.yml deployment.yml service.yml kustomization.yml base/

然后为您的生产配置创建一个新的目录。 自定义称此为重叠. 把重叠认为是基层的顶部的层,它们总是需要一个基层来运作:

1mkdir -p overlays/production

创建另一个 kustomization.yml 文件来定义您的生产重叠:

1nano overlays/production/kustomization.yml

添加以下内容:

1[label ~/sammy-app/overlays/production/kustomization.yml]
2---
3bases:
4- ../../base
5patchesStrategicMerge:
6- configmap.yml
7- deployment.yml

此文件将指定重叠的基础,以及 Kubernetes 将使用什么策略来修补资源. 在此示例中,您将指定 策略合并式修补程序来更新 ConfigMap 和部署资源。

保存并关闭文件。

最后,将新的deployment.ymlconfigmap.yml文件添加到overlays/production/目录中。

首先创建新的 deployment.yml 文件:

1nano overlays/production/deployment.yml

将下列内容添加到您的文件中. 突出的部分表示您的开发配置的更改:

 1[label ~/sammy-app/overlays/production/deployment.yml]
 2---
 3apiVersion: apps/v1
 4kind: Deployment
 5metadata:
 6  name: sammy-app
 7  namespace: default
 8spec:
 9  replicas: 3
10  template:
11    spec:
12      containers:
13      - name: server
14        resources:
15          requests:
16            cpu: 250m
17            memory: "256M"
18          limits:
19            cpu: 1
20            memory: "1G"
21        env:
22        - name: LOG_LEVEL
23          value: "INFO"

只包含用于识别更改的资源的TypeMeta字段(在这种情况下,应用程序的部署),以及足够的剩余字段进入嵌入结构,以指定新的字段值,例如容器资源请求和限制。

保存并关闭文件。

现在为您的生产重叠创建一个新的configmap.yml:

1nano /overlays/production/configmap.yml

添加以下内容:

 1[label ~/sammy-app/overlays/production/configmap.yml]
 2---
 3apiVersion: v1
 4kind: ConfigMap
 5metadata:
 6  name: sammy-app
 7  namespace: default
 8data:
 9  body: >
10    <html>
11      <style>
12        body {
13          background-color: #222;
14        }
15        p {
16          font-family:"Courier New";
17          font-size:xx-large;
18          color:#22f;
19          text-align:center;
20        }
21      </style>
22      <body>
23        <p>PRODUCTION</p>
24      </body>
25    </html>    

请注意,您还将文本颜色从红色#f22更改为蓝色#22f

您的目录结构现在看起来像这样:

 1sammy-app/
 2├── base
 3│   ├── configmap.yml
 4│   ├── deployment.yml
 5│   ├── kustomization.yml
 6│   └── service.yml
 7└── overlays
 8    └── production
 9        ├── configmap.yml
10        ├── deployment.yml
11        └── kustomization.yml

您已准备好使用基础配置部署,首先删除现有资源:

1kubectl delete deployment/sammy-app service/sammy-app configmap/sammy-app

将基础配置部署到 Kubernetes:

1kubectl apply -k base/

查看您的部署:

1kubectl get pods,services -l app=sammy-app

您将看到预期的基本配置,开发版本可见于服务的EXTERNAL-IP:

1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3pod/sammy-app-5668b6dc75-rwbtq 1/1 Running 0 21s
4
5NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)        AGE
6service/sammy-app LoadBalancer 10.245.110.172 your_external_ip 80:31764/TCP 7m43s

现在部署您的生产配置:

1kubectl apply -k overlays/production/

再次检查您的部署:

1kubectl get pods,services -l app=sammy-app

您将看到预期的生产配置,在服务的外部 IP上可见生产版本:

1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3pod/sammy-app-86759677b4-h5ndw 1/1 Running 0 15s
4pod/sammy-app-86759677b4-t2dml 1/1 Running 0 17s
5pod/sammy-app-86759677b4-z56f8 1/1 Running 0 13s
6
7NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)        AGE
8service/sammy-app LoadBalancer 10.245.110.172 your_external_ip 80:31764/TCP 8m59s

请注意,在生产配置中,总共有3个Pod,而不是1。

1kubectl get deployments -l app=sammy-app -o yaml

在浏览器中访问your_external_ip,查看您的网站的生产版本。

sammy-app in production

现在你正在使用 Kustomize 来管理应用程序的差异性. 回想起你的原始问题之一,如果你现在想更改 Nginx 图像版本,你只需要在基础上修改 `deployment.yml,并且使用该基础的重叠层也将通过 Kustomize 收到这种更改。

结论

在本教程中,你建立了一个小型的Web应用程序,并部署到Kubernetes中,然后使用Customize来简化不同环境的应用程序配置管理。你将一组几乎重复的YAML文件重组成一个层式模型,这将减少错误,减少手动配置,并使你的工作更加可识别和可维护。

但是,这只会撕裂Kustomize提供的表面,有数十个官方示例(https://github.com/kubernetes-sigs/kustomize/tree/master/examples)和大量的(深入的技术文档)(https://github.com/kubernetes-sigs/kustomize/tree/master/docs)可以探索,如果你有兴趣了解更多。

Published At
Categories with 技术
comments powered by Disqus