部署到 Kubernetes

先决条件

  • 获取 Docker 中所述,下载并安装 Docker Desktop。
  • 完成 第 2 部分 中的应用程序容器化。
  • 确保 Docker Desktop 中启用了 Kubernetes:如果 Kubernetes 未运行,请按照 编排 中的说明完成设置。

介绍

既然您已经证明应用程序的各个组件可以作为独立容器运行,那么现在该安排它们由 Kubernetes 之类的编排器进行管理了。Kubernetes 提供了许多工具来扩展、联网、保护和维护您的容器化应用程序,这些工具远远超出了容器本身的功能。

为了验证您的容器化应用程序在 Kubernetes 上运行良好,您将在开发机器上使用 Docker Desktop 的内置 Kubernetes 环境部署应用程序,然后再将其移交给生产环境中的完整 Kubernetes 集群运行。Docker Desktop 创建的 Kubernetes 环境是功能齐全的,这意味着它具有您的应用程序在真实集群上享受的所有 Kubernetes 功能,可以从开发机器的便利位置访问。

使用 Kubernetes YAML 描述应用程序

Kubernetes 中的所有容器都作为 Pod 进行调度,Pod 是共享一些资源的同地容器组。此外,在实际应用程序中,您几乎从未创建单独的 Pod。相反,大多数工作负载都作为部署进行调度,部署是由 Kubernetes 自动维护的可扩展 Pod 组。最后,所有 Kubernetes 对象都可以并且应该在称为 Kubernetes YAML 文件的清单中进行描述。这些 YAML 文件描述了您的 Kubernetes 应用程序的所有组件和配置,可用于在任何 Kubernetes 环境中创建和销毁您的应用程序。

您已经在本教程的编排概述部分中编写了一个基本的 Kubernetes YAML 文件。现在,您可以编写一个稍微复杂的 YAML 文件来运行和管理您的 Todo 应用程序,该应用程序是在本快速入门教程的 第 2 部分 中创建的容器 getting-started 镜像。将以下内容放在名为 bb.yaml 的文件中

apiVersion: apps/v1
kind: Deployment
metadata:
   name: bb-demo
   namespace: default
spec:
   replicas: 1
   selector:
      matchLabels:
         bb: web
   template:
      metadata:
         labels:
            bb: web
      spec:
         containers:
            - name: bb-site
              image: getting-started
              imagePullPolicy: Never
---
apiVersion: v1
kind: Service
metadata:
   name: bb-entrypoint
   namespace: default
spec:
   type: NodePort
   selector:
      bb: web
   ports:
      - port: 3000
        targetPort: 3000
        nodePort: 30001

在这个 Kubernetes YAML 文件中,有两个对象,由 --- 分隔

  • 一个 Deployment,描述一组可扩展的相同 Pod。在这种情况下,您将获得一个 replica,即 Pod 的副本,而该 Pod(在 template: 键下描述)只有一个容器,该容器基于您在上一步中使用的 getting-started 镜像。
  • 一个 NodePort 服务,它将主机上的端口 30001 上的流量路由到 Pod 内部的端口 3000,使您可以从网络访问您的 Todo 应用程序。

此外,请注意,虽然 Kubernetes YAML 乍看起来很长很复杂,但它几乎总是遵循相同的模式

  • apiVersion,它指示解析此对象的 Kubernetes API
  • kind,指示此对象的类型
  • 一些 metadata,用于将名称应用于您的对象
  • spec,指定对象的全部参数和配置。

部署和检查您的应用程序

  1. 在终端中,导航到创建 bb.yaml 的位置,并将您的应用程序部署到 Kubernetes

    $ kubectl apply -f bb.yaml
    

    您应该看到类似于以下内容的输出,表明您的 Kubernetes 对象已成功创建

    deployment.apps/bb-demo created
    service/bb-entrypoint created
  2. 通过列出您的部署来确保一切正常

    $ kubectl get deployments
    

    如果一切顺利,您的部署应如下所示

    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    bb-demo   1/1     1            1           40s

    这表明您在 YAML 中请求的所有一个 Pod 都已启动并正在运行。对您的服务执行相同的检查

    $ kubectl get services
    
    NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    bb-entrypoint   NodePort    10.106.145.116   <none>        3000:30001/TCP   53s
    kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP          138d
    

    除了默认的 kubernetes 服务外,我们还看到了我们的 bb-entrypoint 服务,它在端口 30001/TCP 上接受流量。

  3. 打开浏览器并访问您的 Todo 应用程序,地址为 localhost:30001。您应该看到您的 Todo 应用程序,与您在教程的 第 2 部分 中将其作为独立容器运行时一样。

  4. 一旦满意,请拆除您的应用程序

    $ kubectl delete -f bb.yaml
    

结论

至此,您已成功使用 Docker Desktop 将应用程序部署到开发机器上的功能齐全的 Kubernetes 环境中。您现在可以向您的应用程序添加其他组件,并利用 Kubernetes 的全部功能和优势,直接在自己的机器上进行操作。

除了部署到 Kubernetes 外,您还将应用程序描述为 Kubernetes YAML 文件。这个简单的文本文件包含您在运行状态下创建应用程序所需的一切。您可以将其签入版本控制,并与同事共享。这样一来,您可以将您的应用程序分发到其他集群(例如测试和生产集群,它们可能会在开发环境之后出现)。

Kubernetes 参考

本文中使用的所有新 Kubernetes 对象的进一步文档可在以下位置获得