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控制平面的一部分。
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) : 一组用于容器规格和运行时的标准
- kubelet接收来自api server请求,随后通过CRI与CRI-O对话来启动要求的容器
- CRI-O检查并拉取镜像
- CRI-O为容器生成OCI runtime规格
- CRI-O随后启动OCI兼容runtime(runc)安装规格去启动容器进程
Ref
- https://platform9.com/blog/kubernetes-enterprise-chapter-2-kubernetes-architecture-concepts/
- https://kubernetes.io/docs/concepts/overview/components/
- https://avinetworks.com/glossary/kubernetes-architecture/
- https://devopscube.com/kubernetes-architecture-explained/