使用 kubectl 创建 Deployment

目标

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

Kubernetes Deployment

一旦你拥有一个运行中的 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

这将在指定的资源(例如 nodedeployment)上执行指定的动作(例如 createdescribedelete)。你可以在子命令后使用 --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 和 Service 中可见,但在该网络外部不可见。当我们使用 kubectl 时,我们通过一个 API 端点与我们的应用交互。

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

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

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

kubectl proxy

现在我们已在主机(终端)与 Kubernetes 集群之间建立了连接。代理使得这些终端能够直接访问 API。

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

curl http://localhost: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 http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME:8080/proxy/

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

下一步

最后修改时间 2024 年 11 月 18 日 下午 8:50 PST: Add images css and alert boxes (b9ee7dbcba)