网络研讨会系列:Kubernetes入门
本文补充了关于在云中部署和管理容器化工作负载的 网络研讨会系列 。 该系列涵盖了容器的基本知识,包括管理容器生命周期、部署多容器应用程序、扩展工作负载以及使用 Kubernetes。 它还强调了运行有状态应用程序的最佳实践。
本教程包含本系列第三部分“Kubernetes 入门”中的概念和命令。
介绍
在本系列的上一篇教程中,我们探索了使用 Docker Compose 管理多容器应用程序。 虽然 Docker 命令行界面 (CLI) 和 Docker Compose 可以部署和扩展在单台机器上运行的容器,但 Kubernetes 旨在处理跨多台机器或主机部署的多容器应用程序。
Kubernetes 是一个用于管理容器化应用程序的开源容器编排工具。 一个 Kubernetes 集群 有两个关键组件:Master Nodes 和 Worker Nodes。 一组主节点充当管理工作节点和部署的应用程序的控制平面。 工作节点是负责运行容器化应用程序的 Kubernetes 集群的主力。
主节点公开一个 API,命令行工具和富客户端通过该 API 提交一个 job,其中包含应用程序的定义。 每个应用程序都由一个或多个 容器、存储定义以及用于暴露它们的内部和外部端口组成。 在主节点上运行的控制平面将容器调度到其中一个工作节点中。 当应用程序扩展时,控制平面会在任何可用的工作节点上启动额外的容器。
关于Kubernetes的详细介绍,请参考教程【X65X】Kubernetes简介【X98X】。
StackPointCloud 使用基于 Web 的界面分三步部署 Kubernetes 集群。 它通过简化的用户体验隐藏了安装和配置 Kubernetes 的复杂性。 DigitalOcean 是 StackPoint 支持的云平台之一。 不熟悉系统管理和配置的开发者可以使用 StackPoint 在 DigitalOcean 上快速安装 Kubernetes。 有关支持的功能和定价的详细信息,请参阅他们的网站。
在本教程中,您将通过 StackPoint 在 DigitalOcean 上设置和配置 Kubernetes,并将容器化应用程序部署到您的集群。
先决条件
要遵循本教程,您需要
- 安装了
curl
命令的本地计算机,您将使用它下载命令行工具来管理 Kubernetes 集群。curl
命令已安装在 macOS 和 Ubuntu 16.04 上。 - 一个 DigitalOcean 帐户。 在本教程中,您将使用 StackPoint 连接到您的 DigitalOcean 帐户并配置三个 1GB Droplet。
第 1 步 - 安装 Kubernetes
要开始在 DigitalOcean 上安装 Kubernetes,请访问 Stackpoint.io 并单击登录按钮。
这会将您带到一个页面,您可以在其中选择身份提供者并使用现有凭据登录。 从列表中选择 DigitalOcean 并使用您的 DigitalOcean 用户名和密码登录。
在下一页上,从可用云平台列表中选择 DigitalOcean。
您现在可以配置集群。 单击 EDIT 按钮以编辑 DigitalOcean 提供程序的设置:
这会将您带到“配置提供程序”屏幕。
从 Region 下拉列表中选择您选择的区域。 您可以将其他设置保留为默认值。 完成后点击提交。
在下一个屏幕上,输入您选择的集群名称,然后单击 Submit。
集群安装现在将开始,您将被带到一个页面,您可以在其中跟踪集群的进度。 安装大约需要 15 分钟。
配置集群后,我们可以设置一个命令行工具来使用它。
第 2 步 – 配置 Kubernetes CLI
要与在 DigitalOcean 中运行的 Kubernetes 集群通信,我们需要在我们的开发机器中安装一个命令行工具。 我们将使用 kubectl
,Kubernetes 的 CLI。
运行以下命令从 Google 的服务器安装 kubectl
:
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/darwin/amd64/kubectl
你会看到这个输出:
Output % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 63.7M 100 63.7M 0 0 5441k 0 0:00:12 0:00:12 --:--:-- 4644k
kubectl
二进制文件已下载到您的当前目录,让我们更改下载二进制文件的权限并将其移动到 /usr/local/bin
目录,以便我们可以在任何地方运行它:
chmod +x ./kubectl sudo mv ./kubectl /usr/local/bin/kubectl
现在让我们将 kubectl
应用程序指向我们的 Kubernetes 集群。 为此,我们需要从 Stackpoint 下载配置文件。 在浏览器中返回集群状态页面。 验证集群准备就绪且稳定后,点击集群名称,如下图所示:
点击左侧菜单中的 kubeconfig 链接,将配置文件下载到本地机器:
返回终端,将环境变量 KUBECONFIG
设置为下载文件的路径。 假设您的文件下载到主目录中的 Downloads
文件夹,您将发出以下命令:
export KUBECONFIG=~/Downloads/kubeconfig
配置 kubectl
后,让我们确保我们可以与集群通信。
第 3 步 - 验证 Kubernetes 安装
现在我们已经有了完整配置的集群和客户端,让我们运行一些命令来验证环境。
运行以下命令以获取有关集群的信息。
kubectl cluster-info
你会看到这个输出:
OutputKubernetes master is running at https://139.59.17.180:6443 Heapster is running at https://139.59.17.180:6443/api/v1/namespaces/kube-system/services/heapster/proxy KubeDNS is running at https://139.59.17.180:6443/api/v1/namespaces/kube-system/services/kube-dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
输出确认集群正在运行,并且 Kubernetes 主节点已启动并正在运行。
接下来,让我们验证主节点中运行的所有组件的健康状况。 如果集群刚刚配置,可能需要一段时间才能使所有组件显示健康状态。 这些组件是充当控制平面的 Kubernetes 主节点的一部分。
执行这个命令:
kubectl get cs
你会看到这个输出:
OutputNAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health": "true"}
最后,让我们列出正在运行的 Kubernetes 集群的所有节点。
kubectl get nodes
你会看到这样的输出:
OutputNAME STATUS ROLES AGE VERSION spc52y2mk3-master-1 Ready master 29m v1.8.5 spc52y2mk3-worker-1 Ready <none> 22m v1.8.5 spc52y2mk3-worker-2 Ready <none> 22m v1.8.5
这证实了具有一个 Master Node 和两个 Worker Node 的集群已经准备好供我们部署应用程序了。 因此,让我们将应用程序部署到集群中。
第 4 步 - 部署和访问应用程序
让我们启动一个简单的 Nginx Web 服务器并从我们的本地机器访问它的默认网页。 执行此命令从 Docker Hub 拉取 Nginx 映像 并创建一个名为 myweb
的部署:
kubectl run --image=nginx:latest myweb
此命令类似于 docker run
命令,不同之处在于它将容器打包并部署在称为 Pod 的特定于 Kubernetes 的工件中。 您将在本系列的下一部分中了解有关 Pod 的更多信息。
执行命令时,您将看到以下输出:
Outputdeployment "myweb" created
现在检查 Pod 是否使用 nginx
容器创建:
kubectl get pods
你会看到这个输出:
OutputNAME READY STATUS RESTARTS AGE myweb-59d7488cb9-jvnwn 1/1 Running 0 3m
要访问在 Pod 内运行的 Web 服务器,我们需要将其公开到公共 Internet。 我们使用以下命令实现这一点:
kubectl expose pod myweb-59d7488cb9-jvnwn --port=80 --target-port=80 --type=NodePort
Outputservice "myweb-59d7488cb9-jvnwn" exposed
Pod 现在暴露在集群的每个节点上的任意端口上。 --port
和 --target-port
开关指示 Web 服务器可用的端口。 开关 --NodePort
确保我们可以使用集群上的任何 Node 来访问应用程序。
要获取 myweb
部署的 NodePort,请运行以下命令。
kubectl get svc myweb-59d7488cb9-jvnwn
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE myweb-59d7488cb9-jvnwn NodePort 10.3.0.119 <none> 80:31930/TCP 6m
在这种情况下,NodePort 是端口 31930
。 每个工作节点都使用这个端口来响应 HTTP 请求。 让我们测试一下。
使用 DigitalOcean 控制台获取其中一个工作节点的 IP 地址。
使用 curl
命令向端口 31930
上的节点之一发出 HTTP 请求。
curl http://your_worker_1_ip_address:31930/
您将看到包含 Nginx 默认主页的响应:
Output<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ... Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
您已成功将容器化应用程序部署到 Kubernetes 集群。
结论
Kubernetes 是一个流行的容器管理平台。 StackPoint 使在 DigitalOcean 上安装 Kubernetes 变得容易。
在本系列的下一部分中,我们将更详细地探索 Kubernetes 的构建块。