在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 时使用
  • 关键权限
    • 对所在 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...  
      

4. etcd(分布式存储)

  • 通信模式APIServer 单向读写
  • 行为
    • APIServer 将所有状态变更写入 etcd
    • 不直接暴露:其他组件禁止直连 etcd
  • 认证
    • APIServer 使用 etcd 证书访问(--etcd-certfile, --etcd-keyfile 参数)

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 集成认证、授权、准入控制

设计哲学
“通信集中化,权限最小化,操作可审计”

posted @ 2025-08-16 23:01  天道酬勤zjh  阅读(13)  评论(0)    收藏  举报