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,如滚动更新,回滚

其他知识

  1. shell 中通过 trap 捕获 signal

比如一个 nginx 容器

  1. 直接通过/usr/local/nginx/sbin/nginx(entrypoint)启动,此时 entrypoint 为 1 号进程,当执行 docker stop,docker 会尝试使用 signal 15,9 等去杀死容器,由 1 号进程(/usr/local/nginx/sbin/nginx)衍生出来的 3,4 等 nginx 子进程会由 1 号进程停止,容器优雅退出
  2. 通过 startup.sh(entrypoint)启动 nginx 进程,此时 startup.sh 为 1 号进程,当执行 docker stop,docker 会尝试使用 signal 15,9 等去杀死容器,由 1 号进程startup.sh 通过trap捕获对应的信号,并将信号传递给 nginx 主进程,进一步去杀死 nginx 子进程,此时容器才能优雅退出。执行顺序为 DockerDaemon > 1 号进程startup.sh > 应用进程

  1. Kubelet 与 ApiServer 的交互是怎样进行的 ↩︎