Kubernetes基础
Deploy an App

Using kubectl to Create a Deployment

目标

  • Learn about application Deployments.
  • Deploy your first app on Kubernetes with kubectl.

环境

实验环境
镜像ID:
3100
镜像名称:
ubuntu20-k3d
实例类型:
2核4G
实例标注:
drill-with-k3d

Kubernetes Deployments

ℹ️

注意:本教程使用的容器需要 AMD64 架构。如果您在具有不同 CPU 架构的计算机上使用 minikube,您可以尝试使用能够模拟 AMD64 的驱动程序来运行 minikube。例如,Docker Desktop 驱动程序可以做到这一点。

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

一旦应用程序实例被创建,Kubernetes 部署控制器会持续监控这些实例。如果承载实例的节点出现故障或被删除,部署控制器会在集群中的另一个节点上用一个新的实例来替换该实例。这提供了一种自我修复机制,以应对机器故障或维护情况。

在预编排的世界中,安装脚本通常用于启动应用程序,但它们无法从机器故障中恢复。通过创建应用程序实例并使其在各个节点上保持运行,Kubernetes 部署为应用程序管理提供了一种截然不同的方法。

Deploying your first app on Kubernetes

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

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

应用程序需要打包成一种受支持的容器格式,以便在 Kubernetes 上进行部署。

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

您还需要安装 kubectl。如果您需要安装它,请访问 install tools。

既然您已经了解了什么是部署,那我们就来部署我们的第一个应用程序吧!

kubectl basics

kubectl 命令的常见格式为:kubectl action resource

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

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

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

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

您将看到可用的节点。稍后,Kubernetes 将根据节点的可用资源来选择在何处部署我们的应用程序。

Deploy an app

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

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

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

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

要列出您的部署,请使用 kubectl get deployments 命令:

kubectl get deployments

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

View the app

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

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

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

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

kubectl proxy

现在,我们在我们的主机(终端)和 Kubernetes 集群之间建立了一个连接。该代理使我们能够从这些终端直接访问 API。

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

curl http://localhost:8001/version

注意:如果端口 8001 不可访问,请确保您在第二个终端中启动的 kubectl proxy 正在运行。

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/