目录

EdgeCore启动流程

EdgeCore的启动流程跟CloudCore十分类似,所以这篇文章会比较短。

配置文件的默认路径是 /etc/kubeedge/config/edgecore.yaml,然后也可以通过 --config 指定。

主要看一下RUN

刚开始也是校验读入的配置,然后就跟CloudCore不太一样了。

检查环境

// Check the running environment by default
checkEnv := os.Getenv("CHECK_EDGECORE_ENVIRONMENT")
// Force skip check if enable metaserver
if config.Modules.MetaManager.MetaServer.Enable {
   checkEnv = "false"
}
if checkEnv != "false" {
   // Check running environment before run edge core
   if err := environmentCheck(); err != nil {
      klog.Exit(fmt.Errorf("failed to check the running environment: %v", err))
   }
}

上面这段代码是判断是否需要检查环境,如果enable了metaserver则不需要检查。

我们来看一下environmentCheck具体是检查了什么。

// environmentCheck check the environment before edgecore start
// if Check failed,  return errors
func environmentCheck() error {
   processes, err := ps.Processes()
   if err != nil {
      return err
   }
  
   for _, process := range processes {
      switch process.Executable() {
      case "kubelet": // if kubelet is running, return error
         return errors.New("kubelet should not running on edge node when running edgecore")
      case "kube-proxy": // if kube-proxy is running, return error
         return errors.New("kube-proxy should not running on edge node when running edgecore")
      }
   }
   return nil
}

我们可以得知,当系统中运行着 kubeletkube-proxy 进程时,就会启动错误。

获取Node IP

// Get edge node local ip only when the custiomInterfaceName has been set.
// Defaults to the local IP from the default interface by the default config
if config.Modules.Edged.CustomInterfaceName != "" {
   ip, err := netutil.ChooseBindAddressForInterface(config.Modules.Edged.CustomInterfaceName)
   if err != nil {
      klog.Errorf("Failed to get IP address by custom interface %s, err: %v", config.Modules.Edged.CustomInterfaceName, err)
      os.Exit(1)
   }
   config.Modules.Edged.NodeIP = ip.String()
   klog.Infof("Get IP address by custom interface successfully, %s: %s", config.Modules.Edged.CustomInterfaceName, config.Modules.Edged.NodeIP)
} else {
   if net.ParseIP(config.Modules.Edged.NodeIP) != nil {
      klog.Infof("Use node IP address from config: %s", config.Modules.Edged.NodeIP)
   } else if config.Modules.Edged.NodeIP != "" {
      klog.Errorf("invalid node IP address specified: %s", config.Modules.Edged.NodeIP)
      os.Exit(1)
   } else {
      nodeIP, err := util.GetLocalIP(util.GetHostname())
      if err != nil {
         klog.Errorf("Failed to get Local IP address: %v", err)
         os.Exit(1)
      }
      config.Modules.Edged.NodeIP = nodeIP
      klog.Infof("Get node local IP address successfully: %s", nodeIP)
   }
}

如果Edged的配置中有CustomInterfaceName,那么就使用指定的接口来获取IP;

否则,先尝试从 Edged 的 NodeIP 读取;如果 Edged.NodeIP 没有配置,就先获取 hostname,然后根据hostname获取ip。

把这段if else写在RUN里面似乎有点不美观,感觉应该封装成一个方法。。

注册、启动

registerModules(config)
// start all modules
core.Run()

这里跟CloudCore没什么差别。