介绍
在构建现代、无状态的应用程序时, 容器化应用程序的组件是部署和扩展在分布式平台上的第一步。
- 從您的代碼中提取必要的配置資訊
- 卸載您的應用程式的狀態
- 包裝您的應用程式以供重複使用
您还将有书面服务定义,说明您的容器图像应该如何运行。
要在像 Kubernetes这样的分布式平台上运行您的服务,您需要将您的 Compose 服务定义翻译成 Kubernetes 对象,这将使您能够 以弹性扩展您的应用程序 。
在本教程中,您将使用 kompose 将 Compose 服务翻译为 Kubernetes objects 您将使用 kompose 提供的对象定义作为起点,并进行调整,以确保您的设置将使用 Secrets, Services 和 PersistentVolumeClaims 以 Kubernetes 预期的方式。在教程结束时,您将有一个单个实例 Node.js 应用程序,并在 Kubernetes 集群上运行的 MongoDB 数据库。此设置将反映在 Containerizing a Nodejs Application with Docker Compose 中描述的代码功能
如果您正在寻找一个管理的Kubernetes托管服务,请查看我们的简单的,用于增长的管理的Kubernetes服务(https://www.digitalocean.com/products/kubernetes)。
前提条件
此设置将使用 DigitalOcean Kubernetes cluster,但您可以自由地 使用另一种方法创建一个集群)。
- 在您的本地机器或开发服务器上安装了
kubectl’命令行工具,并配置连接到您的集群。您可以在 [官方文档](https://kubernetes.io/docs/tasks/tools/install-kubectl/)中阅读有关安装
kubectl’ 的更多信息。 - Docker)安装在您的本地机器或开发服务器上。如果您正在与 Ubuntu 18.04 工作,请遵循 [如何在 Ubuntu 18.04 步骤上安装和使用 Docker]的步骤 1 和步骤 2(https://andsky.com/tech/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04);否则,请遵循
步骤1 - 安装组件
要开始使用 kompose,请导航到 项目的GitHub Releases页面,并复制当前版本的链接(本文版本 1.18.0)。
1curl -L https://github.com/kubernetes/kompose/releases/download/v1.18.0/kompose-linux-amd64 -o kompose
有关在非 Linux 系统上安装的详细信息,请参阅 安装说明。
使二进制可执行:
1chmod +x kompose
把它移动到你的路径
:
1sudo mv ./kompose /usr/local/bin/kompose
要验证它是否正确安装,您可以进行版本检查:
1kompose version
如果安装成功,您将看到如下输出:
1[secondary_label Output]
21.18.0 (06a2e56)
隨著「kompose」已安裝並準備使用,您現在可以克隆您將翻譯成 Kubernetes 的 Node.js 項目代碼。
步骤 2 – 克隆和包装应用程序
要使用我们的应用程序与Kubernetes,我们需要克隆项目代码并包装应用程序,以便kubelet
服务可以拉出图像。
我们的第一步是将 node-mongo-docker-dev 存储库从 DigitalOcean Community GitHub 帐户克隆。该存储库包括在 Containerizing a Node.js Application for Development With Docker Compose中描述的设置中的代码,该存储库使用 Node.js 演示应用程序来展示如何使用 Docker Compose 设置开发环境。
将存储库克隆成名为node_project
的目录:
1git clone https://github.com/do-community/node-mongo-docker-dev.git node_project
导航到node_project
目录:
1cd node_project
node_project
目录包含用于使用用户输入的鲨鱼信息应用程序的文件和目录,它已被现代化,以便与容器工作:敏感和特定的配置信息已从应用程序代码中删除,并重构为在运行时注入,并将应用程序的状态下载到MongoDB数据库。
有关设计现代、无状态的应用程序的更多信息,请参阅 Kubernetes 的应用程序架构和 Kubernetes 的应用程序现代化。
项目目录中包含一个Dockerfile
,包含构建应用程序图像的说明,让我们现在构建图像,以便您可以将其推到您的Docker Hub帐户并在您的Kubernetes设置中使用。
使用 docker build
命令,用 -t
旗帜构建图像,允许您用可记忆的名称标记图像,在这种情况下,用您的 Docker Hub 用户名标记图像,并将其命名为 node-kubernetes
或您自己的名字:
1docker build -t your_dockerhub_username/node-kubernetes .
命令中的 .
指定了构建背景是当前目录。
它需要一两分钟才能构建图像.一旦完成,请检查您的图像:
1docker images
您将看到以下结果:
1[secondary_label Output]
2REPOSITORY TAG IMAGE ID CREATED SIZE
3your_dockerhub_username/node-kubernetes latest 9c6f897e1fbc 3 seconds ago 90MB
4node 10-alpine 94f3c8956482 12 days ago 71MB
接下来,登录您在前提条件下创建的 Docker Hub 帐户:
1docker login -u your_dockerhub_username
当被提示时,请输入您的 Docker Hub 帐户密码. 以此方式登录将创建一个 ~/.docker/config.json
文件,在您的用户主目录中与您的 Docker Hub 凭证。
使用 docker push
命令将应用程序图像推到 Docker Hub。 请记住用自己的 Docker Hub 用户名替换 your_dockerhub_username
:
1docker push your_dockerhub_username/node-kubernetes
您现在有一个应用程序图像,您可以将其拉到运行您的应用程序与Kubernetes. 下一步将是将您的应用程序服务定义翻译为Kubernetes对象。
步骤 3 — 将复合服务翻译成 Kubernetes 对象
我们的 Docker Compose 文件,在这里称为 docker-compose.yaml
,列出了将使用 Compose 运行我们的服务的定义。 Compose 中的 service 是一个运行容器,而 service definitions 包含有关每个容器图像将如何运行的信息。
我们将使用这些文件创建不同类型的对象: 服务,这将确保运行我们的容器的 Pods仍然可用; 部署,这将包含关于我们Pod的所需状态的信息; 一个 PersistentVolumeClaim为我们的数据库提供存储; 一个 ConfigMap在运行时注入的环境变量; 和一个 秘密为我们的应用程序的数据库用户和密码。
首先,我们将需要修改我们的docker-compose.yaml
文件中的某些定义以便与Kubernetes合作。我们将在我们的nodejs
服务定义中包含我们新建的应用程序图像的引用,并删除我们使用的 bind mouts, volumes和额外的 命令来运行与Compose开发中的应用程序容器。
使用「nano」或您最喜歡的編輯器開啟檔案:
1nano docker-compose.yaml
nodejs
应用程序服务的当前定义是这样的:
1[label ~/node_project/docker-compose.yaml]
2...
3services:
4 nodejs:
5 build:
6 context: .
7 dockerfile: Dockerfile
8 image: nodejs
9 container_name: nodejs
10 restart: unless-stopped
11 env_file: .env
12 environment:
13 - MONGO_USERNAME=$MONGO_USERNAME
14 - MONGO_PASSWORD=$MONGO_PASSWORD
15 - MONGO_HOSTNAME=db
16 - MONGO_PORT=$MONGO_PORT
17 - MONGO_DB=$MONGO_DB
18 ports:
19 - "80:8080"
20 volumes:
21 - .:/home/node/app
22 - node_modules:/home/node/app/node_modules
23 networks:
24 - app-network
25 command: ./wait-for.sh db:27017 -- /home/node/app/node_modules/.bin/nodemon app.js
26...
对您的服务定义进行以下编辑:
- 使用您的「node-kubernetes」圖像,而不是本地的「Dockerfile」
- 將容器的「重新啟動」策略從「除非停止」改為「永遠」。
已完成的服务定义现在将是这样的:
1[label ~/node_project/docker-compose.yaml]
2...
3services:
4 nodejs:
5 image: your_dockerhub_username/node-kubernetes
6 container_name: nodejs
7 restart: always
8 env_file: .env
9 environment:
10 - MONGO_USERNAME=$MONGO_USERNAME
11 - MONGO_PASSWORD=$MONGO_PASSWORD
12 - MONGO_HOSTNAME=db
13 - MONGO_PORT=$MONGO_PORT
14 - MONGO_DB=$MONGO_DB
15 ports:
16 - "80:8080"
17 networks:
18 - app-network
19...
接下来,滚到db
服务定义,在这里进行以下编辑:
- 将服务的
重新启动
策略更改为始终
。 - 删除
.env
文件,而不是从.env
文件中使用值,我们将将我们的MONGO_INITDB_ROOT_USERNAME
和MONGO_INITDB_ROOT_PASSWORD
的值传输到使用我们在 步骤 4中创建的秘密
的数据库容器。
现在db
服务的定义将是这样的:
1[label ~/node_project/docker-compose.yaml]
2...
3 db:
4 image: mongo:4.1.8-xenial
5 container_name: db
6 restart: always
7 environment:
8 - MONGO_INITDB_ROOT_USERNAME=$MONGO_USERNAME
9 - MONGO_INITDB_ROOT_PASSWORD=$MONGO_PASSWORD
10 volumes:
11 - dbdata:/data/db
12 networks:
13 - app-network
14...
最后,在文件的底部,从顶级的卷
键中删除node_modules
的卷,这个键现在将看起来像这样:
1[label ~/node_project/docker-compose.yaml]
2...
3volumes:
4 dbdata:
保存并关闭文件,当你完成编辑。
在翻譯我們的服務定義之前,我們需要寫下「.env」檔案,該檔案將用來創建 ConfigMap 與我們的非敏感資訊. 請參閱 步驟 2的 Containerizing a Node.js Application for Development With Docker Compose的更多解釋。
在该教程中,我们添加了.env
到我们的.gitignore
文件,以确保它不会被复制到版本控制. 这意味着它没有被复制,当我们在本教程的第二步(https://andsky.com/tech/tutorials/how-to-migrate-a-docker-compose-workflow-to-kubernetes#step-2-%E2%80%94-cloning-and-packaging-the-application)中克隆了 node-mongo-docker-dev 存储库。
创建文件:
1nano .env
kompose 将使用此文件为我们的应用程序创建 ConfigMap. 但是,而不是在我们的 Compose 文件中分配从nodejs
服务定义的所有变量,我们只会添加MONGO_DB
数据库名称和MONGO_PORT
。
将以下端口和数据库名称信息添加到.dll 文件中. 如果您想要,请自由更名您的数据库:
1[label ~/node_project/.env]
2MONGO_PORT=27017
3MONGO_DB=sharkinfo
保存并关闭文件,当你完成编辑。
您现在已经准备好创建与您的对象规格的文件。 compose offers multiple options 用于翻译您的资源。
- 创建
yaml
文件,基于您的docker-compose.yaml
文件中的服务定义,使用kompose convert
- 直接创建 Kubernetes 对象,使用
kompose up
- 创建一个 Helm 图表,使用
kompose convert -c
目前,我们将服务定义转换为yaml
文件,然后添加和修改组合创建的文件。
用以下命令将服务定义转换为‘yaml’文件:
1kompose convert
您还可以使用-f
旗号命名特定或多个 Compose 文件。
运行此命令后,kompose 将输出有关它创建的文件的信息:
1[secondary_label Output]
2INFO Kubernetes file "nodejs-service.yaml" created
3INFO Kubernetes file "db-deployment.yaml" created
4INFO Kubernetes file "dbdata-persistentvolumeclaim.yaml" created
5INFO Kubernetes file "nodejs-deployment.yaml" created
6INFO Kubernetes file "nodejs-env-configmap.yaml" created
其中包括用于 Node 应用服务、部署和 ConfigMap 的 yaml
文件,以及 PersistentVolumeClaim 和 MongoDB 数据库部署的 dbdata
文件。
这些文件是一个很好的起点,但为了使我们的应用程序的功能符合在 Containerizing a Node.js Application for Development With Docker Compose中描述的设置,我们需要对构成文件产生一些添加和更改。
第4步:创建Kubernetes的秘密
为了使我们的应用程序以我们预期的方式运作,我们需要对构件创建的文件进行一些修改。 这些变化中的第一个将是为我们的数据库用户和密码生成一个秘密,并将其添加到我们的应用程序和数据库部署中。 Kubernetes提供两种工作方式与环境变量: ConfigMaps和秘密。
手动创建秘密的第一步是将您的用户名和密码转换为 base64,这是一种编码方案,允许您均匀传输数据,包括二进制数据。
转换您的数据库用户名:
1echo -n 'your_database_username' | base64
记下你在输出中看到的值。
接下来,转换您的密码:
1echo -n 'your_database_password' | base64
在这里也注意输出中的价值。
打开秘密的文件:
1nano secret.yaml
<$>[注]
注: Kubernetes 对象是 通常定义使用 YAML,这严格禁止卡,并需要两个空格来插入。如果您想检查任何yaml
文件的格式化,您可以使用 linter或使用cubectl create
来测试您的语法的有效性,使用dry-run
和validate
旗帜:
1kubectl create -f your_yaml_file.yaml --dry-run --validate=true
一般来说,在使用kubectl
创建资源之前,最好先验证语法
将以下代码添加到文件中,以创建一个秘密,该代码将使用您刚刚创建的编码值定义您的MONGO_USERNAME
和MONGO_PASSWORD
。
1[label ~/node_project/secret.yaml]
2apiVersion: v1
3kind: Secret
4metadata:
5 name: mongo-secret
6data:
7 MONGO_USERNAME: your_encoded_username
8 MONGO_PASSWORD: your_encoded_password
我们已经将秘密物体命名为蒙古秘密
,但你可以随意命名它。
当您完成编辑时,请保存并关闭此文件. 就像您在您的.env 文件中一样,请确保将 secret.yaml' 添加到您的
.gitignore' 文件中,以使其脱离版本控制。
隨著「secret.yaml」寫入,我們的下一步將是確保我們的應用程式和資料庫Pods都使用我們添加到檔案的值。
打开名为 'nodejs-deployment.yaml' 的文件:
1nano nodejs-deployment.yaml
文件的容器规格包括以下env
键下定义的环境变量:
1[label ~/node_project/nodejs-deployment.yaml]
2apiVersion: extensions/v1beta1
3kind: Deployment
4...
5 spec:
6 containers:
7 - env:
8 - name: MONGO_DB
9 valueFrom:
10 configMapKeyRef:
11 key: MONGO_DB
12 name: nodejs-env
13 - name: MONGO_HOSTNAME
14 value: db
15 - name: MONGO_PASSWORD
16 - name: MONGO_PORT
17 valueFrom:
18 configMapKeyRef:
19 key: MONGO_PORT
20 name: nodejs-env
21 - name: MONGO_USERNAME
我们将需要将我们的秘密添加到这里列出的MONGO_USERNAME
和MONGO_PASSWORD
变量中,以便我们的应用程序可以访问这些值。而不是添加一个configMapKeyRef
密钥,以指向我们的nodejs-env
ConfigMap,就像MONGO_DB
和MONGO_PORT
的值一样,我们会添加一个secretKeyRef
密钥,以指向我们的mongo-secret
秘密中的值。
将以下秘密引用添加到MONGO_USERNAME
和MONGO_PASSWORD
变量:
1[label ~/node_project/nodejs-deployment.yaml]
2apiVersion: extensions/v1beta1
3kind: Deployment
4...
5 spec:
6 containers:
7 - env:
8 - name: MONGO_DB
9 valueFrom:
10 configMapKeyRef:
11 key: MONGO_DB
12 name: nodejs-env
13 - name: MONGO_HOSTNAME
14 value: db
15 - name: MONGO_PASSWORD
16 valueFrom:
17 secretKeyRef:
18 name: mongo-secret
19 key: MONGO_PASSWORD
20 - name: MONGO_PORT
21 valueFrom:
22 configMapKeyRef:
23 key: MONGO_PORT
24 name: nodejs-env
25 - name: MONGO_USERNAME
26 valueFrom:
27 secretKeyRef:
28 name: mongo-secret
29 key: MONGO_USERNAME
保存并关闭文件,当你完成编辑。
接下来,我们将将相同的值添加到 db-deployment.yaml
文件中。
打开文件以编辑:
1nano db-deployment.yaml
在此文件中,我们将为以下变量键添加我们的秘密引用:MONGO_INITDB_ROOT_USERNAME
和MONGO_INITDB_ROOT_PASSWORD
。mongo
图像使这些变量可用,以便您可以修改数据库实例的初始化。
使用我们在我们的秘密中设置的值,确保我们在数据库实例中有一个具有 root
特权的应用程序用户,可以访问该角色的所有行政和操作特权。
在MONGO_INITDB_ROOT_USERNAME
和MONGO_INITDB_ROOT_PASSWORD
变量中,添加对秘密值的引用:
1[label ~/node_project/db-deployment.yaml]
2apiVersion: extensions/v1beta1
3kind: Deployment
4...
5 spec:
6 containers:
7 - env:
8 - name: MONGO_INITDB_ROOT_PASSWORD
9 valueFrom:
10 secretKeyRef:
11 name: mongo-secret
12 key: MONGO_PASSWORD
13 - name: MONGO_INITDB_ROOT_USERNAME
14 valueFrom:
15 secretKeyRef:
16 name: mongo-secret
17 key: MONGO_USERNAME
18 image: mongo:4.1.8-xenial
19...
保存并关闭文件,当你完成编辑。
有了您的秘密,您可以继续创建您的数据库服务,并确保您的应用程序容器只在完全设置和初始化后尝试连接到数据库。
步骤 5 — 创建数据库服务和应用程序Init容器
现在我们有了我们的秘密,我们可以创建我们的数据库服务和一个Init Container(https://kubernetes.io/docs/concepts/workloads/pods/init-containers/),该服务将进行调查,以确保我们的应用程序只尝试连接到数据库,一旦数据库启动任务完成,包括创建MONGO_INITDB
用户和密码。
有关如何在 Compose 中实现此功能的讨论,请参阅 步骤 4 中的 Containerizing a Node.js Application for Development with Docker Compose 。
打开一个文件来定义数据库服务的规格:
1nano db-service.yaml
将以下代码添加到文件中以定义服务:
1[label ~/node_project/db-service.yaml]
2apiVersion: v1
3kind: Service
4metadata:
5 annotations:
6 kompose.cmd: kompose convert
7 kompose.version: 1.18.0 (06a2e56)
8 creationTimestamp: null
9 labels:
10 io.kompose.service: db
11 name: db
12spec:
13 ports:
14 - port: 27017
15 targetPort: 27017
16 selector:
17 io.kompose.service: db
18status:
19 loadBalancer: {}
我们在这里列出的选择器
将匹配本服务对象与我们的数据库 Pods,这些数据库已被定义为io.kompose.service: db
在db-deployment.yaml
文件中组合。
保存并关闭文件,当你完成编辑。
接下来,让我们在nodejs-deployment.yaml
中添加一个Init集装箱字段到集装箱
系列中。这将创建一个Init集装箱,我们可以使用它来延迟我们的应用集装箱的启动,直到db
服务被创建成一个可访问的Pod。
打开nodejs-deployment.yaml
文件:
1nano nodejs-deployment.yaml
在Pod规格中和集装箱
数组旁边,我们将添加一个initContainers
字段,其中有一个集装箱将对db
服务进行调查。
在端口
和资源
字段下方,以及在nodejs``容器
系列中的重新启动Policy
字段上方添加以下代码:
1[label ~/node_project/nodejs-deployment.yaml]
2apiVersion: extensions/v1beta1
3kind: Deployment
4...
5 spec:
6 containers:
7 ...
8 name: nodejs
9 ports:
10 - containerPort: 8080
11 resources: {}
12 initContainers:
13 - name: init-db
14 image: busybox
15 command: ['sh', '-c', 'until nc -z db:27017; do echo waiting for db; sleep 2; done;']
16 restartPolicy: Always
17...
本 Init 容器使用了 BusyBox 图像,这是一个包含许多 UNIX 实用程序的轻量级图像,在这种情况下,我们将使用 netcat
实用程序来调查与 db
服务相关的 Pod 是否接受 TCP 连接在端口 `27017' 上。
此容器命令
复制了我们在 步骤 3中从我们的 docker-compose.yaml
文件中删除的 wish-for
脚本的功能。对于我们应用程序在使用 Compose 时如何以及为什么使用 wish-for
脚本的更长讨论,请参阅 步骤 4的 Containerizing a Node.js Application for Development with Docker Compose)。
Init 容器运行到完成;在我们的情况下,这意味着我们的 Node 应用容器不会启动,直到数据库容器运行并接受在端口 27017
上的连接. db
服务定义允许我们保证此功能,无论数据库容器的确切位置,这是可变的。
保存并关闭文件,当你完成编辑。
有了您的数据库服务创建,并且您的 Init 容器可控制您的容器的启动顺序,您可以继续检查 PersistentVolumeClaim 中的存储要求,并使用 LoadBalancer曝光您的应用程序服务。
步骤 6 – 更改持久 VolumeClaim 并暴露应用程序前端
在运行我们的应用程序之前,我们将做出两个最终的更改,以确保我们的数据库存储空间得到适当的配置,并且我们可以使用 LoadBalancer 曝光我们的应用程序前端。
首先,让我们修改为我们创建的 PersistentVolumeClaim 中定义的 storage
resource
这个声明允许我们 dynamically provision 存储来管理我们的应用程序的状态。
要使用 PersistentVolumeClaims,您必须创建并配置一个 StorageClass以提供存储资源. 在我们的情况下,因为我们正在使用 DigitalOcean Kubernetes,我们的默认 StorageClass provisioner
设置为 dobs.csi.digitalocean.com
- DigitalOcean Block Storage。
我们可以通过键入来检查:
1kubectl get storageclass
如果您正在使用 DigitalOcean 集群,您将看到以下输出:
1[secondary_label Output]
2NAME PROVISIONER AGE
3do-block-storage (default) dobs.csi.digitalocean.com 76m
如果您不使用 DigitalOcean 集群,则需要创建 StorageClass 并配置您所选择的供应商
。
当构件创建dbdata-persistentvolumeclaim.yaml
时,它将存储``资源
设置为不符合我们供应商
的最低尺寸要求的尺寸。
打开dbdata-persistentvolumeclaim.yaml
:
1nano dbdata-persistentvolumeclaim.yaml
将存储
值替换为1Gi
:
1[label ~/node_project/dbdata-persistentvolumeclaim.yaml]
2apiVersion: v1
3kind: PersistentVolumeClaim
4metadata:
5 creationTimestamp: null
6 labels:
7 io.kompose.service: dbdata
8 name: dbdata
9spec:
10 accessModes:
11 - ReadWriteOnce
12 resources:
13 requests:
14 storage: 1Gi
15status: {}
另外,请注意accessMode
:ReadWriteOnce
意味着本声明所提供的内容仅由单个节点进行读写。
保存并关闭文件,当你完成。
接下来,打开nodejs-service.yaml
:
1nano nodejs-service.yaml
我们将使用 DigitalOcean Load Balancer外部展示此服务。如果您不使用 DigitalOcean 集群,请参阅您的云提供商的相关文档,以获取其负载平衡器的信息。
在服务规格中,指定LoadBalancer
作为服务类型
:
1[label ~/node_project/nodejs-service.yaml]
2apiVersion: v1
3kind: Service
4...
5spec:
6 type: LoadBalancer
7 ports:
8...
当我们创建nodejs
服务时,将自动创建负载平衡器,为我们提供一个外部IP,我们可以访问我们的应用程序。
保存并关闭文件,当你完成编辑。
有了我们所有的文件,我们已经准备好启动和测试应用程序。
步骤 7 – 启动和访问应用程序
是时候创建我们的Kubernetes对象,并测试我们的应用程序是否按预期工作。
为了创建我们已经定义的对象,我们将使用 kubectl create
带有 -f
旗帜,这将允许我们指定为我们创建的构成文件,以及我们编写的文件。
1kubectl create -f nodejs-service.yaml,nodejs-deployment.yaml,nodejs-env-configmap.yaml,db-service.yaml,db-deployment.yaml,dbdata-persistentvolumeclaim.yaml,secret.yaml
您将看到以下输出,表示已创建对象:
1[secondary_label Output]
2service/nodejs created
3deployment.extensions/nodejs created
4configmap/nodejs-env created
5service/db created
6deployment.extensions/db created
7persistentvolumeclaim/dbdata created
8secret/mongo-secret created
要检查你的 Pods 是否正在运行,键入:
1kubectl get pods
您不需要在这里指定 Namespace,因为我们在默认
Namespace 中创建了我们的对象。
在您的「db」容器启动和您的Init Container应用程序运行时,您将看到以下输出:
1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3db-679d658576-kfpsl 0/1 ContainerCreating 0 10s
4nodejs-6b9585dc8b-pnsws 0/1 Init:0/1 0 10s
一旦该容器运行,您的应用程序和数据库容器启动,您将看到此输出:
1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3db-679d658576-kfpsl 1/1 Running 0 54s
4nodejs-6b9585dc8b-pnsws 1/1 Running 0 54s
运行
状态
表示您的 Pod 绑定到节点,并且与这些 Pod 相关的容器正在运行。
<$>[注]
注:
如果您在状态
列中看到意想不到的阶段,请记住,您可以使用以下命令来解决您的Pod:
1kubectl describe pods your_pod
2kubectl logs your_pod
美元
当您的容器运行时,您现在可以访问应用程序. 要获取 LoadBalancer 的 IP,键入:
1kubectl get svc
您将看到以下结果:
1[secondary_label Output]
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3db ClusterIP 10.245.189.250 <none> 27017/TCP 93s
4kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 25m12s
5nodejs LoadBalancer 10.245.15.56 your_lb_ip 80:30729/TCP 93s
与nodejs
服务相关联的EXTERNAL_IP
是您可以访问应用程序的IP地址,如果您在EXTERNAL_IP
列中看到<pending>
状态,则意味着您的负载平衡器仍在创建中。
一旦你在该列中看到一个IP,在你的浏览器中导航到它: http://your_lb_ip
。
你应该看到下面的登陆页面:
点击获取鲨鱼信息
按钮,您将看到一个页面,其中可以输入鲨鱼的名称和鲨鱼的一般性质描述:
在表格中,添加您所选择的鲨鱼。 为了示范,我们将Megalodon Shark
添加到 Shark Name字段,并将Ancient
添加到 Shark Character字段:
点击提交
按钮,您将看到一个页面,其中有这些鲨鱼信息向您显示:
您现在有一个单个实例设置 Node.js 应用程序与运行在 Kubernetes 集群上的 MongoDB 数据库。
结论
您在本教程中创建的文件是一个很好的起点,当您向生产前进时,您可以建立一个良好的起点。
- ** 集中伐木和监测**。 请参看[更新Kubernetes的应用程序(https://andsky.com/tech/tutorials/modernizing-applications-for-kubernetes)中的相关讨论,以了解概况。 也可以研究[如何在Kubernetes上设置弹性搜索、流利和基巴纳(EFK)记录堆栈(https://andsky.com/tech/tutorials/how-to-set-up-an-elasticsearch-fluentd-and-kibana-efk-logging-stack-on-kubernetes),以学习如何用弹性搜索、流利地和Kibana设置伐木堆栈。 另请检查服务网点介绍,了解Istio等服务网点如何实施此功能。 () ( )* ** 入侵资源通往您的集群**。 这在您正在运行多个服务时(每个服务都需要自己的LoadBalancer),或者您想要实施应用级的路由策略(例如A/B & 金丝雀测试)的情况下,是一个很好的替代品. 欲了解更多信息,请查看DigitalOcean Kubernetes上的Nginx Engress与Cert-Manager一起设置一个Nginx Engress,以及服务Meshes介绍中服务网上路由的相关讨论*。 ** Kubernetes对象的备份策略**。 关于使用DigitalOcean的Kubernetes产品Verero(原为Heptio Ark)实施备份的指导意见,请参见[How To back up and recover a Kubernetes Cluster on DigitalOcean Upping Heptio Ark] (https://andsky.com/tech/tutorials/how-to-back-up-and-restore-a-kubernetes-cluster-on-digitalocean-using-heptio-ark). (). (英语)