GKE 相关概念

1,374 阅读7分钟

概述

Kubernetes

  • 一个可在任何地方部署、扩缩和管理容器化应用的开源系统。

GKE(Google Kubernetes Engine)

  • 云中的托管式 Kubernetes,以可靠、高效、安全的方式运行 Kubernetes 集群。

GKE On-Prem

  • 无处不在的托管式 Kubernetes,在任意位置以可靠、高效、安全的方式运行 Kubernetes 集群。

Kubernetes组件

硬件

节点(Node)

  • 节点是Kubernetes中最小的计算硬件单元。它是集群中单个机器的表示。在大多数生产系统中,节点很可能是数据中心中的物理机器,或者是托管在像谷歌云平台这样的云供应商上的虚拟机。不过,不要让惯例限制了你的想象力,从理论上讲,你可以把任何东西做成一个结点。

  • 把机器看作一个“节点”,可以让我们插入一个抽象层。现在,我们不必担心任何单个机器的独特特性,而是可以简单地将每台机器看作一组可以使用的CPU和RAM资源。这样,任何机器都可以替代Kubernetes集群中的任何其他机器。

集群(Cluster)

  • 虽然使用单个节点是有用的,但它与Kubernetes理念不同。一般来说,你应该将集群看作一个整体,而无需担心单个节点的状态。
  • 在Kubernetes中,节点汇聚资源,形成更强大的机器。当你将程序部署到集群中时,它将智能地处理将工作分配给你的各个节点。如果添加或删除了任何节点,集群将根据需要在工作中进行转换。这对程序或程序员来说都不重要,因为机器实际上是在运行代码。
持久卷(Persistent Volumes)
  • 因为在集群上运行的程序不能保证在特定的节点上运行,所以无法将数据保存到文件系统中的任意位置。如果一个程序试图将数据保存到一个文件中,但随后又被转移到一个新的节点上,那么该文件将不再是程序期望的位置。由于这个原因,与每个节点相关的传统本地存储被当作临时缓存来保存程序,但本地保存的任何数据都不能持久。
  • 为了永久存储数据,Kubernetes使用持久卷(Persistent Volumes)。虽然所有节点的CPU和RAM资源都被集群有效地汇集和管理,但持久的文件存储却不是。相反,本地或云驱动器可以作为持久卷附加到集群上。这可以看作是将外部硬盘插入到集群中。持久卷提供了可以挂载到集群的文件系统,而不与任何特定节点相关联。

软件

容器(Container)

  • 在Kubernetes上运行的程序被打包成Linux容器。容器是一个被广泛接受的标准,因此已经有许多预先构建的映像可以部署在Kubernetes上。

  • 容器化允许你创建自足式的Linux执行环境。任何程序和它的所有依赖项都可以打包成一个文件,然后在网络上共享。任何人都可以下载该容器并在其基础设施上部署它,所需的设置非常少。创建一个容器可以通过编程方式完成,从而形成强大的CI和CD管道。

  • 可以将多个程序添加到单个容器中,但是如果可能的话,你应该将自己限制为每个容器的一个进程。拥有很多小容器比一个大容器好。如果每个容器都有一个紧密的焦点,那么更新更容易部署,并且问题更容易诊断。

Pod

  • Pod 是 Kubernetes 中可部署的最小、最基本对象。一个 Pod 代表集群中正在运行的单个进程实例。

  • 与你过去使用的其他系统不同,Kubernetes不直接运行容器;相反,它将一个或多个容器封装到一个称为Pod的高级结构中。相同Pod中的任何容器都将共享相同的名称空间和本地网络。容器可以很容易地与其他容器在相同的容器中进行通信,就像它们在同一台机器上同时保持一定程度的隔离。

  • Pod被用作Kubernetes的复制单元。如果你的应用程序太受欢迎,单个的Pod实例无法承载负载,那么可以配置Kubernetes以在必要时将你的Pod的新副本部署到集群。即使在没有重载的情况下,在生产系统中任何时候都要有多个副本,以保证负载均衡和故障抵抗。

  • Pod可以容纳多个容器,但在可能的情况下应该限制自己。因为Pod作为一个单位被放大和缩小时,所有在一个Pod里的容器都必须在一起缩放,不管它们是否需要。这将导致资源的浪费和成本增加。为了解决这个问题,Pod应该保持尽可能小的大小,通常只保留一个主进程和紧密耦合的辅助容器(这些辅助容器通常被称为“侧三轮摩托车”)。

pod和容器的区别
  • pod是Kubernetes的最小单元,容器包含在pod中,一个pod中有一个pause容器和若干个业务容器,而容器就是单独的一个容器,简而言之,pod是一组容器,而容器单指一个容器。
ReplicaSet

  • 主要作用是确保Pod以你指定的副本数运行,即如果有容器异常退出,会自动创建新的 Pod 来替代;而异常多出来的容器也会自动回收。可以说,通过ReplicaSet,Kubernetes实现了集群的高可用性。
  • 虽然也 ReplicaSet 可以独立使用,但建议使用 Deployment 来自动管理 ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如 ReplicaSet 不支持 rolling-update 但 Deployment 支持),并且Deployment还支持版本记录、回滚、暂停升级等高级特性。
  • Kubernetes官方强烈建议避免直接使用ReplicaSet,而应该通过Deployment来创建RS和Pod。
部署(Deployment)

  • 虽然Pod是Kubernetes的基本计算单元,但它们通常不是直接在集群上启动的。相反,Pod通常由一个抽象层来管理:部署。

  • 部署的主要目的是声明一个Pod应该同时运行多少个副本。当将部署添加到集群中时,它将自动地旋转加速所需的Pod数量,然后监视它们。如果一个Pod消失,部署将自动重新创建它。

  • 使用部署,你不必手动处理Pod。你只需声明系统的期望状态,它将自动为你管理。

  • Deployments是kubernetes中的一种控制器,是比ReplicaSet更高级的概念,它最重的特性是支持对pod与ReplicaSet的声明式升级,声明式升级比其它方式的升级更安全可靠。需要注意的是用户不应该手动管理被Deployments创建的ReplicaSet。

Service
  • 将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。Service 对象提供对一组 Pod 的单一访问点。尽管您可以访问单个 Pod,但 Pod 是临时性的,只有通过一个 Service 地址才能进行可靠的访问。它通过一个虚拟的IP的形式(VIPs),映射出来指定的端口,通过代理客户端发来的请求转发到后端一组Pods中的一台(也就是endpoint)。此 Service 在 service.yaml 文件中定义。
  • 在Kubernetes中用到的管理微服务的常用的到的类型就是deployment, 里面有个参数replicas 来管理整个deployment里面Pod的生命周期,因为有容器的销毁和生成导致Pod IP也就是动态变化的。而Service做为客户端和Pod(backends)中间的代理层,并抽象一个clusterIP的虚拟IP ,集群内部都可以通过这个IP访访问到具体Pod的服务。
Deployment与Service区别
  • Deployment 对象,用来定义应用。
  • Service 对象,用来定义如何访问应用。
入口(Ingress)

  • 使用上面描述的概念,你可以创建一个节点集群,并将Pod部署到集群上。不过,还有一个问题需要解决:允许外部通信流进入你的应用程序。

  • 默认情况下,Kubernetes提供隔离舱和外部世界。如果你想要与运行在Pod中的服务通信,你必须打开一个通信通道。称作入口(ingress)。

  • 有多种方法可以将入口添加到集群中。最常见的方法是添加入口控制器或负载均衡器。