什么是 API Server?#
API Server 是 Kubernetes 控制平面的核心组件和唯一前端接口。它是整个 Kubernetes 集群的"心脏",所有对集群的操作(创建、读取、更新、删除资源)都必须通过 API Server 进行。你可以把它理解为 Kubernetes 的统一指挥中心,所有组件间的通信都以它为枢纽。
API Server 在 Kubernetes 中的核心角色#
1. 集群的"唯一真相源"#
- API Server 是唯一可以直接与 etcd(集群数据库)交互的组件
- 所有组件(kubelet、scheduler、controller manager 等)必须通过 API Server 获取和更新状态
- 确保集群状态的一致性和可靠性
2. 组件通信的"中央交换机"#
graph LR A[scheduler] -->|查询未调度Pod| B(API Server) C[controller-manager] -->|监控资源变化| B D[kubelet] -->|报告节点状态| B E[用户/kubectl] -->|所有操作请求| B F[etcd] <-->|唯一数据读写| B
3. 安全的"守门人"#
API Server 是 Kubernetes 安全架构的第一道防线,实施三层防护:
- 认证(Authentication): “你是谁?”
- 授权(Authorization): “你能做什么?”
- 准入控制(Admission Control): “你请求的操作是否符合规则?”
API Server 的核心功能#
1. RESTful API 服务#
- 提供标准 HTTP/HTTPS 接口(GET/POST/PUT/DELETE)
- 支持多种数据格式(JSON、Protobuf)
- 内置 API 版本控制(v1、v1beta1 等)
- 提供 OpenAPI/Swagger 规范文档
2. 资源管理#
- 验证所有资源定义符合 Kubernetes API 规范
- 为每个资源分配唯一标识符(UID)和资源版本(ResourceVersion)
- 处理资源冲突(乐观锁机制)
- 管理自定义资源定义(CRD)
3. 事件与监控#
- 实现高效的 Watch 机制,允许客户端监控资源变化
- 生成和存储集群事件(如 Pod 调度事件)
- 提供集群状态的实时视图
4. 扩展机制#
- 支持聚合 API(将多个 API 服务器组合成一个统一接口)
- 允许第三方服务扩展 Kubernetes API
- 支持 Webhook 准入控制器,动态修改和验证资源
API Server 的工作流程#
当 API Server 接收到一个请求时,会按顺序执行以下步骤:
graph TD
A[客户端请求] --> B[身份认证]
B --> C{认证通过?}
C -->|否| D[返回401 Unauthorized]
C -->|是| E[权限授权]
E --> F{授权通过?}
F -->|否| G[返回403 Forbidden]
F -->|是| H[准入控制]
H --> I[验证和/或修改请求]
I --> J[数据验证]
J --> K[读写etcd]
K --> L[返回响应]1. 身份认证(Authentication)#
API Server 支持多种认证方式,按顺序尝试:
- X.509 客户端证书:最常用,kubeadm 自动生成
- Bearer Token:包括 ServiceAccount 令牌
- 静态令牌文件:简单场景使用
- OpenID Connect:与外部身份提供商集成
- Webhook 令牌:自定义认证后端
2. 权限授权(Authorization)#
认证通过后,API Server 检查请求是否有权限执行操作,支持:
- RBAC (Role-Based Access Control):最常用,基于角色的细粒度控制
- Node 授权:专门用于授权 kubelet
- Webhook:自定义授权后端
- ABAC (已弃用):基于属性的访问控制
3. 准入控制(Admission Control)#
授权通过后,请求经过一系列准入控制器,分为两类:
- 验证准入控制器:检查请求是否符合策略(如 ResourceQuota)
- 变异准入控制器:修改请求内容(如 DefaultStorageClass)
常用准入控制器:
| 控制器 | 功能 |
|---|---|
| NamespaceLifecycle | 阻止在终止中的命名空间创建资源 |
| LimitRanger | 为 Pod 设置默认资源请求/限制 |
| ServiceAccount | 为 Pod 自动分配 ServiceAccount |
| ResourceQuota | 实施命名空间资源配额限制 |
| PodSecurity | 执行 Pod 安全标准(替代已弃用的 PSP) |
API Server 的配置与部署#
1. 启动参数示例#
kube-apiserver \
--advertise-address=192.168.1.100 \ # 通告给集群其他成员的地址
--etcd-servers=https://127.0.0.1:2379 \ # etcd 服务器地址
--bind-address=0.0.0.0 \ # 绑定监听地址
--secure-port=6443 \ # HTTPS 安全端口
--service-cluster-ip-range=10.96.0.0/12 \ # Service IP 范围
--tls-cert-file=/etc/kubernetes/pki/apiserver.crt \
--tls-private-key-file=/etc/kubernetes/pki/apiserver.key \
--client-ca-file=/etc/kubernetes/pki/ca.crt \
--authorization-mode=Node,RBAC \ # 启用 Node 和 RBAC 授权
--enable-admission-plugins=NodeRestriction,PodSecurity \ # 启用准入插件
--audit-log-path=/var/log/apiserver-audit.log \ # 审计日志
--v=2 # 日志详细级别2. 在 kubeadm 集群中的部署#
在 kubeadm 部署的集群中,API Server 作为静态 Pod 运行:
- 配置文件位于:
/etc/kubernetes/manifests/kube-apiserver.yaml - 由 kubelet 直接管理,不受 Kubernetes 控制平面影响
- 修改配置文件会自动触发重启(kubelet 监控该目录)
3. 高可用架构#
生产环境必须部署多实例 API Server:
+-------------------+
| 负载均衡器 |
| (云LB/HAProxy) |
+-------------------+
/ \
/ \
+------------------+ +------------------+
| Master Node 1 | | Master Node 2 |
| +--------------+ | | +--------------+ |
| | kube-apiserver| | | | kube-apiserver| |
| +--------------+ | | +--------------+ |
| +--------------+ | | +--------------+ |
| | etcd |<-------------->| etcd | |
| +--------------+ | | +--------------+ |
+------------------+ +------------------+- 前端负载均衡器分发请求到多个 API Server 实例
- 所有 API Server 实例连接到同一个 etcd 集群
- 通常需要 3 个或更多实例实现高可用
API Server 的安全配置#
1. 证书管理#
API Server 依赖复杂的证书体系:
| 证书类型 | 用途 | 有效期 |
|---|---|---|
| apiserver.crt | 服务器 TLS 证书 | 1年(kubeadm 默认) |
| ca.crt | 集群根 CA 证书 | 10年 |
| apiserver-kubelet-client.crt | API Server 访问 kubelet 的客户端证书 | 1年 |
| front-proxy-ca.crt | 聚合 API 的 CA 证书 | 10年 |
2. 安全最佳实践#
- 禁用匿名访问:
--anonymous-auth=false - 启用审计日志:记录所有 API 请求
- 配置网络策略:限制对 API Server 端口的访问
- 定期轮换证书:防止证书过期导致集群不可用
- 最小权限原则:为每个用户/服务账户分配必需的最小权限
API Server 的监控与故障排除#
1. 关键监控指标#
| 指标类别 | 重要指标 | 健康阈值 |
|---|---|---|
| 请求性能 | 请求延迟(p99) | < 1s |
| 请求量 | 每秒请求数(RPS) | 根据集群规模 |
| 错误率 | 5xx 错误比例 | < 1% |
| 资源使用 | CPU/内存使用率 | < 70% |
| etcd 交互 | etcd 操作延迟 | < 100ms |
2. 常用诊断命令#
# 检查 API Server 状态
kubectl get --raw='/healthz?verbose'
# 查看 API Server 日志(在主节点)
docker ps | grep kube-apiserver # 找到容器ID
docker logs <container-id> --tail=100
# 检查所有 API 资源
kubectl api-resources
# 检查 API 服务器版本
kubectl version --short
# 直接调用 API(使用集群内部证书)
curl --cacert /etc/kubernetes/pki/ca.crt \
--cert /etc/kubernetes/pki/apiserver-kubelet-client.crt \
--key /etc/kubernetes/pki/apiserver-kubelet-client.key \
https://localhost:6443/api/v1/namespaces3. 常见问题解决#
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 连接拒绝 | API Server 未运行或端口错误 | 检查 kubelet 状态,查看静态 Pod 配置 |
| 证书错误 | 证书过期或不匹配 | 更新证书,检查系统时间 |
| 权限拒绝 | RBAC 配置错误 | 检查 ClusterRoleBinding/RoleBinding |
| 高延迟 | etcd 性能问题或资源不足 | 监控 etcd,增加 API Server 资源 |
| 无法创建资源 | 准入控制器阻止 | 检查准入控制器日志,调整配置 |
API Server 与其他组件的关系#
API Server 是 Kubernetes 架构的中心,与所有组件紧密交互:
与 etcd:
- API Server 是唯一直接读写 etcd 的组件
- 实现缓存机制减少 etcd 负载
- 处理 etcd 集群故障转移
与 kubelet:
- kubelet 通过 API Server 获取分配给节点的 Pod
- 定期向 API Server 报告节点状态和 Pod 状态
- 通过 API Server 获取 Secret 和 ConfigMap
与 scheduler:
- scheduler 监控 API Server 中未调度的 Pod
- 通过 API Server 更新 Pod 的 nodeName 字段
- 依赖 API Server 的资源视图进行调度决策
与 controller manager:
- 各种控制器(Deployment、ReplicaSet 等)通过 API Server 监控资源
- 基于观察到的状态与期望状态的差异,通过 API Server 进行修正
- 使用 API Server 的 Watch 机制实现高效状态同步
一个简单类比#
想象 Kubernetes 集群是一个大型国际机场:
- API Server 是机场的中央控制塔和调度中心
- etcd 是机场的中央数据库,存储所有航班、乘客和资源信息
- scheduler 是航班调度员,决定飞机停靠哪个登机口
- controller manager 是运营团队,确保机场按计划运行
- kubelet 是地勤人员,在各个登机口执行具体任务
- 用户/kubectl 是航空公司代表,通过控制塔请求资源
当一架新航班到达(创建新资源):
- 航空公司代表向控制塔提交请求(API 请求)
- 安保人员验证身份(认证)
- 值班经理检查权限(授权)
- 操作团队检查是否符合安全规程(准入控制)
- 调度员分配登机口(调度)
- 信息同步到中央数据库(etcd)
- 地勤人员收到指令,准备接收航班(kubelet 操作)
API Server 作为这个复杂系统的中枢,确保国际机场(Kubernetes 集群)高效、安全、有序地运行。理解 API Server 是掌握 Kubernetes 架构的关键,它不仅是技术组件,更是 Kubernetes 声明式 API 和松耦合设计哲学的核心体现。
作为初学者,不必深入所有细节,但要理解其核心职责:所有集群操作的唯一入口点和状态同步的中心枢纽。随着实践经验的增加,你会逐渐欣赏这一设计的优雅和强大。