图解K8S

270 阅读5分钟

我们对容器技术与Docker已经有了一定的了解,那么K8S又是做什么的呢?K8S全称Kubernetes,是承担分布式场景中容器部署、路由通信、扩缩容与快速恢复等功能的技术。

2K字详解Docker: juejin.cn/post/741180…

1. 图解K8S核心工作

  • 同步K8S完成容器的分布式部署

image.png

  • 物理机故障时,K8S自动完成容器迁徙

image.png

  • 通过K8S将用户请求路由到指定的容器

image.png

2. K8S与容器部署

2.1. Node、Pod与Container

Node、Pod与Container是K8S中的三级重要概念,很容易让我们一头雾水。让我们回到K8S的核心功能之一:容器部署,就是把Docker容器部署到物理机器上,在这个过程中,Docker容器就是Container,物理机器就是Node,而Pod是K8S中的结构,Pod中有一个或多个Container,之后,每个Pod都会部署到一个Node上,完成K8S的容器部署过程。

image.png

有的应用是需要多个容器配合起来才能运行的,那么就需要一个“东西”把这多个容器放在一起,让这些容器感觉是运行在同一台机器上,这个东西就是Pod。Pod是K8S的基本部署单元,Pod不能跨Node部署。

2.2. Pod

Pod是Kubernetes中部署的最小单位,它可以包含一个或多个紧密关联的容器。这些容器共享同一个网络命名空间和存储卷,意味着它们可以通过localhost进行通信,并共享存储。
一个Pod可以包含以下组件:

容器:Pod中运行的应用程序的代码。例如,一个Web服务器容器和一个数据库容器可以在同一个Pod中运行。
网络:每个Pod都有自己的IP地址,Pod内的所有容器共享同一个IP地址,并可以通过localhost相互访问。
存储卷:Pod可以挂载一个或多个存储卷,以便容器能够持久存储和访问数据。
Pod的生命周期包括几个阶段:

Pending:Pod已被创建,但某些资源尚未分配。
Running:Pod已分配到节点上,容器正在运行。
Succeeded:Pod中的所有容器都已成功完成。
Failed:Pod中的某个容器失败。
Unknown:Kubernetes无法确定Pod的状态。

3. K8S的路由通信

3.1. Pod间的通信

不同Node上的Pod的网络是互通,这个是k8s的规范要求,依赖底层网络插件的实现。

image.png

3.2. K8S对外通信

K8S通过Service与用户进行网络通信,用户的网络请求会先打到K8S的Service服务器上,之后由Service路由到对应的Pod。

image.png

Service是通过标签来找到对应提供服务的Pod的。标签是Pod上的一个标识,同样功能的Pod的标签是相同的。

image.png

4. K8S高可用

K8s的设计原则之一是:声明式优于命令式,就是说你告诉k8s你的愿望,它帮你实现。而不是你告诉k8s做什么。K8S的高可用也是这样实现的。

4.1. ReplicaSet

RS是确保某个类型的Pod在集群的保持一定数量的副本数。通过它,k8s帮你实现“在集群中总是有x个节点”。

一个RS包括以下几个部分:

  1. 标签选择器:通过它,RS能找到属于它管理的那些Pod
  2. replica count: 表示需要运行几个副本
  3. pod template: pod的模板,当当前运行的副本数小于预期数量,将基于该模板创建出新Pod实例。

RS是通过标签来识别Pod,并保持Pod的数量的。如果手动将Pod的标签移除(或者删除一个Pod),那么RS将会创建出一个新的Pod补足,旧的Pod将不受RS的管理。如果手动创建出了一个有相同标签的Pod,那么k8s将销毁一个Pod,保持Pod数量与预期一致。

如果修改Pod的template,那么RS会怎么样?答案是,RS只管Pod的标签,并不管Pod运行的是什么image。

4.2. Deployment

如果更改了Pod的template,那么只会影响到新创建出的Pod。如果我们期望Pod的template升级后,所有已经存在的Pod都能升级到新的版本,Deployment就是实现这个目标的。

当调整了Deployment中Pod template之后,如果需要升级容器(比如image变了),那么Deployment会滚动对Pod进行升级(实际是创建新的Pod,同时把老的Pod给销毁掉)。滚动升级过程中涉及到2个重要的参数maxSurge和maxUnavailable,它们决定了升级过程中Pod数量的上限和下限。假设预期有 desired 个Pod,升级过程中最多可有 desired + maxSurge 个Pod,最少必须有 desired - maxUnavailable 个Pod。

4.3. 主从架构

K8S是主从集群结构:

image.png

Master节点:

  1. etcd存储集群元数据,提供高可用的存储。
  2. apiserver提供对外的接口,是master的重要部分。
  3. Scheduler:根据Pod的需求,寻找适合Pod的Node。
  4. ControllerManager,包括各种Controller,如上面的ReplicaSetController。

Worker节点:

  1. kubelet:是node上的守护进程 ,统管Node上的所有事务。
  2. kube-proxy: 和网络相关的组件,监听主节点server的信号。
  3. Container Runtime(图中有误),容器的运行时,如Docker。