从这篇开始阅读一下kubernetes的源码,kubernetes是使用cobra构建的,如果对cobra还不了解的,可以查看我的上篇文章。
kubernetes的源码先从kubelet开始看起。
kubelet的启动文件在cmd/kubelet/kubelet.go,入口通过app.NewKubeletCommand()初始化了kubelet的command,这是一个*cobra.Command对象。kubelet启动核心就是command.Execute(),会执行cmd/kubelet/app/server.go中的Run函数。
func main() {
command := app.NewKubeletCommand()
code := run(command)
os.Exit(code)
}
func run(command *cobra.Command) int {
defer logs.FlushLogs()
rand.Seed(time.Now().UnixNano())
command.SetGlobalNormalizationFunc(cliflag.WordSepNormalizeFunc)
if err := command.Execute(); err != nil {
return 1
}
return 0
}
先看NewKubeletCommand函数,函数的主要功能就是通过cleanFlagSet来获取kubelet启动时传入的参数信息,通过NewKubeletFlags、NewKubeletConfiguration初始化一些默认flag和参数。最后将初始化好的各种参数传入再执行Run函数的时候传入。
func NewKubeletCommand() *cobra.Command {
cleanFlagSet := pflag.NewFlagSet(componentKubelet, pflag.ContinueOnError)
kubeletFlags := options.NewKubeletFlags()
kubeletConfig, err := options.NewKubeletConfiguration()
cmd := &cobra.Command{
Use: componentKubelet,
DisableFlagParsing: true,
RunE: func(cmd *cobra.Command, args []string) error {
// kubeadm部署时使用的是/var/lib/kubelet/config.yaml
if configFile := kubeletFlags.KubeletConfigFile; len(configFile) > 0 {
kubeletConfig, err = loadConfigFile(configFile)
// update feature gates based on new config
if err := utilfeature.DefaultMutableFeatureGate.SetFromMap(kubeletConfig.FeatureGates); err != nil {
return fmt.Errorf("failed to set feature gates from initial flags-based config: %w", err)
}
}
kubeletServer := &options.KubeletServer{
KubeletFlags: *kubeletFlags,
KubeletConfiguration: *kubeletConfig,
}
kubeletDeps, err := UnsecuredDependencies(kubeletServer, utilfeature.DefaultFeatureGate)
// set up signal context here in order to be reused by kubelet and docker shim
ctx := genericapiserver.SetupSignalContext()
return Run(ctx, kubeletServer, kubeletDeps, utilfeature.DefaultFeatureGate)
},
}
kubeletFlags.AddFlags(cleanFlagSet)
options.AddKubeletConfigFlags(cleanFlagSet, kubeletConfig)
options.AddGlobalFlags(cleanFlagSet)
return cmd
}
KubeletFlag指的是那些不允许在kubelet运行时进行修改的配置集,或者不能在集群中所有Nodes之间共享的配置。例如node ip等。
KubeletConfiguration指的是可以在集群中各个Nodes之间共享的配置集。
在较老的版本中,kubelet只有flag,直到1.10之后引入了KubeletConfiguration,通过flag中的--config参数传入本地文件,作为KubeletConfiguration的参数,kubeadm部署的kubelet本地文件在/var/lib/kubelet/config.yaml,内容如下:
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
anonymous:
enabled: false
webhook:
cacheTTL: 0s
enabled: true
x509:
clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:
mode: Webhook
webhook:
cacheAuthorizedTTL: 0s
cacheUnauthorizedTTL: 0s
cgroupDriver: systemd
clusterDNS:
- 10.1.0.10
clusterDomain: cluster.local
cpuManagerReconcilePeriod: 0s
evictionPressureTransitionPeriod: 0s
fileCheckFrequency: 0s
healthzBindAddress: 127.0.0.1
healthzPort: 10248
httpCheckFrequency: 0s
imageMinimu