Kubernetes(k8s)是一个自动化容器操作的开源平台,包括节点集群之间的部署、调度和扩展。如果您曾经使用过 Docker 容器技术来部署容器,您可以将 Docker 视为 Kubernetes 内部使用的底层组件。 Kubernetes不仅支持Docker,还支持另一种容器技术Rocket。 Kubernetes (k8s) 是一个开源平台,用于自动化容器操作,包括跨节点集群的部署、调度和扩展。如果您曾经使用过 Docker 容器技术来部署容器,您可以将 Docker 视为 Kubernetes 内部使用的底层组件。 Kubernetes不仅支持Docker,还支持另一种容器技术Rocket。 使用 Kubernetes,您可以: 自动化容器部署和复制 随时扩大或缩小容器尺寸 将容器分组并提供容器之间的负载平衡 轻松将应用程序容器升级到新版本 提供容器弹性,在容器出现故障时更换容器等...... 事实上,使用 Kubernetes 只需要一个部署文件,用一条命令就可以部署完整的多层容器(前端、后端等)集群: $ kubectl create -f single-config-file.yaml kubectl 是一个与 Kubernetes API 交互的命令行程序。现在介绍一些核心概念。 集群是一组安装了 Kubernetes 平台的节点,可以是物理服务器,也可以是虚拟机。下图展示了这样一个集群。请注意,该图已被简化以强调核心概念。在这里你可以看到一个典型的 Kubernetes 架构图。 在上图中,您可以看到以下组件,使用特殊的图标来表示Service和Label: 荚 容器 标签 复制控制器 服务 节点 Kubernetes Master(Kubernetes 主节点) Pod(上图中的绿色框)排列在节点上,包含一组容器和卷。同一 Pod 中的容器共享相同的网络命名空间,并且可以使用 localhost 相互通信。 Pod 是短暂的而非持久的实体。您可能有以下疑问: 如果 Pod 是短暂的,我如何保留容器数据以使其在重新启动后仍然存在?是的,Kubernetes 支持卷的概念,因此可以使用持久卷类型。 您想手动创建 Pod 吗?如果要创建同一个容器的多个副本,是否需要一一创建?您可以手动创建单个 Pod,但也可以使用 Replication Controller 使用 Pod 模板创建多个副本,如下详细所述。 如果Pod是临时的,重启时IP地址可能会改变,那么如何正确可靠地从前端容器指向后端容器呢?这时候就可以使用Service了,下面会详细介绍。 如图所示,部分Pod带有Label。 Label 是附加到 Pod 的键/值对,用于传递用户定义的属性。例如,您可以创建“tier”和“app”标签,使用 Label (tier=frontend, app=myapp) 标记前端 Pod 容器,并使用 Label (tier=backend, app =我的应用程序)。然后,您可以使用选择器选择具有特定标签的 Pod,并向它们应用服务或复制控制器。 您想手动创建 Pod 吗?如果要创建同一个容器的多个副本,是否需要一一创建? Pod 可以分为逻辑组吗? 复制控制器确保指定数量的 Pod“副本”在任何时候都在运行。如果你为一个 Pod 创建一个 Replication Controller 并指定 3 个副本,它将创建 3 个 Pod 并持续监控它们。如果某个 Pod 没有响应,Replication Controller 会替换它,使总数保持在 3 个。如下动画所示: 如果之前没有响应的 Pod 恢复,现在有 4 个 Pod,Replication Controller 将终止其中一个 Pod,使总数保持在 3 个。如果在运行过​​程中副本总数更改为 5 个,Replication Controller 将立即启动 2 个新 Pod确保总数为 5。您还可以通过这种方式收缩 pod,这在执行滚动升级时很有用。创建复制控制器时,您需要指定两件事: Pod template:用于创建 Pod 副本的模板 Label:Replication Controller 需要监控的 Pod 的标签。 现在 Pod 的一些副本已经创建了,那么如何平衡这些副本上的负载呢?我们需要的是服务。 如果 Pod 是临时的,则 IP 地址可能会在重新启动时更改。如何才能从前端容器正确可靠的指向后端容器呢? Service 是一个抽象层,定义了一系列 Pod 以及访问这些 Pod 的策略。 Service通过Label找到Pod组。由于服务是抽象的,它们通常在图表中不可见,使得概念更难以理解。 现在,假设有两个后端Pod,后端Service的名称定义为'backend-service',标签选择器为(tier=backend, app=myapp)。 backend-service的服务会完成以下两个重要的事情: 将为 Service 创建本地集群 DNS 条目,因此前端 Pod 只需要 DNS 查找主机名“backend-service”即可解析前端应用程序可用的 IP 地址。 现在前端已经获得了后端服务的IP地址,但是它应该访问两个后端Pod中的哪一个呢? Service 在这两个后台 Pod 之间提供透明的负载平衡,并将请求分发到其中任何一个(如下面的动画所示)。这是通过每个节点上运行的代理(kube-proxy)来完成的。以下是更多技术细节。 下面的动画展示了Service的功能。请注意,该图有许多简化。在不涉及网络配置的情况下,实现透明负载均衡目标所涉及的底层网络和路由是相对先进的。如果您有兴趣,这里有更深入的介绍。 有一种特殊类型的 Kubernetes 服务称为“LoadBalancer”,它用作外部负载均衡器来平衡一定数量的 Pod 之间的流量。例如,对于负载平衡 Web 流量很有用。 节点(上图中的橙色框)是充当 Kubernetes Worker 的物理机或虚拟机,通常称为 Minion。每个节点运行以下关键 Kubernetes 组件: Kubelet:它是主节点代理。 Kube-proxy:由服务用来将链接路由到 Pod,如上所述。Docker 或 Rocket:Kubernetes 用于创建容器的容器技术。 该集群有一个 Kubernetes Master(紫色框)。 Kubernetes Master 提供了集群的独特视图,并拥有一系列组件,例如 Kubernetes API Server。 API Server 提供可用于与集群交互的 REST 端点。主节点包括用于创建和复制 Pod 的复制控制器。