前言
通过kubeadm init/join k8s集群时,会涉及证书及kubeconfig配置文件的创建。尤其在多master节点情况下,还涉及多节点之前证书的一致性问题。本文期望从源代码角度分析这个创建流程。
版本
kubernetes v1.30
kubeadm简介
kubeadm包含在kubernetes项目中,作为一个k8s cmd存在。主要负责k8s集群的初始化和集群节点加入集群等功能。为物理机成为k8s节点创建需要的配置。
kubeadm整体代码分析
指令代码路径
/kubernetes/cmd/kubeadm
ls
app kubeadm.go OWNERS test
cat kubeadm.go
package main
import (
"k8s.io/kubernetes/cmd/kubeadm/app"
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
)
func main() {
kubeadmutil.CheckErr(app.Run())
ls app/
apis cmd componentconfigs constants discovery features images kubeadm.go phases preflight util
从上述代码可以看到kubeadm真正执行是app目录下的Run函数, 查看app目录,目录架构如上图所示,通过名字基本知道每个目录的作用。
package app
import (
"flag"
"os"
"github.com/spf13/pflag"
cliflag "k8s.io/component-base/cli/flag"
"k8s.io/klog/v2"
"k8s.io/kubernetes/cmd/kubeadm/app/cmd"
)
// Run creates and executes new kubeadm command
func Run() error {
klog.InitFlags(nil)
pflag.CommandLine.SetNormalizeFunc(cliflag.WordSepNormalizeFunc)
pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
pflag.Set("logtostderr", "true")
// We do not want these flags to show up in --help
// These MarkHidden calls must be after the lines above
pflag.CommandLine.MarkHidden("alsologtostderr")
..............
cmd := cmd.NewKubeadmCommand(os.Stdin, os.Stdout, os.Stderr)
// 最终调用command的Run函数
return cmd.Execute()
}
如上面代码所示,通过NewKubeamCommand创建指令,并通过Execute执行命令