Kubernetes 是一种开源的容器编排平台,它可以自动化地部署、扩展和管理容器化应用程序。kube-apiserver 是 Kubernetes 架构中的核心组件之一,它充当 Kubernetes API 的前端,处理来自 Kubernetes API 的所有请求,并将其转发给其他组件进行处理。
kube-apiserver 是 Kubernetes 的控制平面组件之一,它充当 Kubernetes API 的前端。所有来自 Kubernetes API 的请求都将发送到 kube-apiserver,然后由它转发到适当的组件进行处理。kube-apiserver 还负责执行对 Kubernetes 资源的验证、授权和准入控制,并记录所有 API 请求的审计日志。此外,kube-apiserver 还可以对外部系统进行认证和授权,以便与 Kubernetes 进行交互。
(资料图)
kube-apiserver 的架构是一个多层的系统,由以下组件组成:
(1) HTTP Server
kube-apiserver 作为 HTTP Server 提供 HTTP(S) 服务。所有的 API 请求都通过 HTTP(S) 进行传输,并由 kube-apiserver 处理。
(2) Authentication
kube-apiserver 可以使用多种身份验证机制,包括基于令牌、证书和用户名/密码的身份验证。当客户端发起 API 请求时,kube-apiserver 会根据请求中的认证信息来验证其身份。
(3) Authorization
kube-apiserver 在处理 API 请求之前会执行授权检查,以确保请求的发起者有足够的权限执行该请求。kube-apiserver 使用 RBAC(Role-Based Access Control) 机制来管理 Kubernetes 资源的授权。
(4) Admission Control
kube-apiserver 在创建、修改和删除 Kubernetes 资源之前会执行准入控制检查,以确保这些操作符合 Kubernetes 系统的规范和限制。kube-apiserver 支持插件化的准入控制机制,可以通过插件来实现自定义的准入控制规则。
(5) API Registration
kube-apiserver 负责注册所有 Kubernetes API,包括 core API 和扩展 API。通过注册 API,kube-apiserver 使得所有的 Kubernetes 资源都可以通过 API 进行访问和管理。
(6) Etcd Storage
kube-apiserver 使用 Etcd 作为持久化存储,将 Kubernetes 资源的元数据保存在 Etcd 中。kube-apiserver 和 Etcd 之间使用一致性协议来保证数据的一致性和可靠性。
(7) Controller Manager
kube-apiserver 还包括一个 Controller Manager 组件,用于管理和运行 Kubernetes 的控制器。控制器是 Kubernetes 系统中的核心组件,用于确保 Kubernetes 系统的自愈能力。Controller Manager 负责监控 Kubernetes 中各种资源的状态,并根据需要执行自动化操作来保持系统的状态正确性。
(8) API Server Plugins
kube-apiserver 可以通过插件来扩展其功能。例如,kube-apiserver 支持 Webhook 插件,可以用于在 API 请求处理之前或之后执行自定义的操作。kube-apiserver 还支持 Admission Controller 插件,可以用于自定义准入控制规则。
kube-apiserver 启动时需要提供一系列参数来配置其行为。以下是一些常用的启动参数:
--advertise-address:指定 kube-apiserver 使用的 IP 地址。
--allow-privileged:是否允许容器运行在特权模式下。
--authorization-mode:指定 kube-apiserver 使用的授权模式,支持 RBAC、Node、Webhook 等多种授权模式。
--etcd-servers:指定 Etcd 的地址列表。
--insecure-bind-address:指定 kube-apiserver 监听的 IP 地址。
--service-account-key-file:指定服务账户的公钥文件路径。
--tls-cert-file:指定 TLS 证书文件路径。
--tls-private-key-file:指定 TLS 私钥文件路径。
以下是启动 kube-apiserver 的示例命令:
kube-apiserver --advertise-address=192.168.1.100 \--allow-privileged=true \--authorization-mode=RBAC \--etcd-servers=http://etcd-0:2379,http://etcd-1:2379,http://etcd-2:2379 \--insecure-bind-address=127.0.0.1 \--service-account-key-file=/etc/kubernetes/pki/sa.pub \--tls-cert-file=/etc/kubernetes/pki/apiserver.crt \--tls-private-key-file=/etc/kubernetes/pki/apiserver.key
在上面的示例中,kube-apiserver 使用 192.168.1.100 作为其 IP 地址,并允许容器运行在特权模式下。kube-apiserver 使用 RBAC 作为授权模式,使用三个 Etcd 节点作为其持久化存储,同时监听本地的 127.0.0.1 地址。kube-apiserver 使用 /etc/kubernetes/pki/sa.pub 作为服务账户的公钥文件,同时使用 /etc/kubernetes/pki/apiserver.crt 和 /etc/kubernetes/pki/apiserver.key 作为 TLS 证书和私钥文件。