Skip to content

API Server 深度解析

核心定位

API Server 是 Kubernetes 集群的唯一入口和核心网关,所有组件(kubectl、Controller Manager、Scheduler、kubelet)都通过 API Server 与集群交互,没有任何组件直接访问 etcd。

kubectl / SDK / Controller


    ┌─────────────────────────────────────────┐
    │              API Server                  │
    │  认证 → 授权 → 准入控制 → 序列化 → etcd  │
    └─────────────────────────────────────────┘


       etcd

请求处理流水线

1. 认证(Authentication)

支持多种认证方式,按顺序尝试:

X.509 客户端证书  →  Bearer Token  →  HTTP Basic Auth
       │                  │
       ▼                  ▼
  ServiceAccount    OIDC / Webhook
bash
# 查看当前用户身份
kubectl auth whoami

# 使用 ServiceAccount Token 访问
curl -H "Authorization: Bearer $TOKEN" \
     https://kubernetes.default.svc/api/v1/pods

2. 授权(Authorization)

默认使用 RBAC(基于角色的访问控制):

请求 → Node Authorizer → RBAC → Webhook → 拒绝
yaml
# 检查权限
kubectl auth can-i create pods --namespace=default
kubectl auth can-i '*' '*' --all-namespaces  # 是否是集群管理员

3. 准入控制(Admission Control)

准入控制器在对象持久化前对请求进行拦截和修改:

变更准入(Mutating)→ 对象验证 → 验证准入(Validating)

内置准入控制器:

控制器作用
NamespaceLifecycle防止在终止中的命名空间创建资源
LimitRanger应用默认资源限制
ResourceQuota强制命名空间资源配额
PodSecurity强制 Pod 安全标准
MutatingAdmissionWebhook调用外部 Webhook 修改对象
ValidatingAdmissionWebhook调用外部 Webhook 验证对象

API 版本与分组

/api/v1                          # 核心 API(Pod、Service、ConfigMap 等)
/apis/apps/v1                    # apps 组(Deployment、StatefulSet 等)
/apis/networking.k8s.io/v1       # 网络组(Ingress、NetworkPolicy)
/apis/rbac.authorization.k8s.io/v1  # RBAC 组
/apis/apiextensions.k8s.io/v1    # CRD 扩展
bash
# 查看所有 API 组
kubectl api-versions

# 查看所有资源类型
kubectl api-resources

# 查看 API 详情
kubectl explain deployment.spec.strategy

Watch 与 List 机制

API Server 实现了高效的 Watch 机制,基于 HTTP/2 长连接:

go
// client-go 中的 Watch 调用
watcher, err := clientset.CoreV1().Pods("default").Watch(ctx, metav1.ListOptions{
    ResourceVersion: "0",  // 从最新版本开始
})
for event := range watcher.ResultChan() {
    switch event.Type {
    case watch.Added:
    case watch.Modified:
    case watch.Deleted:
    }
}

ResourceVersion 机制:

  • 每次写操作都会递增全局 ResourceVersion
  • Watch 可以从指定 ResourceVersion 开始,不丢失事件
  • ResourceVersion: "0" 表示从缓存中获取最新状态

聚合层(Aggregation Layer)

允许将自定义 API 注册到 API Server:

yaml
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  name: v1beta1.metrics.k8s.io
spec:
  service:
    name: metrics-server
    namespace: kube-system
  group: metrics.k8s.io
  version: v1beta1
  insecureSkipTLSVerify: true
  groupPriorityMinimum: 100
  versionPriority: 100

高可用部署

生产环境 API Server 多实例部署:

                    ┌─────────────────┐
                    │  Load Balancer  │
                    └────────┬────────┘
              ┌──────────────┼──────────────┐
              ▼              ▼              ▼
        API Server 1   API Server 2   API Server 3
              └──────────────┼──────────────┘

                           etcd
bash
# 查看 API Server 状态
kubectl get componentstatuses

# 查看 API Server 日志
kubectl logs -n kube-system kube-apiserver-master-1

关键启动参数

bash
kube-apiserver \
  --etcd-servers=https://127.0.0.1:2379 \
  --service-cluster-ip-range=10.96.0.0/12 \
  --service-node-port-range=30000-32767 \
  --enable-admission-plugins=NodeRestriction,PodSecurity \
  --authorization-mode=Node,RBAC \
  --audit-log-path=/var/log/audit.log \
  --audit-log-maxage=30 \
  --request-timeout=60s \
  --max-requests-inflight=400 \
  --max-mutating-requests-inflight=200

监控指标

apiserver_request_total                    # 请求总数(按方法/资源/状态码)
apiserver_request_duration_seconds         # 请求延迟
apiserver_current_inflight_requests        # 当前并发请求数
etcd_request_duration_seconds             # etcd 请求延迟
apiserver_watch_events_total              # Watch 事件总数

本站内容由 褚成志 整理编写,仅供学习参考