/images/avatar.png

kubectl 执行一条命令之后发生了什么?

kubectl 是与 Kubernetes 集群交互的命令行工具,用户通过它可以对集群资源进行操作和管理。你有没有想过,当我们执行一条 kubectl 命令之后,背后都发生了什么?

详细过程

kubectl -> kube-api-server

根据通信类型,我把 kubectl 命令分为两类:单向通信和双向通信。

Kubernetes 集群内 DNS

DNS 简介

在互联网早期,随着连接设备数量的增加,IP 地址的管理与记忆变得越来越复杂。为了简化网络资源的访问,DNS(Domain Name System)应运而生。DNS 的核心作用是将用户可读的域名(如 www.example.com)解析为对应的 IP 地址(如 93.184.215.34),从而使用户无需记忆复杂的数字串,便能轻松访问全球各地的网络资源。

Kubernetes CNI 网络模型概览:VETH & Bridge / Overlay / BGP

序言

网络是容器通信的基础,Kubernetes 本身并未提供开箱即用的网络互通功能,只提出了两点基本要求:

  • pods can communicate with all other pods on any other node without NAT
  • agents on a node (e.g. system daemons, kubelet) can communicate with all pods on that node

至于如何实现这些通信能力,通常依赖于 CNI 插件来完成。

Kubernetes 之 kubelet 与 CRI、CNI 的交互过程

序言

当一个新的 Pod 被提交创建之后,KubeletCRICNI 这三个组件之间进行了哪些交互?

Kubelet -> CRI -> CNI

https://raw.githubusercontent.com/RifeWang/images/master/k8s/kubelet-cri-cni-sequence.png

如上图所示:

  1. Kubelet 从 kube-api-server 处监听到有新的 pod 被调度到了自己的节点且需要创建。
  2. Kubelet 创建 sandbox 并配置好 Pod 的环境,其中包括:
    • Kubelet 通过 gRPC 调用 CRI 组件创建 sandbox。
    • CRI 通过命令行调用 CNI 设置 pod 的网络。
  3. Kubelet 创建 container 阶段:
    • 调用 CRI 拉取镜像。
    • 调用 CRI 创建 container。
    • 调用 CRI 启动 container。

注意: