部署到 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。相反,你的大多数工作负载都作为 Deployment 进行调度,Deployment 是由 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` Service,它将把来自你主机端口 30001 的流量路由到其所路由到的 Pod 内部的端口 3000,从而让你能够通过网络访问你的 Todo 应用程序。
此外,请注意,虽然 Kubernetes YAML 初看起来可能很长很复杂,但它几乎总是遵循相同的模式
- `apiVersion`,指示解析此对象的 Kubernetes API
- `kind`,指示此对象是什么类型
- 一些 `metadata`,用于为你的对象应用名称等信息
- `spec`,指定你对象的所有参数和配置。
部署并检查你的应用程序
在终端中,导航到你创建 `bb.yaml` 的位置,并将你的应用程序部署到 Kubernetes
$ kubectl apply -f bb.yaml
你应该看到类似以下的输出,表明你的 Kubernetes 对象已成功创建
deployment.apps/bb-demo created service/bb-entrypoint created
通过列出你的部署来确保一切正常
$ kubectl get deployments
如果一切顺利,你的部署应按如下方式列出
NAME READY UP-TO-DATE AVAILABLE AGE bb-demo 1/1 1 1 40s
这表明你在 YAML 中请求的所有一个 Pod 都已启动并运行。对你的 Service 进行相同的检查
$ 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` Service,我们还看到了我们的 `bb-entrypoint` Service,它在端口 30001/TCP 上接受流量。
打开浏览器并访问 `localhost:30001` 上的 Todo 应用程序。你应该会看到你的 Todo 应用程序,与你在教程的第 2 部分中将其作为独立容器运行时看到的一样。
确认无误后,销毁你的应用程序
$ kubectl delete -f bb.yaml
结论
至此,你已成功使用 Docker Desktop 将你的应用程序部署到开发机上的全功能 Kubernetes 环境中。现在你可以在你自己的机器上为应用程序添加其他组件,并利用 Kubernetes 的所有特性和强大功能。
除了部署到 Kubernetes,你还以 Kubernetes YAML 文件的形式描述了你的应用程序。这个简单的文本文件包含了你需要将应用程序创建为运行状态所需的一切。你可以将其提交到版本控制系统并与你的同事共享。这使你可以将应用程序分发到其他集群(例如可能在你开发环境之后的测试和生产集群)。
Kubernetes 参考
本文中使用的所有新的 Kubernetes 对象的更多文档可在此处找到