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 / Webhookbash
# 查看当前用户身份
kubectl auth whoami
# 使用 ServiceAccount Token 访问
curl -H "Authorization: Bearer $TOKEN" \
https://kubernetes.default.svc/api/v1/pods2. 授权(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.strategyWatch 与 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
└──────────────┼──────────────┘
▼
etcdbash
# 查看 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 事件总数