Kubernetes组件简介
Kubernetes(简称k8s)致力于提供跨主机集群的自动部署、扩展、高可用以及运行应用程序容器的平台。
k8s是什么
- 一个基于容器技术的分布式架构
- 一个一站式的完备的分布式系统开发和支撑平台
- 提供自动化机制,降低运维难度与成本的架构
在k8s中,Service是分布式集群架构的核心,一个Service对象拥有以下特征:
- 拥有唯一指定的名称
- 拥有一个虚拟IP(Cluster IP、Service IP 或 VIP)和端口号
- 能够提供某种远程服务能力
- 被映射到提供这种服务能力的一组容器应用上
k8s集群的组成
k8s由控制平面组件(master节点)、存储端和工作节点组成。
工作节点会托管 Pod ,而 Pod 就是作为应用负载的组件。
控制平面管理集群中的工作节点和 Pod。
在生产环境中,控制平面通常跨多台计算机运行, 一个集群通常运行多个节点,提供容错性和高可用性。
k8s集群由master(控制节点)和node(工作节点)组成。
master节点:整个集群的控制中枢,负责整个集群的管理和控制;
node节点:工作节点,应用服务部署至工作节点中;
load balance:一般用软件keepalive、HAproxy或者硬件F5虚拟VIP地址,使其对master节点的高可用,通过load balance能访问master节点的apiserver;云端使用SLB或者ELB提供该功能。
生产环境中通常采用3个master节点形成集群管理架构,node节点主要部署服务。
master节点各组件介绍:
master节点主要由APIServer、Scheduler、Controller-manager组件组成,及Etcd和pod网络( flannel、calico等 )
APIServer:
- 集群的控制中枢,各个模块之间信息交互都需要通过APIServer;
- API Server是k8s的前端接口,各种客户端工具以及k8s其他组件可以通过它管理集群的各种资源。(接受管理命令,对外接受命令结构)
- APIServer将集群状态和信息存储导分布式键-值(key-value)存储系统Etcd集群中;(包含删除pod、增加资源等;注意只有APIServer与Etcd通信,其他组件不与Etcd通信)
- 同时APIServer是集群管理、资源配置、整个集群安全机制的入口,为集群各类资源对象提供增删改查以及watch的REST API接口。(如namespace分配资源、RBAC)
Etcd:
- 负责保存k8s集群的配置信息和各种资源的状态信息,K8S中所有的服务节点的信息数据、配置数据都是存储在ETCD中,当数据发生变化时,etcd会快速的通知k8s相关组件。保证数据高可用、一致性,会把数据备份部署多份,即使一个服务也不影响使用。只有APIServer 与Etcd 通信,其他组件不与其通信。
- etcd属于键值数据库,保存集群的信息,一般生产环境中针对集群比较大的情况,建议部署三个以上节点(奇数个),并且与master节点区分开,不要部署在同一台主机上。对磁盘性能要求高,最好采用SSD硬盘;
Scheduler(kube-scheduler):
Scheduler 资源调度,负责决定将pod放在哪个node上运行。另外scheduler在调度时会充分考虑集群的架构,当前各个节点的负载,以及应用对高可用、性能、数据亲和性的需求。
- 集群pod调度中心,它会根据指定的一系列条件,选择一个或一批最佳的节点,然后部署我们的Pod。
- 它通过APIServer监听所有Pod状态,一旦发现新的未被调度到任何Node节点的pod(PodSpec.NodeName为空),就会根据一系列策略选择最佳节点进行调度。
Controller Manager:
Controller Manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。Controller Manager 由多种 controller 组成,包括 replication controller、endpoints controller、namespace controller、serviceaccounts controller 等。不同的 controller 管理不同的资源。例如 replication controller 管理 Deployment、StatefulSet、DaemonSet 的生命周期,namespace controller 管理 Namespace 资源。
- 集群的状态管理器,保证Pod或其他资源达到期望值,
- 也是需要和APIServer进行通信,在需要的时候创建、更新或删除它所管理的资源。
关于k8s控制组件中有状态服务与无状态服务的说明:
APIServer是无状态服务: 它会把集群状态和资源情况存储在Etcd中,当LB发出连接请求时,只会到1个apiserver中;
Scheduler和Controller-manager组件是有状态服务:
- Schedule和Controller-manager有"选主"机制,它们会选举出主节点和从节点,当监控到pod或其他资源出现异常状态需要重新修复或调度时,通过主节点进行控制调度。
- Scheduler和Controller-manager通过APIServer去监听pod状态,或者pod或其他资源副本数,
- 1.20版本下通过 “leases” 资源保存主节点信息在 “HOLDER” 中;
- 1.20以上、1.24版本通过 “ep” 中 “annotations” 保留主节点信息;
node节点各组件介绍:
由kubelet、kube-proxy、DNS、Calico网络、Runtime组件组成。
Kubelet:
负责监听节点上Pod的状态,同时负责上报节点和节点上面Pod的状态,负责与Master节点通信,并管理节点上面的Pod。
kubelet可以看作是node的agent,当scheduler确定在某个node上运行pod后,会将pod的具体配置信息发送给该节点的kubelet,kubelet会根据这些信息创建和运行容器,并向master报告运行状态。
Kube-proxy:
负责Pod之间的通信和负载均衡,将指定的流量分发到后端正确的机器上。一般为10249端口。
proxy是配合service实现从pod到service,以及从外部的node port 到 service的访问。每个 Node 都会运行 kube-proxy 服务,它负责将访问 service 的 TCP/UPD 数据流转发到后端的容器。如果有多个副本,kube-proxy 会实现负载均衡。
查看proxy模式命令为:
curl 127.0.0.1:10249/proxyMode
Ipvs:监听Master节点增加和删除service以及endpoint的消息,调用Netlink接口创建相应的IPVS规则。通过IPVS规则,将流量转发至相应的Pod上。Ipvs属于内核级转发。速度比Iptables快*
Iptables:监听Master节点增加和删除service以及endpoint的消息,对于每一个Service,他都会场景一个iptables规则,将service的clusterIP代理到后端对应的Pod。
eBPF网络插件
Calico:
符合CNI标准的网络插件,Calico给每个Pod生成一个唯一的IP地址,并且把每个节点当做一个路由器。Cilium原生只是eBPF
CoreDNS:
用于Kubernetes集群内部Service的解析,可以让Pod把Service名称解析成IP地址,然后通过Service的IP地址进行连接到对应的应用上。 通常CoreDNS的IP为k8s网段的第10个地址。
Runtime:
负责容器的管理。