目录结构

➜  kubernetes git:(release-1.22) tree -LC 1
.
├── CHANGELOG
├── CHANGELOG.md -> CHANGELOG/README.md
├── CONTRIBUTING.md
├── LICENSE
├── LICENSES
├── Makefile -> build/root/Makefile
├── Makefile.generated_files -> build/root/Makefile.generated_files
├── OWNERS
├── OWNERS_ALIASES
├── README.md
├── SECURITY_CONTACTS
├── SUPPORT.md
├── _output
├── api
├── build
├── cluster
├── cmd
├── code-of-conduct.md
├── docs
├── go.mod
├── go.sum
├── hack
├── logo
├── pkg
├── plugin
├── staging
├── test
├── third_party
└── vendor

16 directories, 13 files

除去一些证书,更新日志等文件之外,重点需要关注以下几个目录;

重点目录

  1. Makefile

    该文件表明kubernetes是使用编译工具make管理的,文件中定义了编译的命令,例如make all表明编译所有;

  2. _output

    该目录为默认的编译输出位置,其大致结构如下:

    ➜  _output git:(release-1.22) tree -L 4
    .
    ├── AGGREGATOR_violations.report
    ├── APIEXTENSIONS_violations.report
    ├── CODEGEN_violations.report
    ├── KUBE_violations.report
    ├── SAMPLEAPISERVER_violations.report
    ├── bin -> /Users/apple/code/kubernetes/_output/local/bin/darwin/amd64
    └── local
        ├── bin
        │   ├── darwin
        │   │   └── amd64
        │   └── go-bindata
        └── go
            ├── BUILD.bazel
            ├── bin
            │   ├── apiextensions-apiserver
            │   ├── conversion-gen
            │   ├── deepcopy-gen
            │   ├── defaulter-gen
            │   ├── e2e.test
            │   ├── gendocs
            │   ├── genkubedocs
            │   ├── genman
            │   ├── genswaggertypedocs
            │   ├── genyaml
            │   ├── ginkgo
            │   ├── go-bindata
            │   ├── go-runner
            │   ├── go2make
            │   ├── hyperkube
            │   ├── kube-aggregator
            │   ├── kube-apiserver
            │   ├── kube-controller-manager
            │   ├── kube-proxy
            │   ├── kube-scheduler
            │   ├── kubeadm
            │   ├── kubectl
            │   ├── kubectl-convert
            │   ├── kubelet
            │   ├── kubemark
            │   ├── linkcheck
            │   ├── mounter
            │   ├── openapi-gen
            │   └── prerelease-lifecycle-gen
    

    这些组件k8s的组件构成,编译时需要注意跨平台的问题,必要时使用交叉编译即可;

  3. api

    该目录用于提供swagger文档(铁打的文档,流水的swagger);

  4. build

    该目录是编译时调用的shell脚本,即Makefile会调用该目录中的脚本;

  5. cluster

    集群部署文档与脚本

  6. cmd

    重点,该目录为各个组件的入口函数所在,目录如下:

    ➜  cmd git:(release-1.22) tree -L 1
    .
    ├── OWNERS
    ├── clicheck
    ├── cloud-controller-manager
    ├── dependencycheck
    ├── gendocs
    ├── genkubedocs
    ├── genman
    ├── genswaggertypedocs
    ├── genutils
    ├── genyaml
    ├── importverifier
    ├── kube-apiserver
    ├── kube-controller-manager
    ├── kube-proxy
    ├── kube-scheduler
    ├── kubeadm
    ├── kubectl
    ├── kubectl-convert
    ├── kubelet
    ├── kubemark
    ├── linkcheck
    └── preferredimports
       
    21 directories, 1 file
    

    例如kube-apiserver组件的入口函数:

      cmd git:(release-1.22) cat kube-apiserver/apiserver.go 
    package main
       
    import (
     "math/rand"
     "os"
     "time"
       
     "github.com/spf13/pflag"
       
     cliflag "k8s.io/component-base/cli/flag"
     "k8s.io/component-base/logs"
     _ "k8s.io/component-base/logs/json/register"          // for JSON log format registration
     _ "k8s.io/component-base/metrics/prometheus/clientgo" // load all the prometheus client-go plugins
     _ "k8s.io/component-base/metrics/prometheus/version"  // for version metric registration
     "k8s.io/kubernetes/cmd/kube-apiserver/app"
    )
       
    func main() {
     rand.Seed(time.Now().UnixNano())
       
     pflag.CommandLine.SetNormalizeFunc(cliflag.WordSepNormalizeFunc)
       
     command := app.NewAPIServerCommand()
       
     logs.InitLogs()
     defer logs.FlushLogs()
       
     if err := command.Execute(); err != nil {
         os.Exit(1)
     }
    }
    
  7. hack

    该目录貌似是代码生成器使用

  8. pkg

    该目录为个组件的逻辑代码

阅读指导

组件的入口函数在cmd目录中,其会调用pkg目录下的包与方法