Kubernetes 源码分析之 kubelet(五)
Version
k8s 版本 v1.18.3
CNI
CNI 严格来说不是 kubelet 的一部分,而是容器网络的标准,整个 kubelet 中涉及到 CNI 的部分主要在 dockershim 中(然而 dockershim 也要被废弃了)。但是 CNI 对于理解 pod 的生命周期仍然是至关重要的,因此本次分析还是聊一聊 CNI
简介
CNI(Container Network Interface) 定义了容器和网络的关系,提供了一套为容器设置网络的插件机制。
CNI 插件实际上是一个二进制可执行文件,通过环境变量和 stdin 获取参数。
CNI 可以指定的环境变量如下(v0.4.0)
-
CNI_COMMAND: ADD, DEL, CHECK, VERSION 四种,其中 CHECK 是 v0.4.0 新引入的
-
CNI_CONTAINERID: Container ID(CONTAINER 和 ID 间没有下划线,难受)
-
CNI_NETNS: network namespace 文件路径
-
CNI_IFNAME: interface 名字
-
CNI_ARGS: 一些调用参数,格式如 “FOO=BAR;ABC=123”
-
CNI_PATH: 用于寻找可执行文件的路径,类似 PATH。比如 ipam 插件的路径需要在这里设置
stdin 传入的是 JSON 格式的 network config 或者 network config list,二者的主要区别是 config list 会调用多个 plugin
以下是 network config 的主要字段
-
cniVersion: cni 版本
-
name: 网络名称
-
type: 插件名,就是插件的可执行文件名称
-
args: 容器运行时提供的额外参数
-
ipMasq: 是否在 host 进行 ip 伪装
-
ipam: ip 分配相关的配置
-
dns: dns 相关的配置
详细的说明可以看 CNI SPEC v0.4.0
另外,CNI 还定义了一些 convention 用于指导 plugin 应该如何接受一些独有的参数。
dockershim 中的 CNI
dockershim 中 CNI 的部分在 /pkg/kubelet/dockershim/network/cni.go
路径下,整个代码逻辑比较清晰,主要包括以下几个部分
-
plugin 相关的初始化
-
network config 的生成
-
portMappings
-
ipRanges
-
bandwidth
-
dns
-
为 pod 设置 network
-
默认还添加了 loopback 接口
-
将 pod 从 network 中删除
那么何时 CNI 被 dockershim 调用呢?通过搜索 SetUpPod
函数,可以发现在 /pkg/kubelet/dockershim/docker_sandbox.go
中的 RunPodSandbox
调用了该函数去设置网络。
那么 RunPodSandbox
做了什么呢?如果有看过 CRI 定义的话可以知道,CRI 中定义了一系列 PodSandbox
相关的接口,而 RunPodSandbox
实际上就是指运行 pause container 并为其设置 networking 等一系列的配置。
此时,pod 中定义容器尚未真正被运行。
最后
本次简单介绍了一下实际上和 kubelet 关系不大的 CNI,整理 kubernetes 的网络相关的内容,下次回到 kubelet 本身的实现中。
剩余
-
为什么需要定时触发
syncCh
-
为什么需要
housekeeping
-
containerManager 以及 pod 的 cgroups 结构
-
volumeManager 以及 CSI
-
containerRuntime
敬请期待 Kubernetes 源码分析之 kubelet(六)
点击屏末 | 阅 读 原 文 | 即刻学习