使用 kubectl 创建部署
目标
- 了解应用程序部署。
- 使用 kubectl 在 Kubernetes 上部署您的第一个应用。
Kubernetes 部署
注意
本教程使用一个需要 AMD64 架构的容器。如果您在具有不同 CPU 架构的计算机上使用 minikube,您可以尝试使用支持模拟 AMD64 的驱动程序(例如 Docker Desktop 驱动程序)。一旦您有一个正在运行的 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
注意
如果端口 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 https://:8001/api/v1/namespaces/default/pods/$POD_NAME:8080/proxy/
为了使新的 Deployment 无需使用代理即可访问,需要一个 Service,这将在模块 4 中解释。
下一步
- 教程:查看 Pod 和节点。
- 了解更多关于 Deployments 的信息。