使用 kubectl 创建 Deployment

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

目标

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

Kubernetes Deployment

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

一旦应用程序实例创建完成,Kubernetes Deployment 控制器会持续监控这些实例。如果托管实例的节点出现故障或被删除,Deployment 控制器会将该实例替换为集群中另一个节点上的实例。这提供了一种自愈机制来解决机器故障或维护问题。

在编排之前的世界中,通常会使用安装脚本来启动应用程序,但它们不允许从机器故障中恢复。通过创建应用程序实例并在节点之间保持其运行,Kubernetes Deployment 提供了一种与应用程序管理截然不同的方法。

总结

  • Deployment
  • Kubectl

Deployment 负责创建和更新你的应用程序实例


在 Kubernetes 上部署你的第一个应用程序


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

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

应用程序需要打包成一种受支持的容器格式才能部署在 Kubernetes 上

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

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

现在你知道什么是 Deployment 了,让我们部署你的第一个应用程序!


kubectl 基础知识

kubectl 命令的常见格式是:kubectl 操作 资源

这会对指定的资源执行指定的操作(如创建, 描述删除),例如节点Deployment。你可以在子命令后使用 --help 获取有关可能参数的更多信息(例如:kubectl get nodes --help)。

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

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

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

你会看到可用的节点。稍后,Kubernetes 将根据节点可用资源选择在哪里部署我们的应用程序。

部署应用程序

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

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

太棒了!你刚刚通过创建 Deployment 部署了你的第一个应用程序。这为你执行了一些操作

  • 搜索一个合适的节点,可以在其中运行应用程序的实例(我们只有一个可用的节点)
  • 安排应用程序在该节点上运行
  • 配置集群以在需要时在新节点上重新安排实例

要列出你的 Deployment,请使用 kubectl get deployments 命令

kubectl get deployments

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

查看应用程序

在 Kubernetes 内运行的Pod 在私有隔离的网络上运行。默认情况下,它们可以从同一 Kubernetes 集群中的其他 Pod 和服务中看到,但在该网络之外不可见。当我们使用 kubectl 时,我们正在通过 API 端点与我们的应用程序进行通信。

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

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

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

kubectl proxy

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

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

curl https://127.0.0.1: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 Pod 的名称: $POD_NAME

你可以通过代理 API 访问 Pod,方法是运行

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

为了使新的 Deployment 在不使用代理的情况下可访问,需要一个服务,这将在模块 4 中解释。

准备好后,请继续查看 Pod 和节点

上次修改时间:2024 年 3 月 21 日晚上 8:32 PST:在 deploy-intro 中显示正确的代理 URL。(f69cbbde73)