k8s组件间通信

k8s组件间通信

Kubernetes 多组件之间的通信原理:

  • apiserver 负责 etcd 存储的所有操作,且只有 apiserver 才直接操作 etcd 集群

  • apiserver 对内(集群中的其他组件)和对外(用户)提供统一的 REST API,其他组件均通过 apiserver 进行通信

    • controller manager、scheduler、kube-proxy 和 kubelet 等均通过 apiserver watch API 监测资源变化情况,并对资源作相应的操作

    • 所有需要更新资源状态的操作均通过 apiserver 的 REST API 进行

  • apiserver 也会直接调用 kubelet API(如 logs, exec, attach 等),默认不校验 kubelet 证书,但可以通过 --kubelet-certificate-authority 开启(而 GKE 通过 SSH 隧道保护它们之间的通信)

比如最典型的创建 Pod 的流程:

k8s pod
  1. 通过 CLI 或者 UI 提交 Pod 部署请求给 Kubernetes API Server

  2. API Server 会把这个信息写入到它的存储系统 etcd

  3. Scheduler 会通过 API Server 的 watch 或者叫做 notification 机制得到这个信息:有一个 Pod 需要被调度

    • 调度决策

    • 向 API Server report 说:“OK!这个 Pod 需要被调度到某一个节点上。”

  4. API Server 接收到这次操作之后,会把这次的结果再次写到 etcd 中

  5. 相应节点的 kubelet 会watch到一个需要启动的Pod

    • kubelet调CRI配置容器的运行环境、调CNI配置网络、调CSI接口配置存储

    • 上传状态信息给API Server

  6. API Server 记录Pod部署状态到etcd

最后更新于

这有帮助吗?