Kubernetes 源码分析之 kubelet(五)
k8s 版本 v1.18.3
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
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 中定义容器尚未真正被运行。
最后
为什么需要定时触发
syncCh
为什么需要
housekeeping
containerManager 以及 pod 的 cgroups 结构
volumeManager 以及 CSI
containerRuntime
敬请期待 Kubernetes 源码分析之 kubelet(六)