作者选择了 多样性在技术基金作为 写给捐款计划的一部分接受捐款。
介绍
你部署了一些 Pods,由 部署支持,可在 服务中定义的可用性。
此外,您的应用程序可能需要与数据库进行通信,管理网页内容,或设置日志编辑功能。此外,这些参数可能需要取决于您正在部署的环境而有所不同。
Kustomize是一个开源的配置管理工具,旨在帮助解决这些问题,因为Kubernetes 1.14 kubectl
完全支持Kustomize和 customization
文件。
在本指南中,您将构建一个小型的Web应用程序,然后使用Customize来管理您的配置扩展. 您将部署您的应用程序到具有不同配置的开发和生产环境中。
如果您正在寻找一个管理的Kubernetes托管服务,请查看我们的简单的,用于增长的管理的Kubernetes服务(https://www.digitalocean.com/products/kubernetes)。
前提条件
对于这个教程,你将需要:
若要在 DigitalOcean 上创建一个 Kubernetes 集群,请阅读我们的 Kubernetes Quickstart。 若要连接到集群,请阅读 如何连接到 DigitalOcean Kubernetes 集群。
kubectl
安装在您的本地机器上。 遵循 关于开始使用 Kubernetes 的本教程: Akubectl
Cheat Sheet 来安装它。
步骤 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
版本。
从您的终端,键入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.yml
和configmap.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
,查看您的网站的生产版本。
现在你正在使用 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)可以探索,如果你有兴趣了解更多。