kubeadm init快速搭建k8s源码解析

目录
  • 引言
  • 下面的代码就都是为 init 命令绑定和添加一些标志
    • 以方法 AddInitConfigFlags 为例
    • kubeadm init --help 指令

引言

我们都知道,从头搭建k8s集群是个非常棘手的事情,所以在更多的情况下大家通常会选择通过 kubeadm 工具来搭建 k8s 集群。当我们执行 kubeadm init 命令后就可以进行 k8s 的快速搭建

根据k8s的官方文档以及源码,我们可以对整个 init 命令的工作原理做个了解,官方文档地址:
kubernetes.io/zh-cn/docs/…

从上一篇 Reset 文章中已经可以知道 kubeadm 源码的一些目录结构,进入 app/cmd 目录可以看到 init.go 文件,其中的方法:func newCmdInit(out io.Writer, initOptions *initOptions) *cobra.Command 就是 init 的入口函数

cmd := &cobra.Command{
   Use:   "init",
   Short: "Run this command in order to set up the Kubernetes control plane",
   RunE: func(cmd *cobra.Command, args []string) error {
      c, err := initRunner.InitData(args)
      if err != nil {
         return err
      }
      data := c.(*initData)
      fmt.Printf("[init] Using Kubernetes version: %s\n", data.cfg.KubernetesVersion)
      return initRunner.Run(args)
   },
   Args: cobra.NoArgs,
}

依然是对 cobra 库的一个应用, Use 来规定子命令,Short 来做简短描述,RunE用来将执行中的错误捕获并返回给调用者

下面的代码就都是为 init 命令绑定和添加一些标志

// add flags to the init command.
// init command local flags could be eventually inherited by the sub-commands automatically generated for phases
AddInitConfigFlags(cmd.Flags(), initOptions.externalInitCfg)
AddClusterConfigFlags(cmd.Flags(), initOptions.externalClusterCfg, &initOptions.featureGatesString)
AddInitOtherFlags(cmd.Flags(), initOptions)
initOptions.bto.AddTokenFlag(cmd.Flags())
initOptions.bto.AddTTLFlag(cmd.Flags())
options.AddImageMetaFlags(cmd.Flags(), &initOptions.externalClusterCfg.ImageRepository)
// defines additional flag that are not used by the init command but that could be eventually used
// by the sub-commands automatically generated for phases
initRunner.SetAdditionalFlags(func(flags *flag.FlagSet) {
   options.AddKubeConfigFlag(flags, &initOptions.kubeconfigPath)
   options.AddKubeConfigDirFlag(flags, &initOptions.kubeconfigDir)
   options.AddControlPlanExtraArgsFlags(flags, &initOptions.externalClusterCfg.APIServer.ExtraArgs, &initOptions.externalClusterCfg.ControllerManager.ExtraArgs, &initOptions.externalClusterCfg.Scheduler.ExtraArgs)
})

以方法 AddInitConfigFlags 为例

他的作用是将绑定到配置的初始化标志添加到指定的标志集:

// AddInitConfigFlags adds init flags bound to the config to the specified flagset
func AddInitConfigFlags(flagSet *flag.FlagSet, cfg *kubeadmapiv1.InitConfiguration) {
   flagSet.StringVar(
      &cfg.LocalAPIEndpoint.AdvertiseAddress, options.APIServerAdvertiseAddress, cfg.LocalAPIEndpoint.AdvertiseAddress,
      "The IP address the API Server will advertise it's listening on. If not set the default network interface will be used.",
   )
   flagSet.Int32Var(
      &cfg.LocalAPIEndpoint.BindPort, options.APIServerBindPort, cfg.LocalAPIEndpoint.BindPort,
      "Port for the API Server to bind to.",
   )
   flagSet.StringVar(
      &cfg.NodeRegistration.Name, options.NodeName, cfg.NodeRegistration.Name,
      `Specify the node name.`,
   )
   flagSet.StringVar(
      &cfg.CertificateKey, options.CertificateKey, "",
      "Key used to encrypt the control-plane certificates in the kubeadm-certs Secret.",
   )
   cmdutil.AddCRISocketFlag(flagSet, &cfg.NodeRegistration.CRISocket)
}

kubeadm init --help 指令

通过 kubeadm init --help 指令,可以看到相应的标志应用,例如服务地址,端口号等基本配置:

通过上面的 help 命令我们也可以看到,在 init 命令中就已经告诉了我们工作的几个流程阶段:

从源码中来看,绑定完一系列标志位后,init 命令正式开始绑定工作流程的执行,正好对应上图中的几个执行阶段:(集群的环境和源码的版本不是完全一致,集群的环境较为老旧一些,例如源码中的最后一个阶段 NewShowJoinCommandPhase 在集群命令中没有打印出来,因为老版本的最后一个阶段是放在命令绑定时的 RunE 中没有错误时最后执行的,最新的源码已经提取出来单独作为一个阶段了,基本逻辑还是没有变化的,调整后结构更加清晰合理了)

// initialize the workflow runner with the list of phases
initRunner.AppendPhase(phases.NewPreflightPhase())
initRunner.AppendPhase(phases.NewCertsPhase())
initRunner.AppendPhase(phases.NewKubeConfigPhase())
initRunner.AppendPhase(phases.NewKubeletStartPhase())
initRunner.AppendPhase(phases.NewControlPlanePhase())
initRunner.AppendPhase(phases.NewEtcdPhase())
initRunner.AppendPhase(phases.NewWaitControlPlanePhase())
initRunner.AppendPhase(phases.NewUploadConfigPhase())
initRunner.AppendPhase(phases.NewUploadCertsPhase())
initRunner.AppendPhase(phases.NewMarkControlPlanePhase())
initRunner.AppendPhase(phases.NewBootstrapTokenPhase())
initRunner.AppendPhase(phases.NewKubeletFinalizePhase())
initRunner.AppendPhase(phases.NewAddonPhase())
initRunner.AppendPhase(phases.NewShowJoinCommandPhase())

也就是说,kubeadm init 的执行共经历了14个阶段,分别是:

  • NewPreflightPhase:在做出变更前运行一系列的预检项来验证系统状态,可以通过指定 --ignore-preflight-errors=<错误列表> 参数来忽略错误
  • NewCertsPhase:生成一个自签名的 CA 证书来为集群中的每一个组件建立身份标识
  • NewKubeConfigPhase:建立配置目录及默认或指定的配置文件,以便 kubelet、控制器管理器和调度器用来连接到 API 服务器
  • NewKubeletStartPhase:在一个节点上启动 kubelet
  • NewControlPlanePhase:用来引导创建控制面节点,生成 apiserver、controller-manager、scheduler 静态pod描述文件
  • NewEtcdPhase:实现对 etcd 的处理,没有提供外部的 etcd 时,会生成一份 etcd 的静态资源文件
  • NewWaitControlPlanePhase:是在控制平面和 etcd 阶段之后运行的隐藏阶段,作用是等待控制面节点任务的执行,如果 kubelet 启动异常或者控制面节点崩溃将会停止后面的流程
  • NewUploadConfigPhase:上传配置
  • NewUploadCertsPhase:上传证书
  • NewMarkControlPlanePhase:为 master 做标记,即添加污点
  • NewBootstrapTokenPhase:生成bootstrap token和ca证书configmap,后续 node 可以通过生成的 token join加入集群
  • NewKubeletFinalizePhase:在 TLS 引导后更新与 kubelet 相关的设置,其实就是将kubelet与kube-apiserver通信的kubeconfig文件中的证书替换成由kube-controller-manager签发返回的证书
  • NewAddonPhase:通过 API 服务器安装一个 DNS 服务器 (CoreDNS) 和 kube-proxy 附加组件
  • NewShowJoinCommandPhase:打印初始化成功的命令,同时为用户提供后续的操作指导,例如工作节点的加入等

14个执行阶段都成功执行后,kubeadm 的任务也就完成了,k8s 集群部署成功!

以上就是kubeadm init快速搭建k8s源码解析的详细内容,更多关于kubeadm init搭建k8s的资料请关注我们其它相关文章!

(0)

相关推荐

  • K8S prometheus operator监控工作原理介绍

    目录 1. Prometheus Operator介绍 2. 它如何工作 3. ServiceMonitor 4. helm安装 5. yaml文件安装 5.1 安装 5.2 访问服务 5.3 接入grafana 6. 监控集群外的服务 6.1 exporter安装 6.2 K8S配置 1)官方格式 2) 创建资源 6.3 接入grafana 7 监控集群外的服务-redis 7.1 exporter安装 7.2 K8S配置 7.3 Prometheus检查 7.4 接入grafana 8. 监

  • k8s Service 实现服务发现和负载均衡

    目录 前言 Service 介绍 Service 的四种类型及使用方式 Service 的定义和使用 通过命令创建服务 查看创建的服务情况 不指定 Selectors 的服务 Headless 服务 Service 工作原理及原理图 Ingress 讲解 集群外部如何访问服务 总结 前言 本文将介绍 Kubernetes 的资源对象 Service,内容包括 Service 介绍.Service 的四种类型及使用方式.不指定 Selectors 的服务.Headless 服务.Service 工

  • K8S Operator部署及自定义详解

    目录 Kubernetes Operator是什么 分析之前部署过的Prometheus Operator 关于开发自定义的Operator Kubernetes Operator是什么 K8S Operator这个东西不好解释,这么说吧,比如有一个应用程序,并且想要将其部署到 k8s 上,并且希望能够实现自动化运维和可扩展性,那么就可以考虑使用 K8S Operator 的框架,将应用程序的管理逻辑抽象为 k8s 资源,并编写自定义 Operator 来管理和运维该应用程序. 还是有点懵?我举

  • k8s Job 执行一次性以及批处理任务使用场景案例

    目录 前言 Job 是什么 Job 的一些使用场景 Job 控制器 Job Spec 格式定义 Job pod 自动清理 暂停和重启 Job 案例讲解 使用 Job 的注意事项 总结 前言 Job 类型是 Kubernetes 资源对象之一,用于执行一次性任务或批处理作业. 本文将介绍 Kubernetes 的 Job 与相关概念,帮助理解和使用 Kubernetes 中的 Job. Job 是什么 Job 是一种 Kubernetes 资源对象,用于执行一次性任务或批处理作业. Job 可以控

  • k8s Ingress实现流量路由规则控制的定义格式类型

    目录 前言 什么是 Ingress Ingress 的定义格式 Ingress 的类型有哪几种? 1. Simple fanout 2. Name-based virtual hosting 3. Path-based routing 该如何实现更新 Ingress Ingress Controller Ingress Class 总结 前言 在 Kubernetes 中,Ingress 是一个非常重要的概念.它可以将外部流量路由到 Kubernetes 集群内的不同服务. Ingress 可以

  • 带你学会k8s 更高级的对象Deployment

    目录 Deployment 引入 Deployment & RC 对比 Deployment 创建 Deployment 滚动升级 Deployment 回滚 Deployment 扩容 总结 Deployment 引入 前面我们学习了 RC 和 RS 两种资源对象,它们的功能基本上是差不多的,唯一的区别就是 RS 支持集合的 selector. 另外,前面我们也了解了如何用 RC/RS 资源对象来控制 Pod 副本的数量,如何实现了滚动升级 Pod 的功能.现在回过头来看,似乎这些操作都比较完

  • skywalking源码解析javaAgent工具ByteBuddy应用

    目录 前言 Agent模块源码分析 第一步,加载配置信息: 第二步,加载需要被Agent的插件: 第三步,加载Agent端所需要的服务: 第四步,使用ByteBuddy增强插件定义的所有class: javaAgent的应用 BYTEBUDDY应用 通过委托实现Instrumentation 实现方法级别的安全性 实现安全功能的JAVAAGENT 前言 关于skywalking请看我上一篇博文,skywalking分布式服务调用链路追踪APM应用监控 其使用javaAgent技术,使得应用接入监

  • 源码解析ios开发SDWebImage方法

    目录 引言 源码解析 字典操作 看一下调用下载函数前的实例化过程 快速查找缓存的方法回调 开始进入查找函数 总结一下函数调用 1.先调用 2.设置图片 引言 在着手写第二篇的时候,发现这个SDWebimage确实吧NSOperation用的太美了.确实可能帮你理解NSOperation和NSOperationQueue,当然还有Block的队列.还有一个GCD. 各位看官在看的时候可以着重的看看他的operatinQueue的队列.看看是怎么添加到队列的以及是怎么移除队列.在后面的文章就会提到他

  • 使用sealos快速搭建K8s集群环境的过程

    目录 一.前言 二.sealos 三.准备环境 sealos 安装 虚拟机设置 网络 windows网络 虚拟机的网络 网卡配置 其他配置 RPM 源 四.安装开始 五.可能遇见的问题 sealos run的时候镜像下载缓慢 六.安装测试 安装Kubernetes Dashboard 一.前言 最近在做谷粒商城项目,搞到k8s了,但是跟这老师的方法一步一步做还是搭建不起来. 我不断的试错啊,各种bug都遇见了一个也没解决我真是啊哭死! 二.sealos 直到遇见一个大佬同学,告诉我sealos几

  • Kubernetes controller manager运行机制源码解析

    目录 Run StartControllers ReplicaSet ReplicaSetController syncReplicaSet Summary Run 确立目标 理解 kube-controller-manager 的运行机制 从主函数找到run函数,代码较长,这里精简了一下 func Run(c *config.CompletedConfig, stopCh <-chan struct{}) error { // configz 模块,在kube-scheduler分析中已经了解

  • Java源码解析之object类

    在源码的阅读过程中,可以了解别人实现某个功能的涉及思路,看看他们是怎么想,怎么做的.接下来,我们看看这篇Java源码解析之object的详细内容. Java基类Object java.lang.Object,Java所有类的父类,在你编写一个类的时候,若无指定父类(没有显式extends一个父类)编译器(一般编译器完成该步骤)会默认的添加Object为该类的父类(可以将该类反编译看其字节码,不过貌似Java7自带的反编译javap现在看不到了). 再说的详细点:假如类A,没有显式继承其他类,编译

  • 详解vue mint-ui源码解析之loadmore组件

    本文介绍了vue mint-ui源码解析之loadmore组件,分享给大家,具体如下: 接入 官方接入文档mint-ui loadmore文档 接入使用Example html <div id="app"> <mt-loadmore :top-method="loadTop" :bottom-method="loadBottom" :bottom-all-loaded="allLoaded" :max-dis

  • java中break和continue源码解析

    在自己学习java语言的过程中,很容易把break和continue的用法混淆.为了便于以后快速查阅及温习,在此特留学习笔记一份. 简述 在任何迭代语句的主体部分,都可以用break和continue控制循环的流程.其中,break用于强行退出循环,不执行循环中剩余的语句.而continue则停止执行当前迭代,然后退回循环起始处,开始下一次迭代. 源码 下面这个程序向大家展示了break和continue在for和while循环中的例子: package com.mufeng.thefourth

  • JAVA Vector源码解析和示例代码

    第1部分 Vector介绍Vector 是矢量队列,它是JDK1.0版本添加的类.继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口.Vector 继承了AbstractList,实现了List:所以,它是一个队列,支持相关的添加.删除.修改.遍历等功能.Vector 实现了RandmoAccess接口,即提供了随机访问功能.RandmoAccess是java中用来被List实现,为List提供快速访问功能的.在Vector中,我们即可以通过

  • BootStrap Tooltip插件源码解析

    Tooltip插件可以让你把要显示的内容以弹出框的形式来展示,如: 因为自己在工作的过程中,用到了Tooltip这个插件,并且当时正想学习一下元素定位的问题,如:提示框显示的位置就是触发提示框元素的位置,可以配置在上.下.左.右等位置,所以就去看了源码.对于整个插件源码没有看全,但也学到了许多的知识点.能力有限,可能其中有认识错误的地方,以后再补充吧 1 使用方法不介绍 ,可以参照 Bootstrap 提示工具(Tooltip)插件 2 源码解析 +function ($) { 'use str

  • vue 源码解析之虚拟Dom-render

    vue 源码解析 --虚拟Dom-render instance/index.js function Vue (options) { if (process.env.NODE_ENV !== 'production' && !(this instanceof Vue) ) { warn('Vue is a constructor and should be called with the `new` keyword') } this._init(options) } renderMixin

随机推荐