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
参数解释
port
: 指定 API Server 监听的端口号,默认为 8080。address
: 指定 API Server 监听的 IP 地址,默认为 127.0.0.1,即只能在本地访问。apiPrefix
: 指定 API 请求的前缀,默认为 "/api",意味着 API 请求的路径将以 "/api" 开头。storageVersion
: 指定资源存储的版本。Kubernetes 中的 API 资源会随着版本的升级而改变,通过该参数可以指定要存储的资源版本。如果未指定,则默认使用服务器首选的版本。cloudProvider
: 指定云服务的提供商。如果集群运行在云平台上,可以通过该参数指定云服务提供商的名称。如果不需要云服务提供商支持,则保持为空字符串。cloudConfigFile
: 指定云服务提供商的配置文件路径。如果使用云服务提供商,可以通过该参数指定云服务的配置文件。如果不需要配置文件,则保持为空字符串。minionRegexp
: 当使用云服务提供商时,可以通过正则表达式匹配云平台上的节点(Minion VMs)。minionPort
: 指定 Kubernetes Node(Minion)上 kubelet 组件监听的端口号,默认为 10250。healthCheckMinions
: 布尔值,如果为 true,则会对 Kubernetes Node(Minion)进行健康检查,并过滤掉不健康的节点。默认为 true。minionCacheTTL
: 指定缓存 Kubernetes Node(Minion)信息的时间间隔,默认为 30 秒。eventTTL
: 指定事件(Event)保留的时间间隔,默认为 2 天。tokenAuthFile
: 指定用于安全验证 API Server 的令牌认证的文件路径。如果设置了该参数,API Server 将使用文件中的令牌进行认证。etcdServerList
: etcd 服务器列表,用于指定 API Server 连接的 etcd 实例。etcdConfigFile
: etcd 客户端的配置文件路径。如果设置了该参数,API Server 将使用该文件中的配置与 etcd 进行通信。machineList
: 要包含在机器列表中的节点名称列表。corsAllowedOriginList
: 允许跨域请求的来源列表,用于设置 CORS(跨域资源共享)策略。allowPrivileged
: 布尔值,如果为 true,则允许使用特权容器(privileged containers)。nodeMilliCPU
: 每个节点(Node)分配的 CPU 容量,以 MilliCPU 为单位,默认为 1000。nodeMemory
: 每个节点(Node)分配的内存容量,以字节为单位,默认为 3 GB。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 的请求。让我们逐行解释代码的功能:
flag.Parse()
: 解析命令行参数,使得之后可以通过flag
包获取对应的参数值。util.InitLogs()
: 初始化日志记录。defer util.FlushLogs()
: 在main()
函数结束前,确保将缓冲的日志数据刷新到输出。verflag.PrintAndExitIfRequested()
: 检查是否有版本相关的标志,如果有则打印版本信息并退出程序。verifyMinionFlags()
: 验证关于 Minion(Node)的参数设置。if (*etcdConfigFile != "" && len(etcdServerList) != 0) || (*etcdConfigFile == "" && len(etcdServerList) == 0)
: 检查 etcd 相关的配置参数是否同时设置了,因为只能使用其中一种方式。capabilities.Initialize()
: 初始化容器特权功能。initCloudProvider(*cloudProvider, *cloudConfigFile)
: 根据提供的云服务提供商和配置文件路径初始化云服务提供商对象。- 创建一个
client.HTTPPodInfoGetter
对象,用于获取 Pod 信息。 - 创建
client.Config
对象,用于配置客户端连接 Kubernetes API Server。 - 创建 Kubernetes API 的客户端对象
client
。 - 通过
newEtcd(*etcdConfigFile, etcdServerList)
创建一个 etcd 存储后端的辅助对象helper
,用于与 etcd 存储交互。 - 创建
master.Config
对象,其中包含 API Server 启动所需的各种配置信息。 - 使用
master.New()
创建一个 Kubernetes API Server 的主控制器对象m
。 - 创建一个
http.ServeMux
对象mux
,用于将不同的 HTTP 请求分发到不同的处理函数。 - 使用
apiserver.NewAPIGroup()
创建 API Group 并将其安装到mux
中。 apiserver.InstallSupport(mux)
: 安装一些 API Server 支持的功能,例如 版本,代理。if *enableLogsSupport { apiserver.InstallLogsSupport(mux) }
: 如果启用了日志支持,就安装日志支持的 API 端点。ui.InstallSupport(mux)
: 安装 UI 的支持。handler := http.Handler(mux)
: 将mux
转换为http.Handler
,用于处理 HTTP 请求。if len(corsAllowedOriginList) > 0 { ... }
: 如果设置了跨域请求允许的来源列表,就添加 CORS 支持。if len(*tokenAuthFile) != 0 { ... }
: 如果设置了令牌认证文件,就添加请求认证处理函数。handler = apiserver.RecoverPanics(handler)
: 添加一个恢复从处理器中恢复的 panic 的中间件。- 创建一个
http.Server
对象s
,用于配置和启动 HTTP 服务器。 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
函数的代码:
NewAPIGroup
接收四个参数:
storage
:一个包含 REST 资源和对应操作的映射,用于存储资源的增删改查等操作。codec
:用于控制序列化和反序列化的编解码器,负责将资源对象转换为 JSON 或其他格式,并反之。canonicalPrefix
:API 资源的规范前缀,用于构建资源的 URL 路径。selfLinker
:用于生成资源的 self-link,即资源的唯一标识符。
APIGroup
是RESTHandler
的一个嵌入类型。APIGroup
封装了 REST 资源的处理和操作。- 创建一个
APIGroup
对象,并使用提供的参数对其进行初始化。 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 或类似对象)中,以便对外提供服务。让我们逐行解释代码的功能:
func (g *APIGroup) InstallREST(mux mux, paths ...string) { ... }
: 这是APIGroup
结构体的一个方法。mux
是一个http.ServeMux
或类似对象,用于处理 HTTP 请求。paths
是一个可变参数,用于指定要注册 REST 资源的 URL 前缀。- 创建四个处理器对象:
restHandler
、watchHandler
、redirectHandler
和opHandler
。这些处理器负责处理不同类型的请求。 servers
是一个映射,用于保存与其它部分通信的组件的地址,如 controller-manager 和 scheduler 的地址。validator
是一个请求验证器,用于验证controller-manager 和 scheduler 是否健康- 通过遍历
paths
,将每个 URL 前缀注册到mux
中。 prefix = strings.TrimRight(prefix, "/")
: 去除 URL 前缀结尾的斜杠,确保前缀格式正确。- 创建
ProxyHandler
对象,它用于处理代理请求。proxyHandler
负责将请求代理到其他资源 mux.Handle(prefix+"/", http.StripPrefix(prefix, restHandler))
: 将 REST 资源处理器restHandler
注册到指定前缀的路径上。mux.Handle(prefix+"/watch/", http.StripPrefix(prefix+"/watch/", watchHandler))
: 将 watch 请求处理器watchHandler
注册到指定前缀的路径上。mux.Handle(prefix+"/proxy/", http.StripPrefix(prefix+"/proxy/", proxyHandler))
: 将代理请求处理器proxyHandler
注册到指定前缀的路径上。mux.Handle(prefix+"/redirect/", http.StripPrefix(prefix+"/redirect/", redirectHandler))
: 将重定向请求处理器redirectHandler
注册到指定前缀的路径上。mux.Handle(prefix+"/operations", http.StripPrefix(prefix+"/operations", opHandler))
和mux.Handle(prefix+"/operations/", http.StripPrefix(prefix+"/operations/", opHandler))
: 将操作请求处理器opHandler
分别注册到指定前缀的路径上,用于处理操作请求。mux.Handle(prefix+"/validate", validator)
: 注册请求验证器到指定前缀的路径上,用于对请求进行验证。
总体来说,InstallREST()
方法负责将 Kubernetes API Server 中的 REST 资源、watch 以及操作的处理器注册到 mux
中,从而将这些资源和操作暴露给外部客户端通过 API Server 进行访问和操作。同时,还包括了对请求的验证和代理请求的处理。