Kubernetes 架构理解
整体架构
- Etcd 负责整个集群对象的数据存储
- ApiServer 负责访问集群的入口,会与 etcd 服务交互,其封装了核心对象的增删改查操作,以 RestfulAPI 的方式提供给外部组件和内部组件调用。维护的核心对象资源数据持久化到 Etcd 中存储。
- KubernetesScheduler 负责调度整个集群的 Node,新建立的 Pod 进行 Node 选择(即分配机器),调度集群资源,组件抽离,可以方便替换成其他调度器
- Replication Controller 负责管控集群组件的存活状态,比如故障检测、自动扩展、滚动更新等
- 插件支持,可移除可添加,不属于 K8S 组件本身
- CoreDNS 负责为整个集群提供 DNS 服务,可以提供网络端点固定访问方式
- IngressController 负责 K8S 中服务的外网入口,提供的是 7 层网络模型接口,对于官方的调度机制走的是 IPVS(4 层网络模型,不支持主机名域名),如 nginx-ingress,traffic-ingress
- Prometheus 负责整个集群资源的监控,时序数据库
- Federation 提供跨可用区的集群,提供不同数据中心的 K8S 集群管理能力
- Flunnel
- EFK
- ELK
- Node 可以理解为物理机
- Kubelet 负责维护容器的生命周期,同时也负责 Volume(CSI)和网络(CNI)的管理,上层对接 api server,下层通过 OCRI(OCI)对接 CRI,进一步访问 Docker,即 ApiServer <– 1 Kubelet -> OCRI(OCI) -> CRI -> Docker -> Container
- KubeProxy 负责为 Service 提供 Cluster 内部的服务发现和负载均衡,上层访问 api server,下层通过 netlinks(内核提供的接口,可以实现对应的防火墙以及 ipvs 对应的规则管控)接口,即 ApiServer <– KubeProxy –> NetLinks -> firewall/ipvs
- CRI (container runtime interface) 负责镜像管理以及 Pod 和容器的真正运行
Pod
Pod 中 Container 的数量必须是 >=1 的,一个 Pod 在启动的时候,K8S 会创建一个 pause 容器,然后 Pod 中的其他容器会共享 pause 容器初始化的网络空间栈,以及存储网络卷
pause 容器的作用:1. 初始化网络空间栈;2. 挂载网络卷
自举/自主方式
控制器管理方式
- HPA (HorizontalPodAutoscaler),工作在 RC,RS,Deployment 之上,负责控制 Pod 数量自动扩缩
- RC 负责控制副本数量,当副本数量较少的时候
- RS 除了 RC 具备的能力之外,具备根据标签选择 Pod,即根据标签做集合运算,选择一批 Pod
- Deployment 负责部署 Pod,如滚动更新,回滚
其他知识
- shell 中通过 trap 捕获 signal
比如一个 nginx 容器
- 直接通过/usr/local/nginx/sbin/nginx(entrypoint)启动,此时 entrypoint 为 1 号进程,当执行
docker stop
,docker 会尝试使用 signal 15,9 等去杀死容器,由 1 号进程(/usr/local/nginx/sbin/nginx)衍生出来的 3,4 等 nginx 子进程会由 1 号进程停止,容器优雅退出 - 通过 startup.sh(entrypoint)启动 nginx 进程,此时 startup.sh 为 1 号进程,当执行
docker stop
,docker 会尝试使用 signal 15,9 等去杀死容器,由 1 号进程startup.sh
通过trap
捕获对应的信号,并将信号传递给 nginx 主进程,进一步去杀死 nginx 子进程,此时容器才能优雅退出。执行顺序为 DockerDaemon > 1 号进程startup.sh
> 应用进程
-
Kubelet 与 ApiServer 的交互是怎样进行的 ↩︎