What Happen When K8S

查看原文

本文介绍了在命令行运行 kubectl run --image=nginx --replicas=3 时 Kubernetes 服务端和客户端的运行时。

  1. kubectl 会做 client-side validation, 通过校验的会通过 kubectl generator 组装 HTTP 请求可以发送到 kube-apiserver, 例如 deployment 会组装 DeploymentV1Beta1.
  2. 本地有一个 ~/.kube/cache/dicovery 用于缓存资源的 apiVersion, 例如,deployment 属于 apps/v1.
  3. kubectl 会根据 --kubeconfig 或者 $KUBECONFIG 读取 kubeconfig.
  4. 解析 kubeconfig, 获得 current context, current user, 在即将发出的请求上会附加 token.
  5. kube-apiserver 启动是需要配置 --client-ca-file 或者 --token-auth-file. 启动后就能处理 token
  6. Authorization: 身份验证通过后,kube-apiserver 会做授权验证,衍生这个 token 对应的身份是否有权限操作这个资源。
  7. kube-apiserver 接下来会做 admission control - 看这个资源能否被应用在 cluster 上,一般这些操作包括:安全,资源上限等等。
  8. kube-apiserver 接下来访问 etcd 更新资源。
  9. kube-controller-manager 接下来会负责在具体的机器上创建资源。例如对于 Deployment,它会创建 RepilcaSet / Pod。
  10. 此时资源还处于 Pending 状态;Scheduler 会监听事件并达到预期状态。例如,Pod 会被 scheduler 分配到一台 Node 上。
  11. kubelet 感知到自己需要创建 Pod(大约每 20 秒轮询),于是开始运行自己: 调用 CRI 启动容器,并登记到 Pod 元信息中。Pod 还需要 CNI 插件分配 IP 地址。不同机器间的 Pod 通信通过 overlay networking 实现 - 它可以将路由表同步到多台机器去。
  12. container 被运行起来,流程大约是 pull image,create container,register resource,报告状态。