目标
- 了解应用程序部署。
- 使用 kubectl 在 Kubernetes 上部署您的第一个应用程序。
Kubernetes 部署
注意
本教程使用需要 AMD64 架构的容器。如果您在 CPU 架构不同的计算机上使用 minikube,您可以尝试使用可以模拟 AMD64 的驱动程序。例如,Docker Desktop 驱动程序可以做到这一点。
拥有一个正在运行的 Kubernetes 集群后,您可以在其上部署容器化应用程序。为此,您将创建一个 Kubernetes **部署**。部署指示 Kubernetes 如何创建和更新应用程序实例。创建部署后,Kubernetes 控制平面会将该部署中包含的应用程序实例调度到集群中的各个节点上运行。
创建应用程序实例后,Kubernetes 部署控制器会持续监控这些实例。如果承载实例的节点出现故障或被删除,部署控制器将在集群中的另一个节点上替换该实例。**这提供了一种自我修复机制来解决机器故障或维护问题。**
在预编排世界中,安装脚本通常用于启动应用程序,但它们不允许从机器故障中恢复。通过创建应用程序实例并在节点之间保持运行状态,Kubernetes 部署为应用程序管理提供了一种完全不同的方法。
摘要
- 部署
- Kubectl
部署负责创建和更新应用程序实例
在 Kubernetes 上部署您的第一个应用程序
您可以使用 Kubernetes 命令行界面 **kubectl** 来创建和管理部署。Kubectl 使用 Kubernetes API 与集群进行交互。在本模块中,您将学习创建部署所需的常用 kubectl 命令,这些命令将在 Kubernetes 集群上运行您的应用程序。
创建部署时,您需要指定应用程序的容器镜像以及要运行的副本数量。您以后可以通过更新部署来更改这些信息;培训营的第 5 模块和第 6 模块讨论如何扩展和更新部署。
应用程序需要打包成一种受支持的容器格式才能在 Kubernetes 上部署
对于您的第一个部署,您将使用一个名为 hello-node 的应用程序,该应用程序打包在 Docker 容器中,使用 NGINX 来回显所有请求。(如果您还没有尝试创建 hello-node 应用程序并使用容器部署它,您可以按照 Hello Minikube 教程 中的说明先进行操作)。
您还需要安装 kubectl。如果需要安装,请访问 安装工具。
现在您已经了解了部署是什么,让我们部署我们的第一个应用程序吧!
kubectl 基础
kubectl 命令的常用格式为:kubectl action resource
这将对指定的 action(例如create, describe或delete) 执行指定的 resource(例如node或deployment)。您可以在子命令后面使用 --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
太好了!您刚刚通过创建部署来部署第一个应用程序。这为您执行了一些操作
- 搜索合适的节点,可以在该节点上运行应用程序的实例(我们只有一个可用的节点)
- 将应用程序调度到该节点上运行
- 配置集群,以便在需要时将实例重新调度到新节点
要列出您的部署,请使用 kubectl get deployments
命令
kubectl get deployments
我们看到有一个部署正在运行应用程序的单个实例。该实例在节点上的容器内运行。
查看应用程序
在 Kubernetes 内运行的 Pod 在私有隔离的网络上运行。默认情况下,它们可以从同一 Kubernetes 集群中的其他 Pod 和服务访问,但不能从该网络外部访问。当我们使用 kubectl
时,我们通过 API 端点与应用程序进行通信。
我们将在之后的 模块 4 中介绍将应用程序暴露在 Kubernetes 集群外部的其他选项。此外,由于这是一个基本教程,我们不会在此详细解释 Pod
是什么,这将在后面的主题中介绍。
kubectl proxy
命令可以创建一个代理,该代理将转发通信到集群范围内的私有网络。代理可以通过按控制键-C 来终止,并且在运行时不会显示任何输出。
您需要打开一个新的终端窗口来运行代理。
kubectl proxy
现在我们建立了主机(终端)与 Kubernetes 集群之间的连接。代理使这些终端可以直接访问 API。
您可以看到通过代理端点托管的所有这些 API。例如,我们可以使用 curl
命令直接通过 API 查询版本
curl https://127.0.0.1:8001/version
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 Pod 的名称:$POD_NAME
您可以通过代理的 API 访问 Pod,方法是运行
curl https://127.0.0.1:8001/api/v1/namespaces/default/pods/$POD_NAME:8080/proxy/
为了使新部署在不使用代理的情况下可访问,需要一个服务,这将在 模块 4 中解释。
准备就绪后,请继续 查看 Pod 和节点。