kb

1.构成

Master节点

Master节点是集群的控制节点,由API Server、Scheduler、Controller Manager和

ETCD四个组件构成。

● API Server:各组件互相通讯的中转站,接受外部请求,并将信息写到ETCD中。

● Controller Manager:执行集群级功能,例如复制组件,跟踪Node节点,处理节

点故障等等。

● Scheduler:负责应用调度的组件,根据各种条件(如可用的资源、节点的亲和性

等)将容器调度到Node上运行。

● ETCD:一个分布式数据存储组件,负责存储集群的配置信息。

在生产环境中,为了保障集群的高可用,通常会部署多个Master,如CCE的集群高可

用模式就是3个Master节点。

Node节点

Node节点是集群的计算节点,即运行容器化应用的节点。

● kubelet:kubelet主要负责同Container Runtime打交道,并与API Server交互,

管理节点上的容器。

● kube-proxy:应用组件间的访问代理,解决节点上应用的访问问题。

● Container Runtime:容器运行时,如Docker,最主要的功能是下载镜像和运行容

器。


1.1基本对象

● Pod Pod是Kubernetes创建或部署的最小单位。一个Pod封装一个或多个容器 (container)、存储资源(volume)、一个独立的网络IP以及管理控制容器运行 方式的策略选项。

 ● Deployment Deployment是对Pod的服务化封装。一个Deployment可以包含一个或多个Pod, 每个Pod的角色相同,所以系统会自动为Deployment的多个Pod分发请求。

 ● StatefulSet StatefulSet是用来管理有状态应用的对象。和Deployment相同的是,StatefulSet 管理了基于相同容器定义的一组Pod。但和Deployment不同的是,StatefulSet为 它们的每个Pod维护了一个固定的ID。这些Pod是基于相同的声明来创建的,但是 不能相互替换,无论怎么调度,每个Pod都有一个永久不变的ID。

 ● Job Job是用来控制批处理型任务的对象。批处理业务与长期伺服业务 (Deployment)的主要区别是批处理业务的运行有头有尾,而长期伺服业务在用 户不停止的情况下永远运行。Job管理的Pod根据用户的设置把任务成功完成就自 动退出(Pod自动删除)。

 ● CronJob Kubernetes 开源知识 3 容器与 Kubernetes 文档版本 01 (2023-12-26) 版权所有 © 华为云计算技术有限公司 17CronJob是基于时间控制的Job,类似于Linux系统的crontab,在指定的时间周期 运行指定的任务。

 ● DaemonSet DaemonSet是这样一种对象(守护进程),它在集群的每个节点上运行一个 Pod,且保证只有一个Pod,这非常适合一些系统层面的应用,例如日志收集、资 源监控等,这类应用需要每个节点都运行,且不需要太多实例,一个比较好的例 子就是Kubernetes的kube-proxy。

 ● Service Service是用来解决Pod访问问题的。Service有一个固定IP地址,Service将访问流 量转发给Pod,而且Service可以给这些Pod做负载均衡。

● Ingress Service是基于四层TCP和UDP协议转发的,Ingress可以基于七层的HTTP和HTTPS 协议转发,可以通过域名和路径做到更细粒度的划分。 

● ConfigMap ConfigMap是一种用于存储应用所需配置信息的资源类型,用于保存配置数据的 键值对。通过ConfigMap可以方便的做到配置解耦,使得不同环境有不同的配 置。 

● Secret Secret是一种加密存储的资源对象,您可以将认证信息、证书、私钥等保存在 Secret中,而不需要把这些敏感数据暴露到镜像或者Pod定义中,从而更加安全和 灵活。

 ● PersistentVolume(PV) PV指持久化数据存储卷,主要定义的是一个持久化存储在宿主机上的目录,比如 一个NFS的挂载目录。

 ● PersistentVolumeClaim(PVC) Kubernetes提供PVC专门用于持久化存储的申请,PVC可以让您无需关心底层存储 资源如何创建、释放等动作,而只需要申明您需要何种类型的存储资源、多大的 存储空间。


1.2yaml





2.流程

POD创建流程

1. 用户通过kubectl或其它API客户端提交了Pod Spec给API Server。

2. API Server尝试着将Pod对象的相关信息存入etcd中,待写入操作执行完成,API Server即会返回确认信息至客户端。

3. API Server开始反馈etcd中的状态变化。

4. 所有的kubernetes组件均使用watch机制来跟踪检查API Server上的相关的变化。

5. kube-scheduler(调度器)通过其watcher觉察到API Server创建了新的Pod对象但尚未绑定至任何工作节点。

6. kube-scheduler为Pod对象挑选一个工作节点并将结果信息更新至API Server。

7. 调度结果信息由API Server更新至etcd存储系统,而且API Server也开始反映此Pod对象的调度结果。

8. Pod被调度到的目标工作节点上的kubelet尝试在当前节点上调用Docker启动容器,并将容器的结果状态返回送至API Server。

9. API Server将Pod状态信息存入etcd系统中。

10. 在etcd确认写入操作成功完成后,API Server将确认信息发送至相关的kubelet告之其Pod状态。

deployment创建流程

包含图中第1步,由用户通过kubectl调用kube-apiserver接口创建一个ReplicaSet资源(也可以是其他资源,这里假设为ReplicaSet)。

包含图中第2步,kube-apiserver将要新创建的ReplicaSet资源信息(yaml文件表示的信息)写入etcd。

包含图中第0、3、4步,controller-manager通过List-Watch模式从kube-apiserver处获取所有其控制资源的数据,当然会包含新创建的ReplicaSet资源的数据。controller-manager收到新建ReplicaSet资源的数据后,对比当前ReplicaSet资源已有的Pod副本数,以及期望的Pod副本数。

包含图中第5、6步,由于ReplicaSet资源已有的Pod副本数,以及期望的Pod副本数之间肯定存在差异,controller-manager会将创建Pod的资源信息(yaml文件表示的信息)递给kube-apiserver,kube-apiserver而后将新建Pod资源信息(yaml文件表示的信息)写入etcd。

包含图中0、7、8步,scheduler通过List-Watch模式从kube-apiserver处获取所有其需要的资源的数据,当然会包含需要新建一个Pod的数据。大致的方式是查看是否所有Pod都已经分了节点资源,此时就会发现有Pod并未分配到节点。

包含图中第9、10步,scheduler通过调度算法选择一个节点分配给新创建的Pod,scheduler会通过kube-apiserver将数据最终写入到etcd中。

包含图中0、11、12步,kubelet通过List-Watch模式从kube-apiserver处获取所有其需要的资源的数据,当然会包含需要在当前节点新启动一个Pod的信息。大致的方式是得到当前节点所有需要运行的Pod信息,发现有一个Pod还未处于运行状态。

上面图中并未画出以下步骤,kubelet会通过CRI(Container Runtime Interface)通知到当前节点上的容器运行工具(如:Docker)需要创建一个新的Pod。完成创建后容器运行工具也会通过CRI(Container Runtime Interface)告知kubelet当前Pod状态。进一步kubelet也会将新创建的容器状态告知kube-apiserver而后更新etcd中有关当前Pod的资源信息。


3.pod编排调度

Deployment 





StatefulSet


亲和与反亲和调度

弹性伸缩调度


4.网络

同一个节点中的Pod通信


不同节点上的Pod通信


service



在Kubernetes集群架构中介绍过Node节点上的kube-proxy,实际上Service相关的事 情都由节点上的kube-proxy处理。在Service创建时Kubernetes会分配IP给Service,同 时通过API Server通知所有kube-proxy有新Service创建了,kube-proxy收到通知后通 过iptables记录Service对应的IP和端口,从而让Service在节点上可以被查询到。 

下图是一个实际访问Service的图示,Pod X访问Service(10.247.124.252:8080),在 往外发数据包时,在节点上根据iptables规则目的IP:Port被随机替换为Pod1的IP:Port, 从而通过Service访问到实际的Pod。 除了记录Service对应的IP和端口,kube-proxy还会监控Service和Endpoint的变化,从 而保证Pod重建后仍然能通过Service访问到Pod。


Service 的类型与使用场景

Service的类型除了ClusterIP还有NodePort、LoadBalancer和Headless Service,这几

种类型的Service有着不同的用途。

● ClusterIP:用于在集群内部互相访问的场景,通过ClusterIP访问Service。

● NodePort:用于从集群外部访问的场景,通过节点上的端口访问Service,详细介

绍请参见NodePort类型的Service。

● LoadBalancer:用于从集群外部访问的场景,其实是NodePort的扩展,通过一个

特定的LoadBalancer访问Service,这个LoadBalancer将请求转发到节点的

NodePort,而外部只需要访问LoadBalancer,详细介绍请参见LoadBalancer类

型的Service。

● Headless Service:用于Pod间的互相发现,该类型的Service并不会分配单独的

ClusterIP, 而且集群也不会为它们进行负载均衡和路由。您可通过指定

spec.clusterIP字段的值为“None”来创建Headless Service,详细介绍请参见

Headless Service。




Ingress


就绪探针,存活探针

NetworkPolicy

5.持久化数据

Volume 的类型

Kubernetes的Volume有非常多的类型,在实际使用中使用最多的类型如下。

● emptyDir:一种简单的空目录,主要用于临时存储。

● hostPath:将主机某个目录挂载到容器中。

ConfigMap、Secret:特殊类型,将Kubernetes特定的对象类型挂载到Pod,在6.1 ConfigMap和6.2 Secret章节介绍过如何将ConfigMap和Secret挂载到

Volume中。

● persistentVolumeClaim:Kubernetes的持久化存储类型,详细介绍请参考8.2

PV、PVC和StorageClass中会详细介绍。


、、


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容