启动篇-01参数解析

入口

cmd/kube-apiserver/apiserver.go
func main() {  
   command := app.NewAPIServerCommand()  
   code := cli.Run(command)  
   os.Exit(code)  
}

NewAPIServerCommand

cmd/kube-apiserver/app/server.go
// NewAPIServerCommand 创建一个具有默认参数的 *cobra.Command 对象  
func NewAPIServerCommand() *cobra.Command {  
    s := options.NewServerRunOptions()  
    cmd := &cobra.Command{  
        Use: "kube-apiserver",  
        Long: `The Kubernetes API server validates and configures data  
for the api objects which include pods, services, replicationcontrollers, and  
others. The API Server services REST operations and provides the frontend to the  
cluster's shared state through which all other components interact.`,  
        // Kubernetes API Server 验证并配置 api 对象的数据,包括 pods、services、replicationcontrollers 等  
        // API Server提供 REST 操作服务,并通过前端提供集群的共享状态,所有其他组件都通过它进行交互  
  
        // 当命令出错时,停止打印用法  
        SilenceUsage: true,  
        PersistentPreRunE: func(*cobra.Command, []string) error {  
            // silence client-go warnings.  
            // kube-apiserver loopback clients should not log self-issued warnings.
            rest.SetDefaultWarningHandler(rest.NoWarnings{})  
            return nil  
        },  
        RunE: func(cmd *cobra.Command, args []string) error {  
            verflag.PrintAndExitIfRequested()  
            fs := cmd.Flags()  
             
            // 尽快启动日志,然后显示最终日志配置的标志。  
            if err := logsapi.ValidateAndApply(s.Logs, utilfeature.DefaultFeatureGate); err != nil {  
                return err  
            }  
            cliflag.PrintFlags(fs)  
  
            // 设置默认选项  
            completedOptions, err := Complete(s)  
            if err != nil {  
                return err  
            }  
  
            // 验证选项  
            if errs := completedOptions.Validate(); len(errs) != 0 {  
                return utilerrors.NewAggregate(errs)  
            }  
            // 添加 feature enablement metrics
            utilfeature.DefaultMutableFeatureGate.AddMetrics()  
            return Run(completedOptions, genericapiserver.SetupSignalHandler())  
        },  
        Args: func(cmd *cobra.Command, args []string) error {  
            for _, arg := range args {  
                if len(arg) > 0 {  
                    return fmt.Errorf("%q does not take any arguments, got %q", cmd.CommandPath(), args)  
                }  
            }  
            return nil  
        },  
    }  
  
    fs := cmd.Flags()  
    namedFlagSets := s.Flags()  
    verflag.AddFlags(namedFlagSets.FlagSet("global"))  
    globalflag.AddGlobalFlags(namedFlagSets.FlagSet("global"), cmd.Name(), logs.SkipLoggingConfigurationFlags())  
    options.AddCustomGlobalFlags(namedFlagSets.FlagSet("generic"))  
    for _, f := range namedFlagSets.FlagSets {  
        fs.AddFlagSet(f)  
    }  
  
    cols, _, _ := term.TerminalSize(cmd.OutOrStdout())  
    cliflag.SetUsageAndHelpFunc(cmd, namedFlagSets, cols)  
  
    return cmd  
}

Run

cmd/kube-apiserver/app/server.go
// 运行指定的 APIServer,永远不会退出
func Run(completeOptions completedServerRunOptions, stopCh <-chan struct{}) error {  
    // To help debugging, immediately log version  
    klog.Infof("Version: %+v", version.Get())  
  
    klog.InfoS("Golang settings", "GOGC", os.Getenv("GOGC"), "GOMAXPROCS", os.Getenv("GOMAXPROCS"), "GOTRACEBACK", os.Getenv("GOTRACEBACK"))  

    // 创建 apiservers 链,包括 kubeAPIServer、apiExtensionsServer、aggregatorServer
    server, err := CreateServerChain(completeOptions)  
    if err != nil {  
        return err  
    }
      
    // 设置 openapi 相关
    prepared, err := server.PrepareRun()  
    if err != nil {  
        return err  
    }  

    // 启动
    return prepared.Run(stopCh)  
}

最后更新于

这有帮助吗?