API Server 详解:Kubernetes 集群的"中央神经系统"

This article is extracted from the chat log with AI. Please identify it with caution.

什么是 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 安全架构的第一道防线,实施三层防护:

  1. 认证(Authentication): “你是谁?”
  2. 授权(Authorization): “你能做什么?”
  3. 准入控制(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.crtAPI 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/namespaces

3. 常见问题解决#

问题可能原因解决方案
连接拒绝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航空公司代表,通过控制塔请求资源

当一架新航班到达(创建新资源):

  1. 航空公司代表向控制塔提交请求(API 请求)
  2. 安保人员验证身份(认证)
  3. 值班经理检查权限(授权)
  4. 操作团队检查是否符合安全规程(准入控制)
  5. 调度员分配登机口(调度)
  6. 信息同步到中央数据库(etcd)
  7. 地勤人员收到指令,准备接收航班(kubelet 操作)

API Server 作为这个复杂系统的中枢,确保国际机场(Kubernetes 集群)高效、安全、有序地运行。理解 API Server 是掌握 Kubernetes 架构的关键,它不仅是技术组件,更是 Kubernetes 声明式 API 和松耦合设计哲学的核心体现。

作为初学者,不必深入所有细节,但要理解其核心职责:所有集群操作的唯一入口点和状态同步的中心枢纽。随着实践经验的增加,你会逐渐欣赏这一设计的优雅和强大。

本文共 3057 字,创建于 Dec 31, 2025

相关标签: Kubernetes, ByAI