在本文中,将介绍各种 Kubernetes 组件。
什么是 Kubernetes?
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化工作负载和服务,有助于声明式配置和自动化。
Kubernetes 架构或组件
Kubernetes 集群由一个控制平面和一组 工作机器(称为节点)组成。节点可以是虚拟机或物理服务器。应该有至少一个控制平面节点(正式称为主节点)来管理集群和至少一个工作节点(或从节点)。控制平面节点和工作节点都有自己的组件。
控制平面节点的组件:
- Kube API Server
- Kube Scheduler
- etcd
- Kube Controller Manager
- Cloud Controller Manager
1. Kube API Server:
控制平面的关键组件是 Kube API Server,它公开了一个 HTTP API,允许最终用户、集群的各个部分和外部组件相互通信。
Kubernetes API 让我们可以查询和操作 Kubernetes 中不同 API 对象的状态,比如 Pod、服务、复制控制器等。
Kubernetes API 服务器的主要实现是kube-apiserver。kube -apiserver旨在水平扩展,即通过部署更多实例进行扩展。您可以运行多个kube-apiserver实例并平衡这些实例之间的流量。
与 API Server 的交互可以通过三种方式完成:
2. Kube Scheduler
调度程序监控新创建的 Pod,并选择一个工作节点供他们运行。
3.etcd
etcd 是一个一致且高可用性的键值存储组件,存储 Kubernetes 的所有集群数据备,包括集群状态、集群配置等。
我们可以用 Zookeeper 和 Consul 等其他键值存储替换ectd,但是,etcd 是官方支持的 k/v 存储,并且是 Kubernetes 推荐和生产测试的选择。
4. Kube Controller Manager
通过 apiserver 监视集群的共享状态并进行更改以将当前状态移回所需状态的控制循环。
Kubernetes 带有一组内置控制器,它们在 kube-controller-manager 下运行,例如Job 控制器和Deployment 控制器。
5.cloud Controller Manager
云控制器管理器让我们 将集群链接到特定云提供商的 API,并将与该云平台交互的组件与仅与我们的集群交互的组件分开。
cloud-controller-manager 仅运行特定于特定云提供商的控制器。
工作节点的组件:
节点组件在每个节点上运行。它的工作是维护运行中的 pod 并提供 Kubernetes 运行时环境。
- Kubelet
- Kube Proxy
- Container runtime
- Containers & Pods
1. kubelet
Kubelet 相当于代理,分布在每个节点,定期从kube-apiserver组件接收新的或修改的Pod规范,并确保Pod及其容器在期望规范下运行。同时该组件作为工作节点的监控组件,向kube-apiserver汇报主机的运行状况。
2. Kube proxy
Kube Proxy 是运行在每个节点上的网络代理。它维护节点上的网络规则,这些网络规则允许从集群内部或外部的网络会话与我们的 Pod 进行网络通信。
3.Container runtime
容器运行时,也称为容器引擎,是一个软件组件,它的工作是运行容器。具体来说,容器运行时负责验证和加载容器镜像,监控系统资源,隔离和分配资源,还负责容器生命周期的管理。
为了执行所有这些活动,容器运行时使用标准化接口来协调资源,包括:
- 容器存储接口 (CSI)管理容器如何访问存储设备
- 容器网络接口 (CNI)说明 容器如何通过网络进行通信
容器运行时的一些示例是containerd、CRI-O、Docker Engine 和 Mirantis Container Runtime。
4. 容器和 Pod
Pod 是 Kubernetes中最小的单元。Pod 抽象出容器层,因此您可以直接与 Kubernetes 层交互。
Pod 旨在在多个容器中运行一个应用程序。例如,DB Pod、Job Pod、Frontend App Pod 和后端 API Pod。我们可以在同一个 Pod 中运行多个应用程序,但这些容器将紧密耦合。
每个 Pod 都有自己的私有 IP 地址。容器将在不同的端口上运行。容器可以通过 localhost 相互通信。
每个 Pod 都可以附加一个共享存储卷。Pod 中的所有容器将共享相同的卷。
当 Pod 中最后一个剩余的容器死亡或崩溃时,Pod 也会如此。当创建一个新 Pod 来替换死掉或崩溃的 Pod 时,该 Pod 将分配一个 IP 地址。IP 地址对于 Pod 来说是临时的,默认情况下它们不会持久存在。
上面的 K8s 架构中还提到了其他可选的 K8s 对象,例如 Deployment、ReplicaSet 等,我将在单独的文章中解释。