模块 2 - 部署应用程序

难度: 初级 预计时间: 10 分钟

此场景的目标是帮助您使用 kubectl 在 Kubernetes 上部署您的第一个应用程序。您将学习 kubectl 命令行界面的基础知识以及如何与您的应用程序进行交互。

步骤 1 - kubectl 基础

在终端中输入 kubectl 查看其用法。kubectl 命令的常见格式是:kubectl action resource。这会在指定资源(如 node、container)上执行指定操作(如 create、describe)。您可以在命令后使用 --help 获取有关可能参数的额外信息(kubectl get nodes --help)。

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

kubectl version

好的,kubectl 已安装,您可以看到客户端和服务器的版本。

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

kubectl get nodes

在这里我们看到可用节点(本例中为 1 个)。Kubernetes 将根据节点的可用资源选择在哪里部署我们的应用程序。

步骤 2 - 部署我们的应用程序

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

kubectl create deployment kubernetes-bootcamp --image=gcr.io/k8s-minikube/kubernetes-bootcamp:v1

太棒了!您刚刚通过创建部署部署了您的第一个应用程序。这为您完成了以下几件事:

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

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

kubectl get deployments

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

步骤 3 - 查看我们的应用程序

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

我们将在模块 4 中介绍如何将您的应用程序暴露到 Kubernetes 集群之外的其他选项。

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

我们将打开第二个终端窗口来运行代理。

echo -e "Starting Proxy. After starting it will not output a response. Please return to your original terminal window\n"; kubectl proxy

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

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

curl http://localhost:8001/version

注意:代理在一个新标签页中运行,而最近的命令在原始标签页中执行。代理仍在第二个标签页中运行,这使得我们的 curl 命令可以使用 localhost:8001 正常工作。

如果端口 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

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


最后修改于 2024 年 6 月 6 日: 站点:更新教程图片 (b02c349ed)