如何迁移Docker将工作流迁移到Kubernetes

本教程将向您展示如何使用kompose将Docker Compose工作流迁移到Kubernetes。首先,在Kubernetes集群上使用MongoDB数据库为Node.js应用程序创建单实例设置。然后,您将扩展此设置以包括应用程序和数据库的多个副本。

介绍

在构建现代无状态应用程序时, 将应用程序的组件容纳在容器中是在分布式平台上进行部署和扩展的第一步。 如果您在开发中使用了Docker Compose ,您将通过以下方式对应用程序进行现代化和容器化:

  • 从代码中提取必要的配置信息。
  • 卸载应用程序的状态。
  • 打包您的应用程序以重复使用。

您还将拥有书面服务定义,用于指定容器映像的运行方式。

要在像Kubernetes这样的分布式平台上运行服务,您需要将Compose服务定义转换为Kubernetes对象。 这将允许您使用弹性扩展应用程序 可以加快Kubernetes转换过程的一个工具是kompose ,这是一个转换工具,可以帮助开发人员将Compose工作流程移动到像Kubernetes或OpenShift这样的容器协调器。

在本教程中,您将使用kompose将Compose服务转换为Kubernetes 对象 您将使用kompose提供的对象定义作为起点并进行调整,以确保您的设置将以Kubernetes期望的方式使用SecretsServicesPersistentVolumeClaims 在本教程结束时,您将拥有一个单实例Node.js应用程序,其中包含在Kubernetes集群上运行的MongoDB数据库。 此设置将反映使用Docker Compose容纳Node.js应用程序中描述的代码的功能,并且将是构建可根据您的需求扩展的生产就绪解决方案的良好起点。

先决条件

  • 启用了基于角色的访问控制(RBAC)的Kubernetes 1.10+集群。 此设置将使用DigitalOcean Kubernetes群集 ,但您可以使用其他方法自由创建群集
  • kubectl命令行工具安装在本地计算机或开发服务器上,并配置为连接到您的群集。 您可以在官方文档中阅读有关安装kubectl更多信息。
  • Docker安装在本地计算机或开发服务器上。 如果您正在使用Ubuntu 18.04,请按照如何在Ubuntu 18.04上安装和使用Docker的第1步和2进行操作; 否则,请按照官方文档获取有关在其他操作系统上安装的信息。 请确保将非root用户添加到docker组,如链接教程的第2步中所述。
  • Docker Hub帐户。 有关如何进行此设置的概述,请参阅Docker Hub的介绍

第1步 - 安装kompose

要开始使用kompose,请导航到项目的GitHub Releases页面 ,并将链接复制到当前版本(撰写本文时版本为1.18.0 )。 将此链接粘贴到以下curl命令中以下载最新版本的kompose:

curl -L https://github.com/kubernetes/kompose/releases/download/v1.18.0/kompose-linux-amd64 -o kompose

有关在非Linux系统上安装的详细信息,请参阅安装说明

使二进制可执行文件:

chmod +x kompose

将它移到你的PATH

sudo mv ./kompose /usr/local/bin/kompose

要验证它是否已正确安装,您可以进行版本检查:

kompose version

如果安装成功,您将看到如下输出:

1.18.0 (06a2e56)

安装kompose并准备使用后,您现在可以克隆要转换为Kubernetes的Node.js项目代码。

第2步 - 克隆和打包应用程序

要将我们的应用程序与Kubernetes一起使用,我们需要克隆项目代码并打包应用程序,以便kubelet服务可以提取图像。

我们的第一步是从DigitalOcean社区GitHub帐户克隆node-mongo-docker-dev存储库 此存储库包含使用Docker Compose容纳Node.js开发应用程序中描述的设置中的代码,该应用程序使用演示Node.js应用程序演示如何使用Docker Compose设置开发环境。 您可以在从容器到带有Node.js的Kubernetes系列中找到有关应用程序本身的更多信息。

将存储node_project到名为node_project的目录中:

git clone https://github.com/do-community/node-mongo-docker-dev.git node_project

导航到node_project目录:

cd node_project

node_project目录包含与用户输入一起使用的shark信息应用程序的文件和目录。 它已经过现代化以处理容器:敏感和特定的配置信息已从应用程序代码中删除并重构为在运行时注入,并且应用程序的状态已卸载到MongoDB数据库。

有关设计现代无状态应用程序的更多信息,请参阅为Kubernetes构建 应用程序为Kubernetes 现代化应用程序

项目目录包括一个Dockerfile ,其中包含构建应用程序映像的说明。 现在让我们构建映像,以便您可以将其推送到Docker Hub帐户并在Kubernetes设置中使用它。

使用docker build命令,使用-t标志构建映像,允许您使用令人难忘的名称对其进行标记。 在这种情况下,使用Docker Hub用户名标记图像,并将其命名为node-kubernetes或您自己选择的名称:

docker build -t your_dockerhub_username/node-kubernetes .

. 在命令中指定构建上下文是当前目录。

构建图像需要一两分钟。 完成后,检查您的图片:

docker images

您将看到以下输出:

REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
your_dockerhub_username/node-kubernetes   latest              9c6f897e1fbc        3 seconds ago       90MB
node                                      10-alpine           94f3c8956482        12 days ago         71MB

接下来,登录您在先决条件中创建的Docker Hub帐户:

docker login -u your_dockerhub_username 

出现提示时,输入您的Docker Hub帐户密码。 以这种方式登录将使用您的Docker Hub凭据在用户的主目录中创建~/.docker/config.json文件。

使用docker push命令将应用程序映像推送到Docker Hub。 请记住将your_dockerhub_username替换为您自己的Docker Hub用户名:

docker push your_dockerhub_username/node-kubernetes

您现在有一个应用程序映像,您可以使用Kubernetes来运行您的应用程序。 下一步是将您的应用程序服务定义转换为Kubernetes对象。

第3步 - 使用kompose将撰写服务转换为Kubernetes对象

我们的Docker Compose文件(此处称为docker-compose.yaml )列出了将使用Compose运行我们的服务的定义。 Compose中的服务是一个正在运行的容器, 服务定义包含有关每个容器映像将如何运行的信息。 在此步骤中,我们将使用kompose将这些定义转换为Kubernetes对象以创建yaml文件。 这些文件将包含描述其所需状态的Kubernetes对象的规范

我们将使用这些文件来创建不同类型的对象: 服务 ,这将确保运行我们容器的Pod仍然可访问; 部署 ,其中包含有关我们Pod的所需状态的信息; PersistentVolumeClaim为我们的数据库数据配置存储; 在运行时注入的环境变量的ConfigMap ; 和我们的应用程序的数据库用户和密码的秘密 其中一些定义将在我们为我们创建的文件中,以及我们自己需要创建的其他文件中。

首先,我们需要修改docker-compose.yaml文件中的一些定义以与Kubernetes一起使用。 我们将在nodejs服务定义中包含对新构建的应用程序映像的引用,并删除我们用于在开发过程中使用Compose运行应用程序容器的绑定装入和其他命令 此外,我们将重新定义两个容器的重启策略,以符合Kubernetes预期的行为

使用nano或您喜欢的编辑器打开文件:

nano docker-compose.yaml

nodejs应用程序服务的当前定义如下所示:

〜/ node_project /搬运工-compose.yaml
...
services:
  nodejs:
    build:
      context: .
      dockerfile: Dockerfile
    image: nodejs
    container_name: nodejs
    restart: unless-stopped
    env_file: .env
    environment:
      - MONGO_USERNAME=$MONGO_USERNAME
      - MONGO_PASSWORD=$MONGO_PASSWORD
      - MONGO_HOSTNAME=db
      - MONGO_PORT=$MONGO_PORT
      - MONGO_DB=$MONGO_DB 
    ports:
      - "80:8080"
    volumes:
      - .:/home/node/app
      - node_modules:/home/node/app/node_modules
    networks:
      - app-network
    command: ./wait-for.sh db:27017 -- /home/node/app/node_modules/.bin/nodemon app.js
...

对服务定义进行以下编辑:

  • 使用node-kubernetes映像而不是本地Dockerfile
  • 将容器restart策略从unless-stopped更改为always
  • 删除volumes列表和command指令。

完成的服务定义现在看起来像这样:

〜/ node_project /搬运工-compose.yaml
...
services:
  nodejs:
    image: your_dockerhub_username/node-kubernetes
    container_name: nodejs
    restart: always
    env_file: .env
    environment:
      - MONGO_USERNAME=$MONGO_USERNAME
      - MONGO_PASSWORD=$MONGO_PASSWORD
      - MONGO_HOSTNAME=db
      - MONGO_PORT=$MONGO_PORT
      - MONGO_DB=$MONGO_DB 
    ports:
      - "80:8080"
    networks:
      - app-network
...

接下来,向下滚动到db服务定义。 在此处,将服务的restart策略更改为always并删除.env文件。 我们将使用我们将在第4步中创建的秘密将MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD的值传递给数据库容器,而不是使用.env文件中的值。

db服务定义现在看起来像这样:

〜/ node_project /搬运工-compose.yaml
...
  db:
    image: mongo:4.1.8-xenial
    container_name: db
    restart: always
    environment:
      - MONGO_INITDB_ROOT_USERNAME=$MONGO_USERNAME
      - MONGO_INITDB_ROOT_PASSWORD=$MONGO_PASSWORD
    volumes:  
      - dbdata:/data/db   
    networks:
      - app-network
...  

最后,在文件的底部,从顶级volumes密钥中删除node_modules卷。 密钥现在看起来像这样:

〜/ node_project /搬运工-compose.yaml
...
volumes:
  dbdata:

完成编辑后保存并关闭文件。

在翻译我们的服务定义之前,我们需要编写.env文件,该文件将用于创建具有非敏感信息的ConfigMap。 请参阅使用Docker Compose容纳Node.js开发应用程序的 第2步 ,以获得有关此文件的更长说明。

在该教程中,我们将.env添加到我们的.gitignore文件中,以确保它不会复制到版本控制。 这意味着当我们克隆本教程的第2步中node-mongo-docker-dev存储库时,它没有复制。 因此,我们现在需要重新创建它。

创建文件:

nano .env

kompose将使用此文件为我们的应用程序创建ConfigMap。 但是,我们将只添加MONGO_DB数据库名称和MONGO_PORT ,而不是从Compose文件中的nodejs服务定义中分配所有变量。 第4步中手动创建Secret对象时,我们将分别分配数据库用户名和密码。

将以下端口和数据库名称信息添加到.env文件中。 如果您愿意,可以随意重命名您的数据库:

〜/ node_project / .ENV
MONGO_PORT=27017
MONGO_DB=sharkinfo

完成编辑后保存并关闭文件。

您现在可以使用对象规范创建文件了。 kompose提供多种翻译资源的选项 您可以:

  • 使用kompose convertkompose convert docker-compose.yaml文件中的服务定义创建yaml文件。
  • 直接用kompose up创建Kubernetes对象。
  • 使用kompose convert -c创建一个Helm图表。

现在,我们将服务定义转换为yaml文件,然后添加并修改kompose创建的文件。

使用以下命令将服务定义转换为yaml文件:

kompose convert

您还可以使用-f标志命名特定或多个Compose文件。

运行此命令后,kompose将输出有关其创建的文件的信息:

INFO Kubernetes file "nodejs-service.yaml" created 
INFO Kubernetes file "db-deployment.yaml" created 
INFO Kubernetes file "dbdata-persistentvolumeclaim.yaml" created 
INFO Kubernetes file "nodejs-deployment.yaml" created 
INFO Kubernetes file "nodejs-env-configmap.yaml" created 

其中包括具有Node应用程序服务,部署和ConfigMap规范的yaml文件,以及dbdata PersistentVolumeClaim和MongoDB数据库部署。

这些文件是一个很好的起点,但是为了使我们的应用程序的功能与使用Docker Compose容纳Node.js开发应用程序中描述的设置相匹配,我们需要对kompose生成的文件进行一些添加和更改。

第4步 - 创建Kubernetes秘密

为了使我们的应用程序以我们期望的方式运行,我们需要对kompose创建的文件进行一些修改。 这些更改中的第一个将为我们的数据库用户和密码生成一个Secret,并将其添加到我们的应用程序和数据库部署中。 Kubernetes提供了两种使用环境变量的方法:ConfigMaps和Secrets。 kompose已经使用我们的.env文件中包含的非机密信息创建了一个ConfigMap,因此我们现在将使用我们的机密信息创建一个Secret:我们的数据库用户名和密码。

手动创建机密的第一步是将您的用户名和密码转换为base64 ,这是一种允许您统一传输数据的编码方案,包括二进制数据。

转换数据库用户名:

echo -n 'your_database_username' | base64

记下您在输出中看到的值。

接下来,转换您的密码:

echo -n 'your_database_password' | base64

请注意此处输出中的值。

打开秘密文件:

nano secret.yaml

注意: Kubernetes对象通常使用YAML 定义YAML严格禁止制表符并且需要两个空格来缩进。 如果您想检查任何yaml文件的格式,可以使用kubectl create或使用kubectl create使用--dry-run--validate标志测试语法的有效性:

kubectl create -f your_yaml_file.yaml --dry-run --validate=true

通常,在使用kubectl创建资源之前验证语法是个好主意。

将以下代码添加到文件中以创建一个Secret,它将使用您刚刚创建的编码值定义MONGO_USERNAMEMONGO_PASSWORD 请务必使用您编码的用户名和密码替换虚拟值:

〜/ node_project / secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mongo-secret
data:
  MONGO_USERNAME: your_encoded_username
  MONGO_PASSWORD: your_encoded_password

我们将秘密对象命名为mongo-secret ,但您可以随意命名它。

完成编辑后,保存并关闭此文件。 正如您对.env文件所做的那样,请务必将secret.yaml添加到.gitignore文件中,以使其不受版本控制。

编写secret.yaml ,我们的下一步将是确保我们的应用程序和数据库Pod都使用我们添加到文件中的值。 让我们首先在我们的应用程序部署中添加对Secret的引用。

打开名为nodejs-deployment.yaml的文件:

nano nodejs-deployment.yaml

文件的容器规范包括在env键下定义的以下环境变量:

〜/ node_project /的NodeJS-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
...
    spec:
      containers:
      - env:
        - name: MONGO_DB
          valueFrom:
            configMapKeyRef:
              key: MONGO_DB
              name: nodejs-env
        - name: MONGO_HOSTNAME
          value: db
        - name: MONGO_PASSWORD
        - name: MONGO_PORT
          valueFrom:
            configMapKeyRef:
              key: MONGO_PORT
              name: nodejs-env
        - name: MONGO_USERNAME

我们需要将对Secret的引用添加到此处列出的MONGO_USERNAMEMONGO_PASSWORD变量中,以便我们的应用程序可以访问这些值。 MONGO_DBMONGO_PORT的值MONGO_PORT ,我们将包含一个secretKeyRef键来指向我们的mongo-secret秘密中的值,而不是包含一个指向我们的nodejs-env ConfigMap的configMapKeyRef键。

将以下秘密引用添加到MONGO_USERNAMEMONGO_PASSWORD变量:

〜/ node_project /的NodeJS-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
...
    spec:
      containers:
      - env:
        - name: MONGO_DB
          valueFrom:
            configMapKeyRef:
              key: MONGO_DB
              name: nodejs-env
        - name: MONGO_HOSTNAME
          value: db
        - name: MONGO_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mongo-secret
              key: MONGO_PASSWORD
        - name: MONGO_PORT
          valueFrom:
            configMapKeyRef:
              key: MONGO_PORT
              name: nodejs-env
        - name: MONGO_USERNAME
          valueFrom:
            secretKeyRef:
              name: mongo-secret
              key: MONGO_USERNAME

完成编辑后保存并关闭文件。

接下来,我们将向db-deployment.yaml文件添加相同的值。

打开文件进行编辑:

nano db-deployment.yaml

在这个文件中,我们将添加对我们的秘密的引用,用于跟随变量键: MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD mongo映像使这些变量可用,以便您可以修改数据库实例的初始化。 MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD一起在admin身份验证数据库中创建root用户,并确保在数据库容器启动时启用身份验证。

使用我们在Secret中设置的值可确保我们在数据库实例上拥有具有root权限的应用程序用户,并可访问该角色的所有管理和操作权限。 在生产中工作时,您将需要创建具有适当范围特权的专用应用程序用户。

MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD变量下,添加对Secret值的引用:

〜/ node_project / DB-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
...
    spec:
      containers:
      - env:
        - name: MONGO_INITDB_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mongo-secret
              key: MONGO_PASSWORD        
        - name: MONGO_INITDB_ROOT_USERNAME
          valueFrom:
            secretKeyRef:
              name: mongo-secret
              key: MONGO_USERNAME
        image: mongo:4.1.8-xenial
...

完成编辑后保存并关闭文件。

有了Secret,您可以继续创建数据库服务,并确保应用程序容器只有在完全设置和初始化后才会尝试连接到数据库。

第5步 - 创建数据库服务和应用程序初始化容器

现在我们已经拥有了我们的秘密,我们可以继续创建我们的数据库服务和一个Init容器 ,它将轮询此服务以确保我们的应用程序只在数据库启动任务时尝试连接到数据库,包括创建MONGO_INITDB用户和密码,完成了。

有关如何在Compose中实现此功能的讨论,请参阅使用Docker Compose将Node.js应用程序容纳为开发的 第4步

打开文件以定义数据库服务的规范:

nano db-service.yaml  

将以下代码添加到文件中以定义服务:

〜/ node_project / DB-service.yaml
apiVersion: v1
kind: Service
metadata:
  annotations: 
    kompose.cmd: kompose convert
    kompose.version: 1.18.0 (06a2e56)
  creationTimestamp: null
  labels:
    io.kompose.service: db
  name: db
spec:
  ports:
  - port: 27017
    targetPort: 27017
  selector:
    io.kompose.service: db
status:
  loadBalancer: {}

我们在此处包含的selector将此Service对象与我们的数据库io.kompose.service: db匹配,这些数据库已在db-deployment.yaml文件中使用标签io.kompose.service: db by kompose定义。 我们还命名了这个服务db

完成编辑后保存并关闭文件。

接下来,让我们在nodejs-deployment.yamlcontainers数组中添加一个Init Container字段。 这将创建一个Init容器,我们可以使用它来延迟我们的应用程序容器启动,直到使用可访问的Pod创建db Service。 这是Init Containers的可能用途之一; 要了解有关其他用例的更多信息,请参阅官方文档

打开nodejs-deployment.yaml文件:

nano nodejs-deployment.yaml

在Pod规范中以及containers数组旁边,我们将添加一个initContainers字段,其中包含一个将轮询db服务的容器。

portsresources字段下方以及nodejs containers数组中的restartPolicy上方添加以下代码:

〜/ node_project /的NodeJS-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
...
    spec:
      containers:
      ...
        name: nodejs
        ports:
        - containerPort: 8080
        resources: {}
      initContainers:
      - name: init-db
        image: busybox
        command: ['sh', '-c', 'until nc -z db:27017; do echo waiting for db; sleep 2; done;']
      restartPolicy: Always
...               

此Init容器使用BusyBox映像 ,这是一个包含许多UNIX实用程序的轻量级映像。 在这种情况下,我们将使用netcat实用程序来轮询与db服务关联的Pod是否正在接受端口27017上的TCP连接。

此容器command复制我们在第3步中docker-compose.yaml文件中删除的wait-for脚本的功能。 有关我们的应用程序在使用Compose时如何以及为何使用wait-for脚本的更长时间的讨论,请参阅使用Docker Compose将Node.js应用程序包含容器中的 第4步

初始容器运行完成; 在我们的例子中,这意味着我们的Node应用程序容器在数据库容器运行并接受端口27017上的连接之前不会启动。 db Service定义允许我们保证此功能,而不管数据库容器的确切位置是多么可变。

完成编辑后保存并关闭文件。

创建数据库服务并使用Init容器控制容器的启动顺序后,您可以继续检查PersistentVolumeClaim中的存储要求并使用LoadBalancer公开应用程序服务。

第6步 - 修改PersistentVolumeClaim并公开应用程序前端

在运行我们的应用程序之前,我们将进行两次最终更改,以确保我们的数据库存储将正确配置,并且我们可以使用LoadBalancer公开我们的应用程序前端。

首先,让我们修改为我们创建的PersistentVolumeClaim中定义的storage resource 此声明允许我们动态配置存储以管理应用程序的状态。

要使用PersistentVolumeClaims,必须创建并配置StorageClass以配置存储资源。 在我们的例子中,因为我们正在使用DigitalOcean Kubernetes ,我们的默认StorageClass provisioner器设置为dobs.csi.digitalocean.com - DigitalOcean Block Storage

我们可以输入以下内容来检查:

kubectl get storageclass

如果您正在使用DigitalOcean群集,您将看到以下输出:

NAME                         PROVISIONER                 AGE
do-block-storage (default)   dobs.csi.digitalocean.com   76m

如果您不使用DigitalOcean集群,则需要创建StorageClass并配置您选择的配置器。 有关如何执行此操作的详细信息,请参阅官方文档

当kompose创建dbdata-persistentvolumeclaim.yaml ,它会将storage resource设置为不符合我们的provisioner的最小大小要求的大小。 因此,我们需要修改PersistentVolumeClaim以使用最小可行的DigitalOcean块存储单元 :1GB。 请随意修改以满足您的存储要求。

打开dbdata-persistentvolumeclaim.yaml

nano dbdata-persistentvolumeclaim.yaml

1Gi替换storage值:

〜/ node_project / dbdata-persistentvolumeclaim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: dbdata
  name: dbdata
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
status: {}

另请注意accessModeReadWriteOnce表示由于此声明而配置的卷只能由单个节点读写。 有关不同访问模式的更多信息,请参阅文档

完成后保存并关闭文件。

接下来,打开nodejs-service.yaml

nano nodejs-service.yaml

我们将使用DigitalOcean Load Balancer在外部公开此服务。 如果您未使用DigitalOcean群集,请参阅云提供商提供的相关文档,以获取有关其负载均衡器的信息。 或者,您可以按照关于使用kubeadm设置高可用性群集的官方Kubernetes文档进行kubeadm ,但在这种情况下,您将无法使用PersistentVolumeClaims来配置存储。

在服务规范中,将LoadBalancer指定为服务type

〜/ node_project /的NodeJS-service.yaml
apiVersion: v1
kind: Service
...
spec:
  type: LoadBalancer
  ports:
...

当我们创建nodejs服务时,将自动创建一个负载均衡器,为我们提供一个外部IP,我们可以访问我们的应用程序。

完成编辑后保存并关闭文件。

有了我们所有的文件,我们就可以开始测试应用程序了。

第7步 - 启动和访问应用程序

是时候创建我们的Kubernetes对象并测试我们的应用程序是否按预期工作。

要创建我们定义的对象,我们将使用带有-f标志的kubectl create ,这将允许我们指定为我们创建的文件以及我们编写的文件。 运行以下命令以创建Node应用程序和MongoDB数据库服务和部署,以及Secret,ConfigMap和PersistentVolumeClaim:

kubectl create -f nodejs-service.yaml,nodejs-deployment.yaml,nodejs-env-configmap.yaml,db-service.yaml,db-deployment.yaml,dbdata-persistentvolumeclaim.yaml,secret.yaml

您将看到以下输出,指示已创建对象:

service/nodejs created
deployment.extensions/nodejs created
configmap/nodejs-env created
service/db created
deployment.extensions/db created
persistentvolumeclaim/dbdata created
secret/mongo-secret created

要检查您的Pod是否正在运行,请键入:

kubectl get pods

您不需要在此处指定命名空间 ,因为我们已在default命名空间中创建了对象。 如果使用多个命名空间,请确保在运行此命令时包含-n标志以及命名空间的名称。

db容器启动并且应用程序Init Container正在运行时,您将看到以下输出:

NAME                      READY   STATUS              RESTARTS   AGE
db-679d658576-kfpsl       0/1     ContainerCreating   0          10s
nodejs-6b9585dc8b-pnsws   0/1     Init:0/1            0          10s

一旦该容器运行并且您的应用程序和数据库容器已启动,您将看到此输出:

NAME                      READY   STATUS    RESTARTS   AGE
db-679d658576-kfpsl       1/1     Running   0          54s
nodejs-6b9585dc8b-pnsws   1/1     Running   0          54s

Running STATUS表示您的Pod绑定到节点,并且与这些Pod关联的容器正在运行。 READY表示Pod中正在运行的容器数量。 有关更多信息,请参阅Pod生命周期文档

注意: 如果您在STATUS列中看到意外的阶段,请记住您可以使用以下命令对Pod进行故障排除:

kubectl describe pods your_pod
kubectl logs your_pod

随着容器的运行,您现在可以访问该应用程序。 要获取LoadBalancer的IP,请键入:

kubectl get svc

您将看到以下输出:

NAME         TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGE
db           ClusterIP      10.245.189.250   <none>           27017/TCP      93s
kubernetes   ClusterIP      10.245.0.1       <none>           443/TCP        25m12s
nodejs       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字段,将AncientShark Character字段:

填充鲨鱼表格

单击“ 提交”按钮。 您将看到一个显示此鲨鱼信息的页面:

鲨鱼输出

您现在拥有一个Node.js应用程序的单实例设置,其中一个MongoDB数据库在Kubernetes集群上运行。

结论

您在本教程中创建的文件是一个很好的起点,可以在您转向生产时进行构建。 在开发应用程序时,您可以开始实现以下内容: