使用 kubectl 创建 Deployment

学习应用的部署。 使用 kubectl 在 Kubernetes 上部署第一个应用。

目标

  • 学习应用的部署。
  • 使用 kubectl 在 Kubernetes 上部署第一个应用。

Kubernetes 部署

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

创建应用实例后,Kubernetes Deployment 控制器会持续监视这些实例。 如果托管实例的节点关闭或被删除,则 Deployment 控制器会将该实例替换为集群中另一个节点上的实例。 这提供了一种自我修复机制来解决机器故障维护问题。

在没有 Kubernetes 这种编排系统之前,安装脚本通常用于启动应用,但它们不允许从机器故障中恢复。 通过创建应用实例并使它们在节点之间运行,Kubernetes Deployment 提供了一种与众不同的应用管理方法。

总结:

  • Deployment
  • kubectl

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

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

使用 kubectl 创建 Deployment - 图1

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

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

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

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

你也需要安装好 kubectl。如果你需要安装 kubectl,参阅安装工具

现在你已经了解了部署的内容,让我们部署第一个应用!

kubectl 基础知识

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

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

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

查验 kubectl 是否已安装,你能同时看到客户端和服务器版本。

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

你可以看到可用的节点。稍后 Kubernetes 将根据节点可用的资源选择在哪里部署应用。

部署一个应用

让我们使用 kubectl create deployment 命令在 Kubernetes 上部署第一个应用。 我们需要提供 Deployment 命令以及应用镜像位置(包括托管在 Docker hub 之外的镜像的完整仓库地址)。

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

很好!你刚刚通过创建 Deployment 部署了第一个应用。这个过程中执行了以下一些操作:

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

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

kubectl get deployments

我们看到有 1 个 Deployment 运行应用的单个实例。这个实例运行在节点上的一个容器内。

查看应用

在 Kubernetes 内运行的 Pod 运行在一个私有的、隔离的网络上。 默认这些 Pod 可以从同一 Kubernetes 集群内的其他 Pod 和服务看到,但超出这个网络后则看不到。 当我们使用 kubectl 时,我们通过 API 端点交互与应用进行通信。

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

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

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

kubectl proxy

现在我们在主机(终端)和 Kubernetes 集群之间有一个连接。此代理能够从这些终端直接访问 API。

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

curl http://localhost:8001/version

注:如果 Port 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/

为了不使用代理也能访问新的 Deployment,需要一个 Service,这将在下一个 模块 4 中讲述。

如果你准备好了,请访问查看 Pod 和 Node