k8s各组件介绍
一.k8s中组件
1.etcd
键值对数据库。存储集群的整个状态,配置等。
参考:https://blog.csdn.net/w2009211777/article/details/123982273
2.kube-apiserver
是k8s所有组件交互的通道。其它组件不会两两交互,都通过apiServer组件交互
参考:https://www.jianshu.com/p/a6cc40ec3dfa
1. node和master之间通过load balancer负载均衡连接,node通过负载均衡可以访问到master的api-server
2. master上的controllerManager、Scheduler、kubelet都是通过load balancer来和api-server通信的,并不是直接通信
3. 只有api-server可以访问到etcd cluster存储
4. load-balancer可以通过多种策略生成(keepalived+nginx是其中一种)
5. api-server用来k8s架构中组件进行通信,开发者访问。客户访问node上的服务,通过kube-proxy
3.controllermanager
集群中每一个特定资源都会有相应的Controller来维护其状态,当资源当即或发生故障时,controller会通过apiserver提供的watch apiserver接口实时发现并执行自动化修复流程,而controller Manager是把所有的controller聚合起来,统一管理。比如改变副本数量,contruller会调用apiserver进行优化。
参考:https://www.cnblogs.com/liuxingxing/p/14388729.html
4.Scheduler
核心功能是监听apiserver 来获取 PodSpec.NodeName 为空的 pod,然后为每个这样的 pod 创建一个 binding 指示 pod 应该调度到哪个节点上。
在整个系统中起"承上启下"作用,承上:负责接收Controller Manager创建的新的Pod,为其选择一个合适的Node;启下:Node上的kubelet接管Pod的生命周期
5.kubelet
负责监听节点上pod的状态,同时上报节点和节点上面pod的状态,负责与master节点通信,并管理上面的pod。 参考: https://www.cnblogs.com/liuxingxing/p/14392399.html master节点装kubelet是为了可以看到master节点的状态(kubectl get node)
6.kube-proxy
kube-proxy:负责pod之间的通信和负载均衡,将指定的流量分发到后端正确的节点上 。
master可无。不是源pod
6.1 模式
修改kube-system模式
kubectl edit cm kube-proxy -n kube-system
查看Kube-Proxy模式:curl 127.0.0.1:10249/proxyMode
ipvs工作模式:监听master节点增加和删除service以及endpoint的消息,调用netlink接口创建相应的ipvs规则。通过ipvs规则,将流量转发到相应的pod上
-
查看kube-proxy的端口(30868是dashboard的service的端口)
-
查看ipvs规则路由
-
命令
kubectl get pods -n kubernetes-dashboard -owide
查看可以看到kube-proxy暴露的端口最后是转发到了node2的8443端口上
iptables规则:监听master节点增加和删除service以及endpoint的消息,对于每一个service,它都会创建一个iptables规则,将service的clusterip代理到后端对应的pod
6.3 模式对比
当模式非常多的时候,iptables性能极具下降,ipvs是基于内核的所以应用会相对来说更加宽泛
7.pod
-
k8s中最小的单元,由一组、一个或多个容器组成,每个pod包含一个pause容器,pause容器时pod的父容器,主要负责僵尸进程的回收管理
-
自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建
-
控制器创建的pod:kubernetes通过控制器创建的pod,这种pod删除了之后还会自动重建
为什么要有pod?
- k8s可编排的不止docker一种容器,只要是符合CRI标准都可以
- 一个pod中包括多个容器,容器之间通信简单
二.其他组件
1.calico
复合CNI标准的网络插件,会给每个pod生成一个唯一的ip地址,并把每个节点当作一个路由器,这样不同节点上的pod可跨节点进行相互通信
2.coredns
用于kubernetes集群内部service的解析,可以让pod把service名称解析成ip地址(每次创建service都跟之前不一样,所以一般都是通过名称来代表),然后通过service的ip地址进行连接到对应应用上。