cri-o 与 cni的集成分析
// 创建pod时,network的设置
1、// cri-o/server/sandbox.go
// RunPodSandbox creates and runs a pod-level sandbox
func (s *Server) RunPodSandbox(ctx context.Context, req *pb.RunPodSandboxRequest) (*pb.RunPodSandboxResponse, error)
在该函数中先后调用了:
(0)、首先调用req.GetConfig().GetLinux().GetSecurityContext().GetNamespaceOptions().GetHostNetwork()
如果为true,则调用g.RemoveLinuxNamespace("network")和netNsPath, err = hostNetNsPath()
否则,Create the sandbox network namespace,先调用sb.netNsCreate(),再Pass the created namespace path to the runtime,即g.AddOrReplaceLinuxNamespace("network", sb.netNsPath())
(1)、container, err := oci.NewContainer(containerID, containerName, podSandboxDir, podSandboxDir, labels, nil, id, false)
sb.infraContainer = container
(2)、设置podNamespace := "",调用s.netPlugin.SetUpPod(netnsPath, podNamespace, id, containerName),为容器创建network
(3)、调用s.runContainer(container)
// pod创建完成,创建内部的container时,network的设置
// CreateContainer creates a new container in specified PodSandbox
1、// cri-o/server/container_create.go
func (s *Server) CreateContainer(ctx context.Context, req *pb.CreateContainerRequest) (res *pb.CreateContainerResponse, err error)
....
container, err := s.createSandboxContainer(containerID, containerName, sb, containerDir, containerConfig)
...
2、// cri-o/server/container_create.go
func (s *Server) createSandboxContainer(containerID string, containerName string, sb *sandbox, containerDir string, containerConfig *pb.ContainerConfig) (*oci.Container, error)
(1)、调用netNsPath := sb.netNsPath()
(2)、当netNsPath为""时,the sandbox does not have a permanent namespace, it's on the host,则调用netNsPath = fmt.Sprintf("/proc/%d/ns/net", podInfraState.Pid)
(3)、调用specgen.AddOrReplaceLinuxNamespace("network", netNsPath)
-------------------------------------------------------------------------- cni 初始化 --------------------------------------------------------------------------------------------------
cniNetworkPlugin的数据结构如下所示:
type cniNetworkPlugin struct {
loNetwork *cniNetwork
sync.RWMutex
defaultNetwork *cniNetwork
nsenterPath string
pluginDir string
vendorCNIDirPrefix string
}
cniNetwork的结构如下所示:
type cniNetwork struct {
name string
NetworkConfig *libcni.NetworkConfig
CNIConfig libcni.CNI
}
NetworkConfig的结构如下所示:
type NetworkConfig struct {
Network *types.NetConf
Bytes []byte
}
CNI的结构如下所示:
type CNI interface {
AddNetwork(net *NetworkConfig, rt *RuntimeConf) (*types.Result, error)
DelNetwork(net *NetworkConfig, rt *RuntimeConf) error
}
常量如下所示:
const ( DefaultInterfaceName = "eth0" CNIPluginName = "cni"
DefaultNetDir = "/etc/cni/net.d"
DefaultCNIDir = "/opt/cni/bin"
VendorCNIDirTemplate = "%s/opt/%s/bin" )
2、// cri-o/vendor/src/github.com/rajatchopra/ocicni.go
server的netPlugin字段初始化为:netPlugin, err := ocicni.InitCNI("")
func InitCNI(pluginDir string) (CNIPlugin, error)
(1)、首先调用plugin := probeNetworkPluginsWithVendorCNIDirPrefix(pluginDir, ""),返回一个默认的cniNetworkPlugin{}
(2)、plugin.nsenterPath, err = exec.LookPath(”nsenter“)
(3)、检查默认的network是否存在,如果不存在则停止CNI的查找,直接返回一个noop plugin,调用_, err = getDefaultCNINetwork(plugin.pluginDir, plugin.vendorCNIDirPrefix)
(4)、当有默认的network存在时,周期性地从pluginDir中读取网络配置的更新。即生成一个goroutine,每隔10s调用一次plugin.syncNetworkConfig()
3、// cri-o/vendor/src/github.com/rajatchopra/ocicni.go
func probeNetworkPluginsWithVendorCNIDirPrefix(pluginDir, vendorCNIDirPrefix string) (*cniNetworkPlugin)
配置获得 plugin := &cniNetworkPlugin {
defaultNetwork: nil,
loNetwork: getLoNetwork(vendorCNIDirPrefix),
pluginDir: pluginDir,
vendorCNIDirPrefix: vendorCNIDirPrefix,
}
最后调用plugin.syncNetworkConfig()并返回 return plugin,其中syncNetworkConfig首先调用network, err := getDefaultCNINetwork(plugin.pluginDir, plugin.vendorCNIDirPrefix),然后调用plugin.setDefaultNetwork(network)设置为plugin.defaultNetwork为network
4、//cri-o/vendor/src/github.com/rajachopra/ocicni.go
func getLoNetwork(vendorDirPrefix string) *cniNetwork
(1)、手动添加loConfig, err := libcni.ConfFromBytes([]byte(`{"cniVersion": "0.1.0", "name": "cni-loopback", "type": "loopback"}`))
(2)、调用cninet := &libcni.CNIConfig{Path: []string{vendorCNIDir(vendorDirPrefix, loConfig.Network.Type), DefaultCNIDir}}
并返回 reutrn loNetwork := &cniNetwork{name: "lo", NetworkConfig: loConfig, CNIConfig: cninet}
5、//cri-o/vendor/src/github.com/rajatchopra/ocicni.go
func getDefaultCNINetwork(pluginDir, vendorCNIDirPrefix string) (*cniNetwork, error)
(1)、当pluginDir为空时,将pluginDir设置为DefaultNetDir,为/etc/cni/net.d
(2)、调用files, err := libcni.ConfFiles(pluginDir),加载配置文件
(3)、若files不为空,则调用for循环,for _, confFile := range files
对于confFile,先调用conf, err := libcni.ConfFromFile(confFile)
再调用vendorDir := vendorCNIDir(vendorCNIDirPrefix, conf.Network.Type),cninet := &libcni.CNIConfig{Path: []string{DefaultCNIDir, vendorDir }}
其中vendorDir为"/opt/pluginType/bin"
最后,返回 return network := &cniNetwork{name: conf.Network.Name, NetworkConfig: conf, CNIConfig: cninet}
6、// cri-o/vendor/src/github.com/rajatchopra/ocicni.go
func vendorCNIDir(prefix, pluginType string) string
该函数仅仅return fmt.Sprintf(VendorCNIDirTemplate, prefix, pluginType)
7、// cri-o/vendor/src/github.com/rajatchopra/ocicni.go
func (plugin *cniNetworkPlugin) syncNetworkConfig()
(1)、调用network, err := getDefaultCNINetwork(plugin.pluginDir, plugin.vendorCNIDirPrefix)
(2)、再调用plugin.setDefaultNetwork(network)
8、// cri-o/vendor/src/github.com/rajatchopra/ocicni.go
func (plugin *cniNetworkPlugin) setDefaultNetwork(n *cniNetwork)
调用plugin.Lock(),再让plugin.defaultNetwork = n
------------------------------------------------------------------------------ 设置Pod的network ---------------------------------------------------------------------------------------------------
6、//cni-o/vendor/src/github.com/rajatchopra/ocicni.go
func (plugin *cniNetworkPlugin) SetUpPod(netnsPath string, namespace string, name string, id string) error
(1)、调用 plugin.checkInitialized(),判断plugin.defaultNetwork是否为空,若为空,返回错误
(2)、分别调用plugin.loNetwork.addToNetwork(name, namespace, id, netnsPath)和plugin.getDefaultNetwork().addToNetwork(name, namespace, id, netnsPath)
7、//cni-o/vendor/src/github.com/rajatchopra/ocicni.go
func (network *cniNetwork) addToNetwork(podName string, podNamespace string, podInfraContainerID string, podNetnsPath string) (*cnitypes.Result, error)
(1)、调用rt, err := buildCNIRuntimeConf(podName, podNamespace, podInfaraContainerID, podNetnsPath)
(2)、再调用netconf, cninet := network.NetworkConfig, network.CNIConfig,最后调用res, err := cninet.AddNetwork(netconf, rt)
(3) 、返回return res, nil
8、//cni-o/vendor/src/github.com/rajatchopra/ocicni.go
func buildCNIRuntimeConf(podName string, podNs string, podInfraContainerID string, podNetnsPath string) (*libcni.RuntimeConf, error)
该函数只是简单地填充libcni.RuntimeConf并返回
rt := &libcni.RuntimeConf {
ContainerID: podInfraContainerID,
NetNS: podNetnsPath,
IfName: DefaultInterfaceName,
Args: [][2]string {
{"IgnoreUnknown", "1"},
{"K8S_POD_NAMESPACE", podNs},
{"K8S_POD_NAME", podName},
{"K8S_POD_INFRA_CONTAINER_ID", podInfraContainerID},
}
}
--------------------------------------------------------------sandboxNetNs相关-------------------------------------------------------
sandboxNetNs结构如下所示:
type sandboxNetNs struct {
sync.Mutex
ns ns.NetNS
symlink *os.File
closed bool
restored bool
}
// cri-o/server/sandbox.go
1、func (s *sandbox) netNsCreate() error
(1)、调用netNS, err := ns.NewNS()
(2)、创建s.netns = &sandboxNetNs{ns: netNS, closed: false}
(3)、最后调用s.netns.symlinkCreate(s.name)
// cri-o/server/sandbox.go
2、func (ns *sandboxNetNs) symlinkCreate(name string) error
(1)、随机产生一个四位的byte b,nsName := fmt.Sprintf("%s-%x", name, b)以及symlinkPath := filepath.Join(nsRunDir, nsName) ---> nsRunDir默认为"/var/run/netns"
(2)、调用os.Symlink(ns.ns.Path(), symlinkPath)
(3)、fd, err := os.Open(symlinkPath),并且ns.symlink = fd
3、、func (s *sandbox) netNsPath() string
(1)、当s.netns == nil时,返回 ""
(2)、否则return s.netns.symlink.Name(),即地址"/var/run/netns/$nsName"
cri-o 与 cni的集成分析的更多相关文章
- Spark Streaming之四:Spark Streaming 与 Kafka 集成分析
前言 Spark Streaming 诞生于2013年,成为Spark平台上流式处理的解决方案,同时也给大家提供除Storm 以外的另一个选择.这篇内容主要介绍Spark Streaming 数据接收 ...
- CNI IPAM插件分析 --- 以hostlocal为示例
skel.CmdArgs数据结构如下所示: type CmdArgs struct { ContainerID string Netns string IfName string Args strin ...
- kubernetes/k8s CRI分析-容器运行时接口分析
关联博客:kubernetes/k8s CSI分析-容器存储接口分析 概述 kubernetes的设计初衷是支持可插拔架构,从而利于扩展kubernetes的功能.在此架构思想下,kubernetes ...
- kubernetes/k8s CRI分析-kubelet创建pod分析
先来简单回顾上一篇博客<kubernetes/k8s CRI 分析-容器运行时接口分析>的内容. 上篇博文先对 CRI 做了介绍,然后对 kubelet CRI 相关源码包括 kubele ...
- kubernetes/k8s CRI分析-kubelet删除pod分析
关联博客<kubernetes/k8s CRI 分析-容器运行时接口分析> <kubernetes/k8s CRI分析-kubelet创建pod分析> 之前的博文先对 CRI ...
- kubernetes/k8s CNI分析-容器网络接口分析
关联博客:kubernetes/k8s CSI分析-容器存储接口分析 kubernetes/k8s CRI分析-容器运行时接口分析 概述 kubernetes的设计初衷是支持可插拔架构,从而利于扩展k ...
- 景观指数分析 - 初识FragStats4.2
引 言 FragStats景观格局分析软件 ,简单扼要地说就是景观指数的集成分析环境,不用自己编写相关的算法和读/取文件的开发.根据了解,FragStats(Fragment Statistic)官方 ...
- 项目集成自动分词系统ansj,实现自定义词库
一,分词系统地址:https://github.com/NLPchina/ansj_seg 二,为什么选择ansj? 1.项目需求: 我们平台要做手机售后的舆情分析,即对购买手机的用户的评论进行分析. ...
- 3DGIS+BIM集成与智慧城市应用
ZTMap3D是基于网络的三维地理信息系统平台软件,利用 ZTMap3D能够实现三维地理信息和虚拟现实,是数字化地球和数字化城市建设的基础平台. BIM(building information mo ...
随机推荐
- ViewPager的使用
在上培训课的时候,老师一直在将ViewPager是现在的主流,一直想去好好的了解一下,今天去网上学习了一下 ,做一个总结: ViewPager其实就是后来谷歌提供给我们的一个组件,就像TextVi ...
- Linux Shell系列教程之(十二)Shell until循环
本文是Linux Shell系列教程的第(十二)篇,更多Linux Shell教程请看:Linux Shell系列教程 在上两篇文章Linux Shell系列教程之(十)Shell for循环和Lin ...
- CentOS修改服务器系统时间
linux安装完毕后,一般都是国外的世界,一点都不方便设置任务,或者导致网站获取本地的时间错乱,所以就需要把服务器的时间改为和本地时间一致,也就是换成中国的时间. 第一条指令:date –s '201 ...
- linux怎么模糊查找一个文件
linux如何模糊查找一个文件 在当前目录下搜索指定文件: find . -name test.txt 在当前目录下模糊搜索文件: find . -name '*.txt' 在当前目录下搜索特定属性的 ...
- DOM笔记整理及应用实例
一.前言 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model).HTML DOM 模型被构造为对象的树 通过可编程的对象模型,JavaScript 获得了足够的 ...
- 我所了解的WEB开发(3) - 彩虹的颜色
据说彩虹有七彩颜色,从外至内分别为:红.橙.黄.绿.青.蓝.紫.这些我倒是没有验证过,但是学生时代就不止一次色盲检测,还是让我足够确信对颜色的分辨应该和大多数人相似的. 还听说大多数哺乳动物是色盲.如 ...
- 个人收集整理的5Ucms标签
{field:cid} 当前栏目id {field:id} 当前页面id {field:content} 当前页面内容 [List:Modifytime $format=yy-mm-dd] 文章发布 ...
- ABAP - 3D Graphs with SAP
在ABAP设计中,程序员经常需要用图形显示报表的统计结果,我们可以使用函数:GRAPH_MATRIX_3D来达到图形显示.GRAPH_MATRIX_3D函数参数很多,但只有三个参数必须需要输入:Tab ...
- 转:Eclipse 一直不停 building workspace... 完美解决总结
原文地址: Eclipse 一直不停 building workspace... android开发论坛 juapk 完美解决总结 一.产生这个问题的原因多种 1.自动升级 2.未正确关闭 3.ma ...
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q63-Q65)
Question 63You have a SharePoint farm that has more than 100 custom Features.You upgrade several Fea ...