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