跳到主要内容

56.apiserver-01

目录结构​

.
├── Godeps
│   └── _workspace
├── api
│   ├── doc
│   └── examples
├── build
│   ├── build-image
│   ├── hello-kubernetes
│   ├── pause
│   └── run-images
├── cluster
│   ├── gce
│   ├── ovirt
│   ├── saltbase
│   └── vagrant
├── cmd
│   ├── apiserver
│   ├── controller-manager
│   ├── integration
│   ├── kubecfg
│   ├── kubelet
│   └── proxy
├── contrib
│   ├── completions
│   ├── logging
│   └── podex
├── docs
│   ├── getting-started-guides
│   └── man
├── examples
│   ├── guestbook
│   ├── guestbook-go
│   ├── update-demo
│   └── walkthrough
├── hack
│   └── e2e-suite
├── hooks
├── icebox
│   ├── cluster
│   └── release
├── pkg
│   ├── api
│   ├── apiserver
│   ├── auth
│   ├── capabilities
│   ├── client
│   ├── cloudprovider
│   ├── constraint
│   ├── controller
│   ├── conversion
│   ├── election
│   ├── health
│   ├── healthz
│   ├── httplog
│   ├── kubecfg
│   ├── kubelet
│   ├── labels
│   ├── master
│   ├── proxy
│   ├── registry
│   ├── resources
│   ├── runtime
│   ├── scheduler
│   ├── service
│   ├── tools
│   ├── ui
│   ├── util
│   ├── version
│   ├── volume
│   └── watch
├── plugin
│   ├── cmd
│   └── pkg
├── tes】、

n/.,mnbhgvfcdxsza
│   └── integration
├── third_party
│   ├── htpasswd
│   └── pause
└── www
└── partials

api/doc​

Kubernetes JSON Schema 是用于验证 Kubernetes 资源配置文件(如 Deployment, Service, ConfigMap 等)的工具。它使用 JSON Schema 格式定义了 Kubernetes API 的各个资源的规格,以此来验证 YAML 或 JSON 格式的 Kubernetes 资源配置是否正确。

JSON Schema 是一种 JSON 格式的数据结构描述语言,可以用于描述 JSON 数据的结构,同时可以为 JSON 数据提供数据验证、文档生成等功能。在 Kubernetes 中,可以使用 JSON Schema 来验证 Kubernetes 的资源配置,例如检查配置文件中是否包含必要的字段、字段的值是否在允许的范围内,等等。

简单地说,Kubernetes JSON Schema 可以帮助你确保你的 Kubernetes 配置文件格式正确,避免因为错误的配置导致的问题。

api/examples​

k8s 资源配置示例文件, controller , pod ,service

build​

将代码构建成镜像

cluster​

在gce vagrant 等基础设施上一键部署 k8s 的脚本

cmd​

服务入口: apiserver,controller-manager,kubecfg,kubelet,proxy

contrib​

一些小工具,比如podex, 从容器中提取k8s manifest

doc​

设计文档,架构图,提案,核心名词

examples​

部署在k8s上的demo应用

godeps​

包管理

hack​

一些 e2e 测试,签名、格式挂校验脚本

hooks​

提交commit千的校验

pkg​

核心主体代码所在目录

plugin​

调度器代码

test​

一些测试代码

third_party​

第三方工具

www​

网站代码

pkg​

├── api
│   ├── errors
│   ├── latest
│   ├── testapi
│   ├── v1beta1
│   ├── v1beta2
│   ├── v1beta3
│   └── validation
├── apiserver
├── auth
│   ├── authenticator
│   ├── handlers
│   └── user
├── capabilities
├── client
│   └── cache
├── cloudprovider
│   ├── aws
│   ├── fake
│   ├── gce
│   ├── ovirt
│   └── vagrant
├── constraint
├── controller
├── conversion
├── election
├── health
├── healthz
├── httplog
├── kubecfg
├── kubelet
│   ├── config
│   └── dockertools
├── labels
├── master
├── proxy
│   └── config
├── registry
│   ├── binding
│   ├── controller
│   ├── endpoint
│   ├── etcd
│   ├── event
│   ├── generic
│   ├── minion
│   ├── pod
│   ├── registrytest
│   └── service
├── resources
├── runtime
├── scheduler
├── service
├── tools
├── ui
├── util
│   ├── config
│   ├── exec
│   ├── iptables
│   └── wait
├── version
│   └── verflag
├── volume
└── watch
└── json

apiserver​

参数解释​

  1. port: 指定 API Server 监听的端口号,默认为 8080。
  2. address: 指定 API Server 监听的 IP 地址,默认为 127.0.0.1,即只能在本地访问。
  3. apiPrefix: 指定 API 请求的前缀,默认为 "/api",意味着 API 请求的路径将以 "/api" 开头。
  4. storageVersion: 指定资源存储的版本。Kubernetes 中的 API 资源会随着版本的升级而改变,通过该参数可以指定要存储的资源版本。如果未指定,则默认使用服务器首选的版本。
  5. cloudProvider: 指定云服务的提供商。如果集群运行在云平台上,可以通过该参数指定云服务提供商的名称。如果不需要云服务提供商支持,则保持为空字符串。
  6. cloudConfigFile: 指定云服务提供商的配置文件路径。如果使用云服务提供商,可以通过该参数指定云服务的配置文件。如果不需要配置文件,则保持为空字符串。
  7. minionRegexp: 当使用云服务提供商时,可以通过正则表达式匹配云平台上的节点(Minion VMs)。
  8. minionPort: 指定 Kubernetes Node(Minion)上 kubelet 组件监听的端口号,默认为 10250。
  9. healthCheckMinions: 布尔值,如果为 true,则会对 Kubernetes Node(Minion)进行健康检查,并过滤掉不健康的节点。默认为 true。
  10. minionCacheTTL: 指定缓存 Kubernetes Node(Minion)信息的时间间隔,默认为 30 秒。
  11. eventTTL: 指定事件(Event)保留的时间间隔,默认为 2 天。
  12. tokenAuthFile: 指定用于安全验证 API Server 的令牌认证的文件路径。如果设置了该参数,API Server 将使用文件中的令牌进行认证。
  13. etcdServerList: etcd 服务器列表,用于指定 API Server 连接的 etcd 实例。
  14. etcdConfigFile: etcd 客户端的配置文件路径。如果设置了该参数,API Server 将使用该文件中的配置与 etcd 进行通信。
  15. machineList: 要包含在机器列表中的节点名称列表。
  16. corsAllowedOriginList: 允许跨域请求的来源列表,用于设置 CORS(跨域资源共享)策略。
  17. allowPrivileged: 布尔值,如果为 true,则允许使用特权容器(privileged containers)。
  18. nodeMilliCPU: 每个节点(Node)分配的 CPU 容量,以 MilliCPU 为单位,默认为 1000。
  19. nodeMemory: 每个节点(Node)分配的内存容量,以字节为单位,默认为 3 GB。
  20. enableLogsSupport: 布尔值,如果为 true,则启用日志收集的服务器端点。

main 函数主体​

func main() {
flag.Parse()
util.InitLogs()
defer util.FlushLogs()

verflag.PrintAndExitIfRequested()
verifyMinionFlags()

if (*etcdConfigFile != "" && len(etcdServerList) != 0) || (*etcdConfigFile == "" && len(etcdServerList) == 0) {
glog.Fatalf("specify either -etcd_servers or -etcd_config")
}

capabilities.Initialize(capabilities.Capabilities{
AllowPrivileged: *allowPrivileged,
})

...
m := master.New(&master.Config{
Client: client,
Cloud: cloud,
...
NodeResources: api.NodeResources{
Capacity: api.ResourceList{
resources.CPU: util.NewIntOrStringFromInt(*nodeMilliCPU),
resources.Memory: util.NewIntOrStringFromInt(*nodeMemory),
},
},
})

mux := http.NewServeMux()
apiserver.NewAPIGroup(m.API_v1beta1()).InstallREST(mux, *apiPrefix+"/v1beta1")
apiserver.NewAPIGroup(m.API_v1beta2()).InstallREST(mux, *apiPrefix+"/v1beta2")


s := &http.Server{
Addr: net.JoinHostPort(address.String(), strconv.Itoa(int(*port))),
Handler: handler,
ReadTimeout: 5 * time.Minute,
WriteTimeout: 5 * time.Minute,
MaxHeaderBytes: 1 << 20,
}
glog.Fatal(s.ListenAndServe())

  • 这段代码是 Kubernetes API Server 的入口函数 main(),它启动一个 HTTP 服务器来处理对 Kubernetes API 的请求。让我们逐行解释代码的功能:
  1. flag.Parse(): 解析命令行参数,使得之后可以通过 flag 包获取对应的参数值。
  2. util.InitLogs(): 初始化日志记录。
  3. defer util.FlushLogs(): 在 main() 函数结束前,确保将缓冲的日志数据刷新到输出。
  4. verflag.PrintAndExitIfRequested(): 检查是否有版本相关的标志,如果有则打印版本信息并退出程序。
  5. verifyMinionFlags(): 验证关于 Minion(Node)的参数设置。
  6. if (*etcdConfigFile != "" && len(etcdServerList) != 0) || (*etcdConfigFile == "" && len(etcdServerList) == 0): 检查 etcd 相关的配置参数是否同时设置了,因为只能使用其中一种方式。
  7. capabilities.Initialize(): 初始化容器特权功能。
  8. initCloudProvider(*cloudProvider, *cloudConfigFile): 根据提供的云服务提供商和配置文件路径初始化云服务提供商对象。
  9. 创建一个 client.HTTPPodInfoGetter 对象,用于获取 Pod 信息。
  10. 创建 client.Config 对象,用于配置客户端连接 Kubernetes API Server。
  11. 创建 Kubernetes API 的客户端对象 client。
  12. 通过 newEtcd(*etcdConfigFile, etcdServerList) 创建一个 etcd 存储后端的辅助对象 helper,用于与 etcd 存储交互。
  13. 创建 master.Config 对象,其中包含 API Server 启动所需的各种配置信息。
  14. 使用 master.New() 创建一个 Kubernetes API Server 的主控制器对象 m。
  15. 创建一个 http.ServeMux 对象 mux,用于将不同的 HTTP 请求分发到不同的处理函数。
  16. 使用 apiserver.NewAPIGroup() 创建 API Group 并将其安装到 mux 中。
  17. apiserver.InstallSupport(mux): 安装一些 API Server 支持的功能,例如 版本,代理。
  18. if *enableLogsSupport { apiserver.InstallLogsSupport(mux) }: 如果启用了日志支持,就安装日志支持的 API 端点。
  19. ui.InstallSupport(mux): 安装 UI 的支持。
  20. handler := http.Handler(mux): 将 mux 转换为 http.Handler,用于处理 HTTP 请求。
  21. if len(corsAllowedOriginList) > 0 { ... }: 如果设置了跨域请求允许的来源列表,就添加 CORS 支持。
  22. if len(*tokenAuthFile) != 0 { ... }: 如果设置了令牌认证文件,就添加请求认证处理函数。
  23. handler = apiserver.RecoverPanics(handler): 添加一个恢复从处理器中恢复的 panic 的中间件。
  24. 创建一个 http.Server 对象 s,用于配置和启动 HTTP 服务器。
  25. glog.Fatal(s.ListenAndServe()): 启动 HTTP 服务器并监听来自客户端的请求。

release0.4 注册了2个版本组的资源,分别是v1️beta1以及v2beta2

    apiserver.NewAPIGroup(m.API_v1beta1()).InstallREST(mux, *apiPrefix+"/v1beta1")
apiserver.NewAPIGroup(m.API_v1beta2()).InstallREST(mux, *apiPrefix+"/v1beta2")
  • APIGroup 是 Kubernetes API Server 中的一个概念,用于组织一组相关的 REST 资源和它们的操作。NewAPIGroup 是一个辅助函数,用于创建一个 APIGroup 对象,该对象将会为一组 REST 资源和它们的操作提供服务。让我们逐行解释 NewAPIGroup 函数的代码:
  1. NewAPIGroup 接收四个参数:
  • storage:一个包含 REST 资源和对应操作的映射,用于存储资源的增删改查等操作。
  • codec:用于控制序列化和反序列化的编解码器,负责将资源对象转换为 JSON 或其他格式,并反之。
  • canonicalPrefix:API 资源的规范前缀,用于构建资源的 URL 路径。
  • selfLinker:用于生成资源的 self-link,即资源的唯一标识符。
  1. APIGroup 是 RESTHandler 的一个嵌入类型。APIGroup 封装了 REST 资源的处理和操作。
  2. 创建一个 APIGroup 对象,并使用提供的参数对其进行初始化。
  3. APIGroup 中的 asyncOpWait 设置了一个延迟,该延迟足够长以处理大多数简单的写操作。这是为了支持异步处理。

总体来说,NewAPIGroup 函数充当一个工厂方法,根据提供的参数创建并返回一个 APIGroup 对象,这个对象将管理一组 REST 资源的处理和操作。每个 APIGroup 对象都关联着一组 REST 资源和操作,它们会被注册到 API Server 上,以便客户端可以通过 API Server 访问和操作这些资源。

// InstallREST registers the REST handlers (storage, watch, and operations) into a mux.
// It is expected that the provided prefix will serve all operations. Path MUST NOT end
// in a slash.
func (g *APIGroup) InstallREST(mux mux, paths ...string) {
restHandler := &g.handler
watchHandler := &WatchHandler{g.handler.storage, g.handler.codec}
redirectHandler := &RedirectHandler{g.handler.storage, g.handler.codec}
opHandler := &OperationHandler{g.handler.ops, g.handler.codec}

servers := map[string]string{
"controller-manager": "127.0.0.1:10252",
"scheduler": "127.0.0.1:10251",
// TODO: Add minion health checks here too.
}
for _, prefix := range paths {
prefix = strings.TrimRight(prefix, "/")
proxyHandler := &ProxyHandler{prefix + "/proxy/", g.handler.storage, g.handler.codec}
mux.Handle(prefix+"/", http.StripPrefix(prefix, restHandler))
mux.Handle(prefix+"/watch/", http.StripPrefix(prefix+"/watch/", watchHandler))
mux.Handle(prefix+"/proxy/", http.StripPrefix(prefix+"/proxy/", proxyHandler))
mux.Handle(prefix+"/redirect/", http.StripPrefix(prefix+"/redirect/", redirectHandler))
mux.Handle(prefix+"/operations", http.StripPrefix(prefix+"/operations", opHandler))
mux.Handle(prefix+"/operations/", http.StripPrefix(prefix+"/operations/", opHandler))
if validator != nil {
mux.Handle(prefix+"/validate", validator)
}
}
}
  • 这段代码是 Kubernetes API Server 中的一个方法 InstallREST(),用于将 REST 资源(storage)、watch 以及操作(operations)的处理器注册到一个 mux(http.ServeMux 或类似对象)中,以便对外提供服务。让我们逐行解释代码的功能:
  1. func (g *APIGroup) InstallREST(mux mux, paths ...string) { ... }: 这是 APIGroup 结构体的一个方法。mux 是一个 http.ServeMux 或类似对象,用于处理 HTTP 请求。paths 是一个可变参数,用于指定要注册 REST 资源的 URL 前缀。
  2. 创建四个处理器对象:restHandler、watchHandler、redirectHandler 和 opHandler。这些处理器负责处理不同类型的请求。
  3. servers 是一个映射,用于保存与其它部分通信的组件的地址,如 controller-manager 和 scheduler 的地址。
  4. validator 是一个请求验证器,用于验证controller-manager 和 scheduler 是否健康
  5. 通过遍历 paths,将每个 URL 前缀注册到 mux 中。
  6. prefix = strings.TrimRight(prefix, "/"): 去除 URL 前缀结尾的斜杠,确保前缀格式正确。
  7. 创建 ProxyHandler 对象,它用于处理代理请求。proxyHandler 负责将请求代理到其他资源
  8. mux.Handle(prefix+"/", http.StripPrefix(prefix, restHandler)): 将 REST 资源处理器 restHandler 注册到指定前缀的路径上。
  9. mux.Handle(prefix+"/watch/", http.StripPrefix(prefix+"/watch/", watchHandler)): 将 watch 请求处理器 watchHandler 注册到指定前缀的路径上。
  10. mux.Handle(prefix+"/proxy/", http.StripPrefix(prefix+"/proxy/", proxyHandler)): 将代理请求处理器 proxyHandler 注册到指定前缀的路径上。
  11. mux.Handle(prefix+"/redirect/", http.StripPrefix(prefix+"/redirect/", redirectHandler)): 将重定向请求处理器 redirectHandler 注册到指定前缀的路径上。
  12. mux.Handle(prefix+"/operations", http.StripPrefix(prefix+"/operations", opHandler)) 和 mux.Handle(prefix+"/operations/", http.StripPrefix(prefix+"/operations/", opHandler)): 将操作请求处理器 opHandler 分别注册到指定前缀的路径上,用于处理操作请求。
  13. mux.Handle(prefix+"/validate", validator): 注册请求验证器到指定前缀的路径上,用于对请求进行验证。

总体来说,InstallREST() 方法负责将 Kubernetes API Server 中的 REST 资源、watch 以及操作的处理器注册到 mux 中,从而将这些资源和操作暴露给外部客户端通过 API Server 进行访问和操作。同时,还包括了对请求的验证和代理请求的处理。