Kubernetes 教程:学习基础知识并开始使用
谷歌开源 Kubernetes 项目已经五年多了。即便如此,你可能仍然想知道Kubernetes是什么,以及如何开始使用它。好吧,你来对地方了!在这篇文章中,我将讲解 Kubernetes 入门所需的基础知识。我不会只是给你灌输概念,我会提供真实的代码示例,帮助你更好地理解为什么如果你正在考虑使用容器,那么 Kubernetes 是你的不二之选。
开始动手练习
在我们深入研究 Kubernetes 的核心概念之前,您需要先泡一壶咖啡。
现在,让我们开始设置你的本地环境。我不确定你的情况,但我觉得通过实践比仅仅阅读或记忆概念学得更快。Kubernetes 的学习曲线非常陡峭,有时你可能会被围绕这个流行的容器编排系统的整个生态系统所淹没。但是,一旦你有了扎实的知识基础,你就会发现 Kubernetes 恰好包含了很多你需要组装起来才能创造出很酷的东西的组件。
如果您不想立即完成 Kubernetes 的安装过程,可以使用一个名为Play with Kubernetes (PWK) 的 Play 平台。我建议您仅在当前计算机上安装 Kubernetes 比较复杂时才采用 PWK 方法。安装和使用 Kubernetes 的方法 有很多,但我将仅关注本地环境。
安装 Kubernetes 命令行
在安装 Kubernetes 之前,您需要安装名为kubectl (发音:cube-cuttle)的命令行 (CLI) 工具。kubectl 是您用来与任何 Kubernetes 集群(而不仅仅是本地集群)交互的 CLI。如果您不想在本地安装 Kubernetes,但想要操作 Kubernetes 集群,那么 kubectl 就是您的理想之选。
安装 kubectl 非常简单,具体说明取决于你的操作系统。它支持 Linux、Windows 或 Mac。你可以按照官方文档页面中的详细说明进行操作。运行以下命令来验证安装:
kubectl 版本
现在继续本地安装 Kubernetes。
本地安装 Kubernetes
首先安装 Docker。Kubernetes也支持其他容器系统,但我认为使用 Docker 是学习 Kubernetes 最简单的方法。
根据您的操作系统,我推荐一种特定的安装方法:
- 如果使用 Linux,首选方法是 安装 minikube。你需要一个虚拟机管理程序,例如VirtualBox或KVM。
- 如果是Windows或Mac 系统,建议安装最新版Docker for Desktop。如果您已经在使用最新版本,则可能需要启用 Kubernetes。
安装过程可能需要一段时间,所以请花点时间再喝杯咖啡。
使用以下命令验证 Kubernetes 是否正在运行:
kubectl 获取服务
如果没有错误,那就大功告成了!现在 Kubernetes 已经在本地运行了。如果您想要图形界面,可以快速安装。在本指南中,我将仅使用 CLI,但如果您希望以图形方式查看所有组件,最好使用 GUI。
Kubernetes 核心概念
您可以使用 API(通常通过 kubectl CLI)与 Kubernetes 交互,以设置应用程序的期望状态。这意味着您需要告诉 Kubernetes 应用程序应该如何运行。即使集群发生故障或负载增加,您需要扩展资源,Kubernetes 也会确保应用程序以您指定的状态运行。
设置所需状态的方式是在 Kubernetes 中创建对象。我们将了解部署零停机弹性应用程序所需的一些核心对象。您可以使用 YAML 格式定义这些对象,我将使用它来实践这些概念。
豆荚
Pod是您在 Kubernetes 中创建的最小计算单元对象,也是您分组一个或多个容器的方式。您可能知道容器只有一个职责。但是,一个 Pod 包含多个容器的原因是为了提高性能和实现协同调度。Pod 中的容器共享相同的网络、相同的存储,并在同一主机上进行调度。
例如,一个 Web 应用可以是一个将日志写入存储设备的容器。另一个将日志收集到文件中的容器可以与 Web 应用容器使用同一个存储设备。这样,您就不必在一个容器中承担多项责任。因此,您应该将 Pod 视为虚拟机的代表,但事实并非如此。
您可以使用名为 pod.yaml 的 YAML 文件定义创建一个 pod 对象,如下所示:
api版本:v1 种类: Pod 元数据: 名称:helloworld 标签: 应用程序:helloworld 规格: 容器: -名称:helloworld 图片:christianhxc/helloworld:1.0 端口: - 容器端口:80 资源: 请求: CPU:50米 限制: CPU:100米
现在,通过运行以下命令来创建 pod:
kubectl 应用 -f pod.yaml
然后使用以下命令验证 pod 是否正在运行:
$ kubectl 获取 Pod 姓名 就绪状态 重启年龄 helloworld 1/1 运行 0 41秒
如果 Pod 由于某种原因终止,你无需告诉 Kubernetes 重新创建 Pod。Kubernetes 会自动重新创建一个 Pod,因为 Pod 的状态与你定义的状态不同。那么,我们来看看下面的对象。
部署
Pod 是永久存在的,这意味着你的应用程序缺乏弹性。部署对象可以赋予 Pod 永久存在的能力。你可以定义希望始终运行的 Pod 数量、扩容策略以及零停机部署策略。如果一个 Pod 宕机,Kubernetes 会启动一个新的 Pod。Kubernetes 会持续验证所需状态是否与对象的定义相符。
让我们创建一个deployment.yaml文件,表示我们希望两个pod一直运行,如下所示:
api版本:apps/v1 种类:部署 元数据: 名称:helloworld 标签: 应用程序:helloworld 规格: 副本:3 选择器: 匹配标签: 应用程序:helloworld 模板: 元数据: 标签: 应用程序:helloworld 规格: 容器: -名称:helloworld 图片:christianhxc/helloworld:1.0 端口: - 容器端口:80 资源: 请求: CPU:50米 限制: CPU:100米
现在让我们通过运行以下命令告诉 Kubernetes 我们要创建部署对象:
$ kubectl apply -f 部署.yaml 创建deployment.apps/helloworld
通过运行以下命令验证部署是否存在:
$ kubectl 获取部署 姓名 期望 当前 最新 可联系年龄 你好世界 3 3 3 3 40秒
您将看到现在有三个 pod 正在运行,再加上我们之前创建的 pod。
$ kubectl 获取 Pod 姓名 就绪状态 重启年龄 helloworld 1/1 运行 0 8h helloworld-75d8567b94-7lmvc 1/1 运行 0 24秒 helloworld-75d8567b94-n7spd 1/1 运行 0 24秒 helloworld-75d8567b94-z9tjq 1/1 运行 0 24秒
如果您想尝试终止 Pod,请运行命令“kubectl delete podhelloworld-75d8567b94-7lmvc”。您将看到 Kubernetes 如何创建新的 Pod,使其所需状态与部署定义相匹配。每次需要更新容器镜像时,您都需要更改 deploy.yaml 文件并运行“apply”命令。然后,Kubernetes 将使用更新后的容器镜像版本创建新的 Pod。在它们运行之前,使用先前版本的 Pod 将被终止。您可以更详细地配置此更新的执行方式,但目前默认行为仅供学习使用。
服务
目前,您无法通过 Web 浏览器访问 Pod 来验证它们是否正常工作——您需要将它们暴露出来。推荐的暴露 Pod 的方式是通过服务对象。尽管如此,集群中的其他 Pod 可以使用内部 IP 地址相互通信。但是,您不能依赖 IP 地址来实现 Pod 的动态通信,因此解决方案仍然是服务。
因此,服务是 Pod 负载均衡器的代表。您可以配置负载均衡算法,如果 Kubernetes 与云提供商集成,则可以使用该云提供商提供的原生负载均衡器。
定义服务的最直接方法是使用以下 service.yaml:
api版本:v1 种类:服务 元数据: 名称:helloworld 规格: 类型:负载均衡器 端口: - 端口:80 选择器: 应用程序:helloworld
你可能注意到我们一直在使用标签和选择器,这是因为服务通过它们来判断将请求重定向到哪个 Pod。在你创建的对象中,所选的标签是 Pod 元数据定义中的“app: helloworld”。Pod 是如何创建的并不重要,只要它有这个标签,就会在服务中被“注册”。
让我们运行以下命令来创建服务:
$ kubectl apply -f 服务.yaml 服务/helloworld已创建
要验证服务是否正在运行,并获取 IP 地址进行测试,请运行以下命令:
$ kubectl 获取服务 名称类型集群 IP 外部 IP 端口年龄 helloworld LoadBalancer 10.105.139.72 本地主机 80:30299/TCP 21s kubernetes ClusterIP 10.96.0.1 <无> 443/TCP 12h
使用“EXTERNAL-IP”和“PORT”的值进行测试。在本例中,我们正在使用的容器镜像的 URL 应该是http://localhost/api/values 。根据您运行 Kubernetes 的位置,您可能会收到不同的值。如果由于某种原因端口 80 被占用,您可以在 service.yaml 文件中更改端口,然后再次运行“apply”命令。
就这样!只需使用 Pod、部署和服务,您就可以在本地环境中部署一个弹性无状态应用程序。
下一步是什么?
下一步是将同一个应用部署到以下环境,例如云端。流程和步骤相同,至少对于我在示例中使用的简单应用来说是这样。
虽然本指南比典型的“hello world”应用略微高级一些,但该应用仍然简单易懂。但在当今复杂且分布式的世界中,现实情况并非如此。我只是略微介绍了一些皮毛——Kubernetes 的概念远不止这些。(例如,我没有讨论其他核心概念,例如卷、命名空间、入口、配置映射、密钥、作业、守护进程和状态集。)但我在这里解释和演示的概念应该能为您的 Kubernetes 之旅奠定良好的基础。
如果您想继续了解更多信息,官方文档是一个很好的来源,这里有一些有用的链接可以供您参考:
通过实践获得实践经验;这是学习 Kubernetes 的最佳方式。
文章来源:https://dev.to/scalyr/kubernetes-tutorial-learn-the-basics-and-get-started-5dgh