Kubernetes 核心概念
Kubernetes(通常简称为 K8s,因为“K”到“s”之间有 8 个字母)是一个用于自动化部署、扩展和管理容器化应用的强大平台。Kubernetes 的架构设计旨在提供高度可扩展、高可用性和易于管理的基础设施。下面是 Kubernetes 架构的主要组成部分及其功能解析:
主要组件
1. Master 节点
Master 节点是集群的大脑,它负责集群的管理和协调。Master 节点通常包含以下几个组件:
-
API Server:
- API Server 是集群的前端,它暴露了 RESTful API 接口,允许客户端与集群进行交互。
- API Server 是集群状态的主要来源,它还负责验证和配置数据,并提供集群的认证和授权。
-
etcd:
- etcd 是一个分布式的键值存储,用于保存集群的状态数据,如配置、密钥等。
- etcd 确保了数据的一致性和可靠性。
-
Controller Manager:
- Controller Manager 负责运行多个控制器,这些控制器负责执行集群的状态变更。
- 控制器的例子包括 ReplicaSet 控制器、Deployment 控制器、Endpoint 控制器等。
-
Scheduler:
- Scheduler 负责监听待调度的 Pod,并选择合适的 Node 来运行它们。
- Scheduler 会考虑 Node 的资源可用性、亲和性规则等因素来做出决策。
2. Worker 节点
Worker 节点(也称作 Node 或者 Minion)是集群中实际运行工作负载的地方。每个 Worker 节点包含以下组件:
-
kubelet:
- kubelet 是一个位于每个节点上的代理,它负责维护 Node 上的 Pod 状态与 API Server 中定义的状态一致。
- kubelet 负责启动和停止容器,并报告 Pod 的状态。
-
Container Runtime(如 Docker、Containerd、rkt 等):
- Container Runtime 负责拉取镜像、运行容器,并管理容器的生命周期。
- Kubernetes 支持多种容器运行时。
-
kube-proxy:
- kube-proxy 负责实现 Kubernetes 服务(Services)的网络规则。
- 它通过 iptables 或 IPVS 实现服务的负载均衡。
核心对象
Kubernetes 使用一组核心对象来定义和管理集群的状态。以下是几个重要的核心对象:
-
Pod:
- Pod 是 Kubernetes 中最小的可部署单位,它包含一个或多个容器。
- Pod 代表了一个或一组容器的逻辑主机。
-
ReplicaSet:
- ReplicaSet 确保任意时刻都有指定数量的副本(Pod)在运行。
- 它通常用于保证应用的高可用性。
-
Deployment:
- Deployment 是用于声明式更新应用状态的更高层次抽象。
- 它使用 ReplicaSet 来保证应用的副本数,并支持滚动更新。
-
Service:
- Service 定义了一个逻辑组的 Pod 以及如何访问它们(例如,网络流量应该如何到达 Pod)。
- Service 提供了一个稳定的 IP 地址和 DNS 名称,即使后端的 Pod 发生变化。
-
PersistentVolume (PV) 和 PersistentVolumeClaim (PVC):
- PV 是集群中的一部分存储资源,可以由用户申请。
- PVC 是用户对存储资源的请求,当一个 PVC 被绑定到一个 PV 后,用户就可以使用这个存储空间。
工作流程
-
用户通过 kubectl 发送命令:用户使用
kubectl
工具向 API Server 发送命令,如查询、创建、更新或删除资源。 -
API Server 接收请求:API Server 接收到请求后,验证请求并将其存储在 etcd 中。
-
Controller Manager 检测并同步状态:Controller Manager 中的控制器检测到状态的变化,并尝试使集群的状态与期望状态保持一致。
-
Scheduler 分配 Pod:当 Pod 创建后,如果没有指定具体的 Node,Scheduler 会选择一个合适的 Node 来运行 Pod。
-
kubelet 创建和管理容器:kubelet 根据 API Server 中的描述创建和管理容器。
-
kube-proxy 设置网络规则:kube-proxy 设置必要的网络规则,以便 Pod 可以相互通信,并对外暴露服务。
扩展性和插件化
Kubernetes 设计为高度可扩展和插件化的,支持通过自定义控制器、Webhook、Admission Controller 等机制来扩展其功能。此外,Kubernetes 支持多种存储插件、网络插件等,使其能够适应不同的基础设施环境。
通过理解 Kubernetes 的架构和核心组件,你可以更好地利用 Kubernetes 来管理容器化的应用和服务。
kubernetes网络
在 Kubernetes(K8s)环境中,“集群网络”指的是在集群内部如何管理和配置网络,以便容器化的应用程序能够互相通信,并且可以与外部网络进行交互。而“主机网络”则是指运行 Kubernetes 工作负载的物理或虚拟机器上的网络配置。
Kubernetes 集群网络
Pod 网络
- Pod 网络模型:在 Kubernetes 中,每个 Pod 都被视为拥有独立的网络栈,即每个 Pod 都有一个唯一的 IP 地址,并且所有的容器
共享
这个 IP 地址和端口空间。这意味着 Pod 内部的容器可以直接通过 localhost 相互访问。 - Pod 间的通信:Pod 之间的通信通常是通过 Kubernetes 内置的网络功能实现的,比如使用默认的
bridge
网络或其他第三方网络插件,如 Calico、Flannel、Cilium 等。
Service 网络
- Service:Kubernetes 的
Service
对象定义了一组 Pod 的逻辑集合以及访问它们的策略。Services 提供了一个抽象层来定义一组 Pod 的逻辑集合,并且提供了访问这些 Pod 的方法。 - Service 类型:
ClusterIP
:默认类型,为 Service 分配一个集群内部的 IP 地址。只有集群内部的客户端可以访问此 Service。NodePort
:为 Service 分配一个每个 Node 上的静态端口。任何 Node 上的客户端都可以通过<nodeIP>:<nodePort>
访问此 Service。LoadBalancer
:创建一个外部负载均衡器(云提供商或负载均衡硬件),并将外部 IP 地址映射到 NodePort 上的 Service。ExternalName
:通过返回CNAME
和其值来返回 Service 的外部 DNS 名称。
Ingress 网络
- Ingress 控制器:处理进入集群的 HTTP(S) 流量,并根据域名和路径将请求路由到相应的 Services。Ingress 控制器通常与负载均衡器一起工作,以提供更高级别的路由和负载均衡功能。
网络策略
- NetworkPolicy:允许集群管理员控制 Pod 间的通信规则,包括允许来自哪些 Pod 的入站流量,以及允许向哪些 Pod 发送出站流量。
主机网络
在 Kubernetes 集群中,主机网络指的是底层物理或虚拟机器的网络配置。这些机器可以是裸金属服务器、虚拟机或云实例。主机网络的重要性在于它影响了 Kubernetes 如何在其上构建和维护集群网络。
主机网络配置
- 物理网络接口:每个主机都至少有一个物理网络接口,用于连接到物理网络或虚拟交换机。
- 网络配置:主机的网络配置包括 IP 地址、子网掩码、网关、DNS 设置等信息。这些配置决定了主机如何与外部网络通信。
- 防火墙规则:为了安全起见,通常会在主机上配置防火墙规则来控制进出流量。
主机与集群网络的集成
- 网络插件:Kubernetes 集群使用的网络插件(如 Flannel、Calico 等)通常会在主机上安装代理程序,这些代理程序负责配置必要的网络接口、路由表项和其他网络资源,以支持集群内的网络通信。
- NAT 和路由:在多主机环境中,集群网络通常依赖于 NAT 和路由来确保 Pod 之间的通信能够跨越多个主机。
总之,Kubernetes 集群网络关注的是如何在集群内部实现容器间的通信和服务发现,而主机网络则关注的是如何配置和管理底层主机的网络设置,以支持集群网络的功能。两者相互作用,共同实现了 Kubernetes 集群的整体网络架构。