本教程中的 shell 命令使用 POSIX shell 语法,大多数 Linux 和 macOS 系统上的默认 shell(例如 bash、zsh 或 sh)都支持该语法。Windows 用户必须使用兼容 POSIX 的 shell,例如 适用于 Linux 的 Windows 子系统 (WSL) 或 Git Bash 来运行所写的命令。使用 export、$() 及类似结构的命令不兼容 PowerShell 或 Windows 命令提示符。
一旦你拥有一个正在运行的 Kubernetes 集群,就可以在其上部署容器化应用了。为此,你需要创建一个 Kubernetes Deployment。Deployment 会指示 Kubernetes 如何创建和更新你的应用实例。创建 Deployment 后,Kubernetes 控制平面会将该 Deployment 中包含的应用实例调度到集群中的各个节点上运行。
应用实例创建后,Kubernetes Deployment 控制器会持续监控这些实例。如果承载实例的节点发生故障或被删除,Deployment 控制器会将该实例替换为集群中另一个节点上的实例。这提供了一种应对机器故障或维护的自愈机制。
在预编排时代,通常使用安装脚本来启动应用,但它们无法从机器故障中恢复。通过创建应用实例并保持其在节点间运行,Kubernetes Deployments 提供了一种根本上不同的应用管理方法。
你可以使用 Kubernetes 命令行界面 kubectl 来创建和管理 Deployment。kubectl 使用 Kubernetes API 与集群交互。在本模块中,你将学习创建在 Kubernetes 集群上运行应用的 Deployment 所需的最常用 kubectl 命令。
创建 Deployment 时,你需要指定应用的容器镜像以及想要运行的副本数量。之后,你可以通过更新 Deployment 来更改此信息;训练营的第 5 模块和第 6 模块讨论了如何扩展和更新 Deployment。
对于你的第一个 Deployment,我们将使用一个打包在 Docker 容器中的 hello-node 应用,它使用 NGINX 来回显所有请求。(如果你还没有尝试过创建 hello-node 应用并将其部署到容器中,可以先按照 Hello Minikube 教程中的说明进行操作。)
你还需要安装 kubectl。如果需要安装,请访问安装工具页面。
现在你知道了什么是 Deployment,让我们部署第一个应用吧!
kubectl 命令的通用格式为:kubectl action resource。
这会对指定的 resource(如 node 或 deployment)执行特定的 action(如 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)部署了你的第一个应用。这为你完成了一些操作:
要列出你的部署,请使用 kubectl get deployments 命令
kubectl get deployments
我们可以看到有一个运行着单一应用实例的部署。该实例正在你节点上的容器内运行。
在 Kubernetes 内运行的 Pods 运行在私有的隔离网络上。默认情况下,它们在同一个 Kubernetes 集群内的其他 pod 和服务是可见的,但在该网络之外是不可见的。当我们使用 kubectl 时,我们是通过 API 端点与应用进行交互的。
我们稍后将在第 4 模块中介绍将应用暴露到 Kubernetes 集群之外的其他选项。此外,作为一个基础教程,我们在此不会详细解释什么是 Pods,它将在后续主题中涵盖。
kubectl proxy 命令可以创建一个代理,将通信转发到集群范围内的私有网络。按下 control-C 可以终止代理,它在运行时不会显示任何输出。
你需要打开第二个终端窗口来运行代理。
kubectl proxy
现在,我们的主机(终端)与 Kubernetes 集群之间已经建立了连接。代理使得这些终端能够直接访问 API。
你可以看到通过代理端点托管的所有 API。例如,我们可以使用 curl 命令直接通过 API 查询版本:
curl https://: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 Name of the Pod: $POD_NAME
你可以通过运行以下命令,访问通过代理后的 Pod API:
curl https://:8001/api/v1/namespaces/default/pods/$POD_NAME:8080/proxy/
为了让新的 Deployment 在不使用代理的情况下可访问,需要一个 Service,这将在第 4 模块中进行说明。