在K8S中,各模块如何与APlServer通信?
在 Kubernetes 中,API Server 是集群的“中央通信枢纽”,所有模块都通过它进行交互(遵循 “唯 APIServer 原则”)。以下是各模块与 API Server 的通信机制及原理详解:
一、通信核心框架
组件 | 通信方向 | 协议 | 认证方式 |
---|---|---|---|
控制平面组件(如 Scheduler) | → APIServer | HTTPS | ServiceAccount Token |
工作节点组件(如 Kubelet) | → APIServer | HTTPS | TLS 客户端证书 + Token |
客户端工具(如 kubectl) | → APIServer | HTTPS | Kubeconfig(证书/Token) |
APIServer | → etcd | gRPC | etcd 证书 |
Webhook 准入控制器 | ← APIServer | HTTPS | 自定义证书 |
二、各模块与 APIServer 的通信方式
1. 控制平面组件(Controller Manager, Scheduler 等)
- 通信模式:主动 Watch + List
- 行为:
- 监听资源变化(如新 Pod 创建、Node 状态更新)
- 执行控制循环(检测期望状态与实际状态差异,发起调谐操作)
- 认证:
# Controller Manager 使用的 ServiceAccount apiVersion: v1 kind: ServiceAccount metadata: name: controller-manager namespace: kube-system
# Pod 中自动挂载的 Token /var/run/secrets/kubernetes.io/serviceaccount/token
- 关键权限:
- Controller Manager:对所有资源有 读写权限(如管理 Deployment、ReplicaSet)
- Scheduler:对 Pod 有 绑定(bind)权限
2. 工作节点组件(Kubelet)
- 通信模式:主动上报 + 被动接收指令
- 行为:
- 上报状态:每 10s 上报 Node/Pod 状态(CPU、内存、容器状态)
- 接收指令:执行 APIServer 下发的操作(如创建/删除 Pod)
- 认证:
- TLS 双向认证:Kubelet 使用
/var/lib/kubelet/pki/kubelet-client-current.pem
证书 - ServiceAccount Token:访问 Secrets/ConfigMaps 时使用
- TLS 双向认证:Kubelet 使用
- 关键权限:
- 对所在 Node 资源有 更新权限
- 对 Pod 有 读写权限
3. 客户端工具(kubectl)
- 通信模式:主动调用 API
- 行为:
- 用户执行命令(如
kubectl get pods
)→ 转换为 API 请求(如GET /api/v1/namespaces/default/pods
)
- 用户执行命令(如
- 认证:
- Kubeconfig 文件(通常位于
~/.kube/config
),包含:users: - name: dev-user user: client-certificate: /path/to/cert.crt # TLS 证书 client-key: /path/to/cert.key # 或使用 Token token: eyJhbGciOiJSUzI1NiIsImtpZ...
- Kubeconfig 文件(通常位于
4. etcd(分布式存储)
- 通信模式:APIServer 单向读写
- 行为:
- APIServer 将所有状态变更写入 etcd
- 不直接暴露:其他组件禁止直连 etcd
- 认证:
- APIServer 使用 etcd 证书访问(
--etcd-certfile
,--etcd-keyfile
参数)
- APIServer 使用 etcd 证书访问(
5. 准入控制器(Admission Controllers)
- 通信模式:APIServer 主动调用
- 行为:
- 在资源持久化到 etcd 前进行拦截或修改(如验证资源合规性)
- 类型:
- 内置控制器(如
NamespaceLifecycle
):直接编译在 APIServer 中 - Webhook 控制器(如
ValidatingWebhook
):APIServer 通过 HTTPS 调用外部服务apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration webhooks: - name: my-webhook.example.com clientConfig: url: "https://my-webhook.example.com:443/validate" caBundle: <CA_CERT_BASE64> # 验证服务端证书
- 内置控制器(如
三、通信安全机制
1. 传输层加密(TLS)
- 所有通信强制 HTTPS:
- APIServer 监听 6443 端口 (HTTPS)
- 禁用 8080 端口 (非安全 HTTP,仅测试用)
- 证书类型:
证书用途 路径示例 APIServer 服务端证书 /etc/kubernetes/pki/apiserver.crt
etcd 客户端证书 /etc/kubernetes/pki/apiserver-etcd-client.crt
Kubelet 客户端证书 /var/lib/kubelet/pki/kubelet-client-current.pem
2. 认证(Authentication)
- 四类认证方式:
方式 适用组件 配置示例 X.509 客户端证书 kubectl、Kubelet kubeconfig 中的 client-certificate
Bearer Token ServiceAccount(Pod 内进程) /var/run/secrets/kubernetes.io/serviceaccount/token
Webhook Token 外部认证服务(如 OIDC) --authentication-token-webhook-config-file
Bootstrap Token 节点加入集群时临时使用 kubeadm token create
3. 授权(Authorization)
- 访问请求必经 RBAC 检查:graph LR A[请求] --> B{RBAC 检查} B -->|允许| C[执行操作] B -->|拒绝| D[返回 403 Forbidden]
- 关键授权模式:
RBAC
(主流):基于角色的访问控制Node
:自动授权 Kubelet 访问自身 Node 和 Pod 资源Webhook
:委托外部服务决策(如企业权限系统)
4. 审计(Audit)
- 记录所有 API 请求:
apiVersion: audit.k8s.io/v1 kind: Policy rules: - level: Metadata # 记录请求元数据(用户、资源、动作)
- 日志输出到文件或日志服务(如 Elasticsearch)
四、高效通信设计
1. List-Watch 机制(事件驱动)
- 避免轮询:组件通过 HTTP 长连接监听资源变更事件
// 伪代码:监听 Pod 事件 watcher, err := client.CoreV1().Pods("").Watch(context.TODO(), metav1.ListOptions{}) for event := range watcher.ResultChan() { pod := event.Object.(*v1.Pod) fmt.Println("Event:", event.Type, pod.Name) }
- 断连重试:支持从指定资源版本(
resourceVersion
)恢复监听
2. 资源版本控制(Optimistic Lock)
- 并发更新时通过
resourceVersion
防止冲突:apiVersion: v1 kind: Pod metadata: resourceVersion: "12345" # 更新时携带此版本号
3. API 优先级与公平性(APF)
- 防止高频率请求(如恶意 Pod)阻塞关键请求(如节点心跳):
apiVersion: flowcontrol.apiserver.k8s.io/v1beta2 kind: PriorityLevelConfiguration metadata: name: node-high spec: type: "Exempt" # 节点心跳请求免排队
五、问题排查工具
1. 查看 API 请求
# 1. 检查 Kubelet 连接状态
kubectl get --raw /metrics | grep apiserver_request_total
# 2. 审计日志分析
tail -f /var/log/kubernetes/audit.log
# 3. 诊断证书过期
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates
2. API 调试
# 模拟 kubelet 请求(使用 ServiceAccount Token)
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
curl https://$KUBERNETES_SERVICE_HOST/api/v1/pods \
--header "Authorization: Bearer $TOKEN" \
--cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
六、架构总结
API Server 是 Kubernetes 的“中央交换机”:
- 🔐 安全网关:TLS 加密 + RBAC 权限控制
- 📡 消息中枢:所有组件通过 List-Watch 同步状态
- 📝 唯一写入入口:任何状态变更必经 APIServer 写入 etcd
- ⚙️ 可扩展:通过 Webhook 集成认证、授权、准入控制
设计哲学:
“通信集中化,权限最小化,操作可审计”