K8s 架构简介(一)

一、前言

在开始学习K8s之前,让我们对容器有一个基本的了解

1.1 什么是容器

一个容器镜像是一个可运行的软件包,其中包含了一个完整的可执行程序,包括代码和运行时需要应用、系统库和全部重要设置的默认值。

通过将应用程序本身,和其依赖容器化,操作系统发行版本和其他基础环境造成的差异,都被抽象掉了。

应用程序通过使用容器与底层的宿主机架构解耦。如下图所示,我们可以利用底层机器在容器引擎之上运行多个容器。这促进了容器在各种操作系统和云场景中的部署。
请添加图片描述

每天有数千个容器实例被大型和小型软件组织部署,操作简单了但是管理复杂,容器编排工具应运而生。

K8s凭借其各种优势和功能特性在行业占据主导地位。

容器化是一种趋势,主要应用的是docker。

1.2 为什么市场推荐K8s

K8s是第一个由云原生计算基金会(Cloud Native Computing Foundation, CNCF)和谷歌基金会倡议的项目,是继Linux之后增长最快的开源软件项目。

为什么现在有很多企业依赖K8s来满足他们的容器编排需求? 原因有很多:

  • 可移植性和灵活性:K8s有很强的兼容性,因为它可以在各种基础设施和环境设置下运行。大多数其他编排器没有这种灵活性。它们被锁定在特定的运行时或基础架构中。

  • 开源:CNCF负责管理K8s,这是一个完全开源、由社区驱动的项目。它有许多重要的企业赞助商,但没有一家公司能“控制”这个平台或者控制它的发展方向。

  • 多云兼容性:K8s不但可以将工作负载托管在单个云上,而且可以将工作负载分布在多个云上。 K8s也能轻松地将其环境从一个云扩展到另一个云。虽然其它编排器也能支持多云架构,但K8s在多云兼容性性方面可以完全超越它们。

  • 市场领导者:大部分公司都在使用K8s。根据红帽公司的一项调查,K8s被客户广泛使用 (88%),尤其在生产环境中(74%)。

二、docker

2.1 什么是docker

Docker 是一种开源项目,用于将应用程序自动部署为可在云或本地运行的便携式独立容器。是一个可以把开发的应用程序自动部署到容器的开源引擎。

docker包括三个概念:镜像(image),容器(container)、仓库(repository)

通过仓库中的镜像可以很方便的移植到其他机器上,不需要重新搭环境。

所以大家需要注意,Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。

2.2docker和VM差异

在这里插入图片描述
如上图,容器有点像一个个的集装箱,彼此之间隔离,但是共享同一套操作系统,

docker是一个应用层的抽象,容器之间通过网络命名空间进行隔离,多个容器共享同一个操作系统内核。VM是对物理硬件层的抽象,每个VM都包含独立的操作系统,重且启动缓慢。VM主要为了提供系统环境,容器主要是为了提供应用环境。

三、K8S

3.1 架构图

![在这里插入图片描述](https://img-blog.csdnimg.cn/e67238f18053482991aac652a19ee083.png在这里插入图片描述

由 Master 节点和 Node 节点组成,Master为控制节点,Node为计算节点。

3.2 Master

Master节点负责维护集群的目标状态,由三个紧密协作的组件组成,分别为:

  • kube-api-server:提供 “声明式” API服务。
  • kube-scheduler:负责调度,将新创建的Pod安排到合适的几点运行。”合适的” 需要考虑Pod的资源需求、硬件/软件/策略约束、数据位置等。
  • kube-controller-manager:负责编排,用于调节系统状态。通过apiserver监控集群状态,并将状态调整为目标状态。现今,K8s自带的控制器包含:副本控制器、节点控制器、命名空间控制器和ServiceAccounts控制器。

整个集群状态的持久化放在etcd这个kv数据库中.

3.3 node

节点组件是Kubernetes中的worker机器,受到master的管理。节点可以是虚拟机(VM)或物理机器——Kubernetes在这两种类型的系统上都能良好运行。每个节点都包含运行pod的必要组件:

  • kubelet – 为位于那个节点上的pod监视API服务器,确保它们正常运行
  • cAdvisor - 收集在特定节点上运行着的pod的相关指标
  • kube-proxy - 监视API服务器,实时获取pod或服务的变化,以使网络保持最新
    容器运行时 - 负责管理容器镜像,并在该节点上运行容器

3.3.1 节点组件详解

总而言之就是,节点上运行着两个最重要的组件——kubelet和kube-proxy,除此之外还有一个负责运行应用容器化应用程序的容器引擎。

3.3.1.1 kubelet

kubelet处理着master和在其上运行的节点之间的所有通信。它以manifest的形式接收来自主设备的命令,manifest定义着工作负载和操作参数。它与负责创建、启动和监视pod的容器运行时进行接合。

kubelet还会周期性地对配置的活跃度探针和准备情况进行检查。它会不断监视pod的状态,并在出现问题时启动新实例。kubelet还有一个内部HTTP服务器,在端口10255上显示一个只读视图。除此之外,在/healthz上还有一个健康检查端点,以及一些其他状态端点。例如,我们可以在/pods获取正在运行的pod的列表。我们还可以在/spec获取kubelet正在运行的机器的详情。

3.3.1.2 kube-proxy

kube-proxy组件在每个节点上运行,负责代理UDP、TCP和SCTP数据包(它不了解HTTP)。它负责维护主机上的网络规则,并处理pod、主机和外部世界之间的数据包传输。它就像是节点上运行着的pod的网络代理和负载均衡器一样,通过在iptables使用NAT实现东/西负载均衡。

kube-proxy过程位于连接到Kubernetes的网络和在该特定节点上运行的pod之间。它本质上是Kubernetes的核心网络组件,负责确保跨集群的所有元素有效地进行通信。当用户创建Kubernetes服务对象时,kube-proxy实例会负责将该对象转换为位于worker节点的、本地iptables规则集上的有意义的规则。iptables用于将分配给服务对象的虚拟IP转换为服务映射的所有pod IP。

3.3.1.3 容器运行时

容器运行时负责从公有或私有镜像仓库中拉取镜像,并根据这些镜像运行容器。当下最流行的容器引擎无疑是Docker,不过Kubernetes还支持诸如rkt、runc等的其他容器运行时。正如我们在上文中提到过的,kubelet会直接与容器运行时交互,以启动、停止或删除容器。

3.3.1.4 cAdvisor

cAdvisor是一个开源代理,它能够监视资源使用情况并分析容器的性能。cAdvisor最初由谷歌创建,现在已与kubelet集成。

位于每个节点上的cAdvisor实例,会收集、聚合、处理和导出所有正在运行的容器的指标,如CPU、内存、文件和网络使用情况等。所有数据都将发送到调度程序,以确保调度程序了解节点内部的性能和资源使用情况。这些信息会被用于执行各种编排任务,如调度、水平pod扩展、管理容器资源限制等。

3.4 pod

Kubernetes为每个Pod都分配了唯一的IP地址,称之为Pod IP。一个Pod里多个容器共享Pod
IP地址。Kubernetes要求底层网络支持集群内任意两个Pod之间的TCP/IP直接通信(这通常使用虚拟二层网络技术来实现)。

Pod 是K8s基础单位,可以封装单个容器或多个容器,容器间共享网络、存储等。

3.4.1 主要使用方式

Pod 的两个主要用途如下所示:

  • 运行单个容器的 Pod

每个 Pod 一个容器的模型是最常见的使用情况,在这种情况下,可以将 Pod 看作单个容器的包装器,并且 Kubernetes 直接管理 Pod,而不是容器。

  • 运行多个协同工作的容器的 Pod

Pod 可能封装由多个紧密耦合且需要共享资源的共处容器组成的应用程序,Pod 将这些容器和存储资源打包为一个可管理的实体。

3.4.1 网络如何共享

  • 同一个 Pod 内部通讯:

同一个 Pod 共享同一个网络命名空间,共享同一个 Linux 协议栈。

  • 不同 Pod 之间通讯:

Pod1 和 Pod2 在同一台 Node 主机,由 docker0 网桥直接转发请求到 Pod2 上面
Pod1 和 Pod2 不在同一台 Node 主机,Pod 的地址是与 docker0 在同一个网段的,但 docker0 网络与宿主机网卡是两个完全不同的 IP 网段,并且不同的 Node 之间的通讯只能通过宿主机的物理网卡进行。

将 Pod 的 IP 地址和所在 Node 的 IP 地址关联起来,通过这个关联让 Pod 可以互相访问。

  • Pod 至 Service 的网络

目前基于性能考虑,全部为 iptables 或 lvs 维护和转发。

  • Pod 到外网

Pod 想外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主机网卡完成路由选择之后,iptables 或 lvs 执行 Masquerade,把源 IP 地址更改为宿主机的网卡的 IP 地址,然后向外网服务器发送请求。

  • 外网访问 Pod

通过 Service 服务来向外部提供 Pod 服务。

四、rancher

由于K8S自带的管理界面不太好,rancher开始流行起来管理K8S,通过界面方式操作yaml\json配置化文件。

4.1 Namespace

Namespace 是k8s 中非常重要的一种资源,它的主要作用是用来实现多套环境的资源隔离或多租户的资源隔离。

默认情况下,K8s 集群中所有的pod 都可以互相访问,但是在实际中,可能不想让两个pod 之间相互访问,这个时候就需要将这两个pod 划分到不同的namespace 之下,K8s 通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的“组”。 以方便不同组的资源进行隔离使用和管理。

可以根据K8s 授权机制,将不同的namespace 交给不同的租户进行管理。这样就实现了多租户的资源隔离。此时还可以结合K8s 的资源配额机制,限定不同的租户能占用的资源,如cpu 使用量, 内存使用量等等。 来实现租户可用资源的管理。

4.2 副本

一个pod是一组容器, k8s操作最小单位是pod, 如果pod副本设置多个,表示 有多个一样的pod同时在运行。

由于时间有限,后面有时间再写系列课程

猜你喜欢

转载自blog.csdn.net/qq_39813400/article/details/129044825