// 创建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的集成分析的更多相关文章

  1. Spark Streaming之四:Spark Streaming 与 Kafka 集成分析

    前言 Spark Streaming 诞生于2013年,成为Spark平台上流式处理的解决方案,同时也给大家提供除Storm 以外的另一个选择.这篇内容主要介绍Spark Streaming 数据接收 ...

  2. CNI IPAM插件分析 --- 以hostlocal为示例

    skel.CmdArgs数据结构如下所示: type CmdArgs struct { ContainerID string Netns string IfName string Args strin ...

  3. kubernetes/k8s CRI分析-容器运行时接口分析

    关联博客:kubernetes/k8s CSI分析-容器存储接口分析 概述 kubernetes的设计初衷是支持可插拔架构,从而利于扩展kubernetes的功能.在此架构思想下,kubernetes ...

  4. kubernetes/k8s CRI分析-kubelet创建pod分析

    先来简单回顾上一篇博客<kubernetes/k8s CRI 分析-容器运行时接口分析>的内容. 上篇博文先对 CRI 做了介绍,然后对 kubelet CRI 相关源码包括 kubele ...

  5. kubernetes/k8s CRI分析-kubelet删除pod分析

    关联博客<kubernetes/k8s CRI 分析-容器运行时接口分析> <kubernetes/k8s CRI分析-kubelet创建pod分析> 之前的博文先对 CRI ...

  6. kubernetes/k8s CNI分析-容器网络接口分析

    关联博客:kubernetes/k8s CSI分析-容器存储接口分析 kubernetes/k8s CRI分析-容器运行时接口分析 概述 kubernetes的设计初衷是支持可插拔架构,从而利于扩展k ...

  7. 景观指数分析 - 初识FragStats4.2

    引 言 FragStats景观格局分析软件 ,简单扼要地说就是景观指数的集成分析环境,不用自己编写相关的算法和读/取文件的开发.根据了解,FragStats(Fragment Statistic)官方 ...

  8. 项目集成自动分词系统ansj,实现自定义词库

    一,分词系统地址:https://github.com/NLPchina/ansj_seg 二,为什么选择ansj? 1.项目需求: 我们平台要做手机售后的舆情分析,即对购买手机的用户的评论进行分析. ...

  9. 3DGIS+BIM集成与智慧城市应用

    ZTMap3D是基于网络的三维地理信息系统平台软件,利用 ZTMap3D能够实现三维地理信息和虚拟现实,是数字化地球和数字化城市建设的基础平台. BIM(building information mo ...

随机推荐

  1. java之StringBuilder类详解

    StringBuilder 非线程安全的可变字符序列 .该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍).如果可能,建议优先采用该类,因为在 ...

  2. Struts2中 Result类型配置详解

    一个result代表了一个可能的输出.当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出.在com.opensymphony.xwor ...

  3. 什么是CSR证书申请文件?

      CSR是Cerificate Signing Request的英文缩写,即证书请求文件,在多方之间在互联网上安全分享数据的公钥基础架构PKI系统中,CSR文件必须在申请和购买SSL证书之前创建.也 ...

  4. windows下使用makecert命令生成自签名证书

    1.makecert命令路径 C:\Program Files (x86)\Windows Kits\8.1\bin\x64 2.生成一个自签名证书 makecert -r -pe -n " ...

  5. C语言动态调用库(转)

    转自:http://cloverprince.iteye.com/blog/481309 现有一个主程序用C语言写成.现在要允许第三方开发人员编写扩展的模块,约定第三方开发的模块必须提供一系列已知名称 ...

  6. SharpGL学习笔记(十四) 材质:十二个材质球

    材质颜色 OpenGL用材料对光的红.绿.蓝三原色的反射率来近似定义材料的颜色.象光源一样,材料颜色也分成环境.漫反射和镜面反射成分,它们决定了材料对环境光.漫反射光和镜面反射光的反射程度.在进行光照 ...

  7. Vue条件渲染

    gitHub地址:https://github.com/lily1010/vue_learn/tree/master/lesson08 一 v-if显示单个元素 注意else只能跟在v-if或者v-s ...

  8. .NET破解之google瓦片下载及拼接

    由于最近一些其他事忙,加之电脑显卡坏了,所以,好长一段时间没有更新博客了,感觉对不注关注我的朋友.从本文开始,博客更新频率将会大大降低,但每周都会更新的. 在上帝之眼论坛看到了新出来了一个google ...

  9. Oracle数据库中创建表空间语句

    1:创建临时表空间 create temporary tablespace user_temp tempfile 'Q:\oracle\product\10.2.0\oradata\Test\xyrj ...

  10. Lync 客户端:无法登陆到Lync,验证服务器中的证书时遇到问题

    安装完Lync客户端后,运行时Lync客户端时,报出如下错误: [原因解析] Lync客户端没有正确安装CA证书链. [解决办法] 第一种方法:将计算机加入域. 第二种方法:不加入域的处理方法: 1. ...