1、K8s架构图:
2、K8s集群组件:
2.1、kube-api-server:
1、kube-api-server 是K8s集群的枢纽中心,最终用户和其他组件通过 kube-api-server 与集群通信。通信是通过TLS进行的,未经授权是无法通信的。
2、kube-api-server 是唯一与 ETCD 通信的组件。
3、控制平面组件和工作节点组件是通过 kube-api-server 来协调的。
2.2、ETCD:
1、etcd 是 Kubernetes 集群的数据库,所有的配置信息都存在这儿。俗称 Kubernetes 集群的大脑。
2、etcd 是1个分布式数据库,一般在多个节点上运行。
3、etcd 存储着 K8s集群的所有配置信息、状态、元数据(pod、secret、daemonsets、deployments、configmaps、statefulsts)。
4、数据存储位置 /registry。
2.3、kube-scheduler(k8s调度器):
1、kube-scheduler是k8s的调度器,负责调度 k8s 集群中的 pod。
2、在部署 pod 时,要设置 pod 的 CPU、内存、关联性、污点、容错、资源限制、优先级、持久卷等。
2.4、kube controller manager(k8s控制器):
1、检测集群实际状态和期望状态差异的。确保实际状态实时处于期望状态。
2、它内置了一些控制器列表管理各个模块:
1、Deployment controller:管理Deployment资源的
2、ReplicaSet controller:管理副本数资源的
3、DaemonSet controller:管理守护pod的,每个节点上都会运行一些基础的pod,通常是记录日志用的pod、kube proxy的pod等
4、Job controller:管理短期任务的执行,确保任务完成
5、CronJob controller:管理定时任务的执行,确保任务完成
6、endpoints controller:确保在 Pod 更改时及时更新 Endpoints,Service通过 Endpoints 对象,实现与 pod 通信
7、namespace controller:命名空间资源管理器
8、service account controller:管理 service account 生命周期的
9、Node controller:监控 Node 的状态,并处理相关事件
2.5、Cloud Controller Manager(CCM 云控制管理器):
1、云环境部署 K8s 时,云控制管理器充当云平台API和K8s之间的桥梁。
2、云控制管理器中包含3个主要组件:
1、节点控制器(Node controller):
这个控制器通过云厂商提供的API来更新节点的相关信息
2、路由控制器(Router controller):
控制在云平台上配置组网路由,实现不同节点的pod可以通信
3、服务控制器(Service controller):
为K8s服务部署负载均衡器,分配IP地址
2.6、kubelet:
1、集群的每个节点上都有 kubelet,当作守护程序运行的,由 systemd 管理。
2、向 kube-apiserver服务器 注册工作节点,把节点信息同步给 kube-aoiserver 。
3、创建、修改、删除容器,同步容器的状态。
4、kubelet 是个控制器,监控节点 pod 的变化。通过节点的运行时拉去、运行容器。
5、由 kubelet 直接管理的 pod 是 静态pod。通常从本节点的/etc/kubernetes/manifests目录下获取的 pod 信息。
6、kubelet 使用 CRI(容器运行时接口)gRPC接口 与容器运行时通信。
7、kubelet 使用 CSI(容器存储接口)gRPC 配置块存储卷。
8、kubelet 使用集群中配置 CNI插件 来分配 Pod IP地址,并为 pod 设置任何必要的网络路由和防火墙规则。
2.7、kube proxy:
1、负责网络通信和负载均衡。
2、是1个守护程序,作为 DaemonSet 运行在每个节点上。
3、kube proxy 会创建网络规则,将流量转发到 service分组 下的 后端pod,主要的流量协议是UDP、TCP、SCTP。
2.8、Container Runtime(容器运行时):
2.9、CNI插件(容器网络接口):
3、K8s集群对外暴露接口方式:
3.1、2种外部流量进入K8s集群的方式:
公有云的Loadbalancer模式和自有机房使用Ingress Controller模式 可以理解为1种。
3.1.1、公有云的Loadbalancer模式:
3.1.2、自有机房使用Ingress Controller模式:
3.1.3、NodeProt模式:
允许外部通信打开所有节点特定的接口,请求对应的服务。
3.2、1种只允许集群内部之间服务互相访问的方式:
3.3、3种访问方式的对比:
3.3.1、NodeProt:
通过每个虚拟机的固定端口访问对应服务的,但端口的数量是有限的。
具体流量流向为:
外部流量 ---> 各个虚拟机端口NodeProt(30000---32767) ---> kube-proxy ---> Service ---> Pod
3.3.2、ClusterIP:
只允许集群内部访问服务,不允许外部流量访问集群内服务。
具体流量流向为:
内部流量 ---> kube-proxy ---> Service ---> Pod
3.3.3、Loadbalancer/Ingress Controller:
Loadbalancer:一般云平台用来做外部流量负载均衡。
Ingress Controller:一般用自建机房时,用来做外部流量负载均衡。
3.3.3.1、LoadBalancer 4层(基于TCP/UDP) :
只能做端口转发。
具体流量流向为:
外部流量(公网IP:端口) ---> LoadBalancer 4层(公网IP:端口) ---> kube-proxy ---> Service ---> Pod
3.3.3.2、LoadBalancer 7层(基于HTTP/HTTPS) :
能做域名转发,将不同域名的流量转发到不同的端口。
具体流量流向为:
外部流量(域名、路径) ---> LoadBalancer 7层(基于域名、路径进行路由) ---> Ingress Controller 7层(根据规则将流量转发到具体的服务) ---> Service(通过kube-proxy转发到后端Pod) ---> kube-proxy ---> Pod
3.3.3.3、Ingress Controller 4层 :
只能做端口转发。
具体流量流向为:
外部流量(公网IP:端口) ---> Ingress Controller 4层 (公网IP:端口) ---> kube-proxy ---> Service ---> Pod
3.3.3.4、Ingress Controller 7层 :
能做域名转发,将不同域名的流量转发到不同的端口。
具体流量流向为:
外部流量(域名、路径) ---> Ingress Controller 7层 (基于HTTP/HTTPS的流量解析) ---> Service ---> kube-proxy ---> Pod