跳到主要内容

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. APIGroupRESTHandler 的一个嵌入类型。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. 创建四个处理器对象:restHandlerwatchHandlerredirectHandleropHandler。这些处理器负责处理不同类型的请求。
  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 进行访问和操作。同时,还包括了对请求的验证和代理请求的处理。