Kubernetes(k8s)是用于自动部署、扩展和管理“容器化应用程序”的开源系统

k8s由control plane以及cluster nodes构成
在这里插入图片描述

control plane

control plane是维护所有k8s对象记录的系统,持续管理着对象状态,并且对集群的变化做出响应,并使状态匹配所期望的

  • kube-apiserver: API Server 为不同类型的应用程序提供了支持生命周期编排(缩放、更新等)的 API。它还充当集群的网关,因此 API 服务器必须能够被集群外部的客户端访问。客户机通过 API 服务器进行身份验证,并将其用作节点和 pods (以及服务)的代理/通道。
  • kube-controller-manager: 负责将资源转变维持到期望状态。期望状态就是描述资源期望的元数据
  • kube-scheduler: 负责编排集群中容器
  • etcd: 一个分布式和容错的开源键值存储数据库,用于存储配置数据和关于集群状态的信息。etcd可以在外部配置,尽管它通常是Kubernetes控制平面的一部分。

Kubernetes control plane

kube-apiserver

在这里插入图片描述

具体负责如下

  • api管理:保留集群API并处理所有API请求
  • 认证与授权
  • 唯一与etcd交流的组件
  • 协调control plane和cluster nodes之间的进程
  • 内置的 bastion apiserver 代理,支持从集群外部访问 ClusterIP 服务

etcd

etcd提供了

  • 储存了所有配置、状态以及k8s对象的元数据
  • 允许客户端(apiserver)跟踪对象状态的变化
  • 通过grpc暴露key-value API

kube-scheduler

在这里插入图片描述

scheduler通过采用筛选和评分选择最好的node,随后应用该调度

controller manager

controller是运行控制流的程序,在观察到对象状态与预期不一致,会进行纠正。

kube controller manager用于管理所有k8s controller的组件

在这里插入图片描述

cluster nodes

cluster nodes是运行容器且被master节点管理的机器

在这里插入图片描述

  • kubelet: 是主要且最重要的控制器,与control plane沟通来驱动容器在pod中运行
  • kube-proxy: 运行在集群中每个节点的网络代理,维持每个节点的网络规则。
  • container runtime: 负责运行容器。支持containerd、CRI-O等

kubelet

kubelet负责向api server注册node,并使用来自api server的pod规格与runtime沟通使容器达到所期望状态

skubelet不以容器的形式运行,而是作为daemon被systemd管理

主要做以下事情

  • 从pod创建、修改、删除容器
  • 通过读取 pod 配置并在主机上创建各自的卷安装目录来负责安装卷。
  • 收集汇报pod状态

kube-proxy

为了理解kube-proxy首先要了解service和endpoint对象

k8s中service指的是一种向内部或外部流量公开一组pod的方法。当创建service对象时,将获得分配的虚拟IP(clusterIP),只能在Kubernetes集群中访问。

Endpoint对象包含Service对象下pod组的所有IP地址和端口。endpoint控制器负责维护pod IP地址(端点)列表。service控制器负责配置service的endpoint。

不能ping通ClusterIP,因为它只用于服务发现,不像pod ip可以ping通。

接着来介绍一下kube-proxy

Kube-proxy是一个守护进程,在每个节点上作为守护进程运行。它是为pod实现Kubernetes Services概念的代理组件。(为一组具有负载平衡的pod提供单个DNS)。它主要代理UDP、TCP和SCTP,不理解HTTP。

当您使用Service (ClusterIP)公开pod时,Kube-proxy将创建网络规则,将流量发送到分组在Service对象下的后端pod(endpoint)。也就是说,所有的负载平衡和服务发现都由Kube代理处理。

在这里插入图片描述

kube-proxy默认采用iptables模型进行处理

container runtime

runtime负责拉取镜像、运行容器、分配和隔离容器资源、管理容器整个生命周期

Container Runtime Interface(CRI):是一组 API,允许 Kubernetes 与不同的容器运行时进行交互。它允许不同的容器运行时与 Kubernetes 交换使用。CRI 定义了用于创建、启动、停止和删除容器以及管理映像和容器网络的 API

Open Container Initiative (OCI) : 一组用于容器规格和运行时的标准

  1. kubelet接收来自api server请求,随后通过CRI与CRI-O对话来启动要求的容器
  2. CRI-O检查并拉取镜像
  3. CRI-O为容器生成OCI runtime规格
  4. CRI-O随后启动OCI兼容runtime(runc)安装规格去启动容器进程

在这里插入图片描述

Ref

  1. https://platform9.com/blog/kubernetes-enterprise-chapter-2-kubernetes-architecture-concepts/
  2. https://kubernetes.io/docs/concepts/overview/components/
  3. https://avinetworks.com/glossary/kubernetes-architecture/
  4. https://devopscube.com/kubernetes-architecture-explained/
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐