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 *cniNetworksync.RWMutexdefaultNetwork *cniNetworknsenterPath stringpluginDir stringvendorCNIDirPrefix string }
cniNetwork的结构如下所示:
type cniNetwork struct {name stringNetworkConfig *libcni.NetworkConfigCNIConfig libcni.CNI }
NetworkConfig的结构如下所示:
type NetworkConfig struct {Network *types.NetConfBytes []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.Mutexns ns.NetNSsymlink *os.Fileclosed boolrestored 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"
转载于:https://www.cnblogs.com/YaoDD/p/6043418.html
cri-o 与 cni的集成分析相关推荐
- 基因大数据的集成分析
基因大数据的集成分析 胡湘红1, 彭衡2, 杨灿3, 张纵辉1, 万翔1, 罗智泉1 1 深圳市大数据研究院,广东 深圳 518172 2 香港浸会大学数学系,香港 999077 3 香港科技大学数学 ...
- 需求理论:Web3集成分析
需求理论:Web3集成分析 对于每一个经济部分,都有从微观到中观的模式过渡.这意味着每一项经济活动都要从对执行微观部分的分析开始.要想完美估计利率,就需要对汇率活动进行微观整合,这也就意味着需求和供给 ...
- 非全研究生计算机网络-k8s网络插件(CNI)性能分析
由于计算机网络课程需要,看了一些k8s网络机制,随翻译了一篇论文,说实话有点空洞. 作者: Youngki Park School of Electronic Engineering Soongsil ...
- Sonar6.0应用之四:与Jenkins集成分析(Scanner+Maven)
一.安装并配置Jenkins. Jenkins 的前身是 Hudson 是一个可扩展的持续集成引擎.主要用于: 持续.自动地构建/测试软件项目,如CruiseControl与DamageControl ...
- 【FAQ】集成分析服务的常见问题及解决方案
常见问题一:如何验证Analytics是否上报/接入成功?以及关键日志含义是什么? 在初始化Analytics SDK前添加SDK日志开关如下: HiAnalyticsTools.enableLog ...
- 大数据Hive集成python分析框架—搜狗实验室(用户查询日志)—电影评分分析
一.Spark 大数据分析框架 1.1 数据结构 1.2 SQL语句简介 二.搜狗实验室(用户查询日志)数据分析 2.1获取数据集并初步分析: 2.2 创建数据库/表--导入数据分析 三.电影评分分析 ...
- 技术解析系列 | PouchContainer CRI的设计与实现
1. CRI简介 在每个Kubernetes节点的最底层都有一个程序负责具体的容器创建删除工作,Kubernetes会对其接口进行调用,从而完成容器的编排调度.我们将这一层软件称之为容器运行时(Con ...
- 全球及中国移动多媒体市场状况分析与运营模式咨询报告2022版
全球及中国移动多媒体市场状况分析与运营模式咨询报告2022版 ------------------------------------- <修订日期>:2022年2月 <出版单位& ...
- SQL Server 2005中的分析服务功能[转]
XXXX(不知道为什么CnBlogs上的人这么抵制XXXX,呵呵--)上推出了"体验SQL Server 2005"活动,当然啦,一些关于SQL Server 2005的文章被翻译 ...
最新文章
- 深入浅出Docker(一):Docker核心技术预览
- Android线程管理(一)
- WINCE对USB HOST供电的控制
- 零基础学习Java,全方位知识点总结!
- 变量延迟(setlocal)之浅见
- unity3d双面材质_unity3d 模型怎么双面显示?
- linux memcacheQ的安装与使用
- [UnityShader基础]06.#pragma multi_compile
- FISCO BCOS源码(3)线程交互和交易的生命周期
- DZ免费插件-discuz插件-DZ天堂
- 小鹏汽车面试经验分享
- Spring Security:自动登录(降低安全风险)
- Dagger2简单使用
- 医疗服务系统设计说明书
- coverity代码检测工具介绍_Coverity功能介绍
- mybatis中获取当前时间_MySQL NOW和SYSDATE函数:获取当前时间日期
- deepin升级Linux内核,深度 deepin 20.1 (1005)系统开启内测:升级至 Linux Kernel 5.8 稳定内核...
- 服务开通语音通知功能如何实现?服务开通语音提醒功能实现方案
- 达梦DM7数据库服务启动异常,管道文件已存在,DmAPService dead but pid file exists
- maya2018自带模型的打开
热门文章
- 我国博士生延期毕业率高达68.3%,导致博士延期原来是这10个原因
- 数据结构(十六)多源最短路径
- java indexof 通配符,字符串与含有通配符‘*’的字符串匹配(非正则表达式)
- android alarmmanager定时任务,AlarmManager 实现定时任务
- FTP安装及用户及权限配置
- 浪潮服务器2016销售额,Gartner:2016年前三季度浪潮服务器销售额中国第一
- Android设置Alpha值实现图片渐变效果
- 字段定义_ArcGIS开发amp;gdb、shapefile创建与投影定义,字段创建
- docker挂载本地目录_Docker:使用本地卷和tmpfs挂载
- 因为此网站使用了 hsts_长春定制小程序服务,网站设计市场价格