使用 kubectl 创建部署

目标

  • 了解应用程序部署。
  • 使用 kubectl 在 Kubernetes 上部署您的第一个应用。

Kubernetes 部署

一旦您有一个正在运行的 Kubernetes 集群,您就可以在其上部署容器化应用程序。为此,您需要创建一个 Kubernetes Deployment。Deployment 指示 Kubernetes 如何创建和更新应用程序实例。创建 Deployment 后,Kubernetes 控制平面会将该 Deployment 中包含的应用程序实例调度到集群中的各个节点上运行。

应用程序实例创建后,Kubernetes Deployment 控制器会持续监控这些实例。如果托管实例的节点发生故障或被删除,Deployment 控制器会用集群中另一个节点上的实例替换该实例。这提供了一种自愈机制,以应对机器故障或维护。

在没有编排工具的时代,通常使用安装脚本来启动应用程序,但它们无法从机器故障中恢复。通过创建应用程序实例并使其在不同节点上持续运行,Kubernetes Deployment 提供了一种根本不同的应用程序管理方法。

在 Kubernetes 上部署您的第一个应用

您可以使用 Kubernetes 命令行界面 kubectl 来创建和管理 Deployment。`kubectl` 使用 Kubernetes API 与集群交互。在本模块中,您将学习创建 Deployment 以在 Kubernetes 集群上运行应用程序最常用的 `kubectl` 命令。

创建 Deployment 时,您需要指定应用程序的容器镜像以及要运行的副本数量。您可以稍后通过更新 Deployment 来更改这些信息;训练营的模块 5模块 6 将讨论如何扩展和更新您的 Deployment。

对于您的第一个 Deployment,您将使用一个打包在 Docker 容器中的 hello-node 应用程序,该应用程序使用 NGINX 回显所有请求。(如果您尚未尝试创建 hello-node 应用程序并使用容器进行部署,您可以先按照 Hello Minikube 教程中的说明进行操作。)

您还需要安装 kubectl。如果需要安装,请访问安装工具

现在您已经了解了 Deployment 是什么,让我们来部署我们的第一个应用程序吧!

kubectl 基础

kubectl 命令的常见格式是:`kubectl action resource`。

这将对指定的*资源*(如 `node` 或 `deployment`)执行指定的*操作*(如 `create`、`describe` 或 `delete`)。您可以在子命令后使用 `--help` 获取有关可能参数的更多信息(例如:`kubectl get nodes --help`)。

通过运行 `kubectl version` 命令,检查 kubectl 是否配置为与您的集群通信。

检查 kubectl 是否已安装,并且您可以看到客户端和服务器版本。

要查看集群中的节点,请运行 `kubectl get nodes` 命令。

您将看到可用的节点。稍后,Kubernetes 将根据节点的可用资源选择部署应用程序的位置。

部署应用程序

让我们使用 `kubectl create deployment` 命令在 Kubernetes 上部署我们的第一个应用程序。我们需要提供部署名称和应用程序镜像位置(对于托管在 Docker Hub 之外的镜像,请包含完整的仓库 URL)。

kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1

太棒了!您刚刚通过创建 Deployment 部署了您的第一个应用程序。这为您做了几件事:

  • 搜索适合运行应用程序实例的节点(我们只有 1 个可用节点)
  • 调度应用程序在该节点上运行
  • 配置集群在需要时重新调度实例到新节点

要列出您的 Deployment,请使用 `kubectl get deployments` 命令。

kubectl get deployments

我们看到有 1 个 Deployment 正在运行您的应用程序的单个实例。该实例正在您的节点上的容器中运行。

查看应用

在 Kubernetes 中运行的 Pod 运行在一个私有、隔离的网络中。默认情况下,它们在同一个 Kubernetes 集群中的其他 Pod 和服务中是可见的,但在该网络之外则不可见。当我们使用 `kubectl` 时,我们通过 API 端点与我们的应用程序进行交互。

我们将在稍后的模块 4 中介绍如何将应用程序暴露到 Kubernetes 集群之外的其他选项。此外,作为基本教程,我们在此不详细解释 `Pod` 是什么,这将在后续主题中介绍。

`kubectl proxy` 命令可以创建一个代理,将通信转发到集群范围的私有网络。代理可以通过按 Control-C 终止,并且在运行时不会显示任何输出。

您需要打开第二个终端窗口来运行代理。

kubectl proxy

我们现在在我们的主机(终端)和 Kubernetes 集群之间建立了连接。代理允许从这些终端直接访问 API。

您可以通过代理端点查看所有这些 API。例如,我们可以使用 `curl` 命令直接通过 API 查询版本。

curl https://:8001/version

API 服务器将根据 Pod 名称为每个 Pod 自动创建一个端点,该端点也可通过代理访问。

首先我们需要获取 Pod 名称,并将其存储在环境变量 `POD_NAME` 中。

export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME

您可以通过运行以下命令,通过代理 API 访问 Pod:

curl https://:8001/api/v1/namespaces/default/pods/$POD_NAME:8080/proxy/

为了使新的 Deployment 无需使用代理即可访问,需要一个 Service,这将在模块 4 中解释。

下一步

上次修改时间:2025 年 6 月 25 日太平洋标准时间下午 2:14:在 deploy-intro.md 中添加缺失的右括号 (#51302) (9a7ec41c24)