Kubernetes API服务器深度解析:核心组件与运维实践

Kubernetes API服务器概述

Kubernetes API服务器是Kubernetes集群的核心组件之一,它是集群的控制平面入口,负责处理所有的API请求。API服务器是Kubernetes的"大脑",管理着集群的所有资源和状态。

API服务器的核心功能

1. 资源管理

API服务器负责管理Kubernetes中的所有资源类型:

func (s *APIServer) HandleRequest(req *http.Request) (interface{}, error) {
    // 解析请求路径
    path := req.URL.Path
    
    // 提取资源类型和名称
    resourceType, resourceName := parsePath(path)
    
    // 根据HTTP方法执行相应操作
    switch req.Method {
    case "GET":
        return s.getResource(resourceType, resourceName)
    case "POST":
        return s.createResource(resourceType, req.Body)
    case "PUT":
        return s.updateResource(resourceType, resourceName, req.Body)
    case "DELETE":
        return s.deleteResource(resourceType, resourceName)
    default:
        return nil, fmt.Errorf("unsupported method: %s", req.Method)
    }
}

2. 认证与授权

API服务器负责对所有请求进行认证和授权:

# API服务器认证配置
apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-apiserver-config
  namespace: kube-system
data:
  config.yaml: |
    apiServer:
      extraArgs:
        authentication-token-webhook-config-file: /etc/kubernetes/webhook-config.yaml
        authorization-mode: Node,RBAC

3. 准入控制

API服务器通过准入控制器对请求进行校验和修改:

# API服务器准入控制配置
apiVersion: v1
kind: Pod
metadata:
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - name: kube-apiserver
    command:
    - kube-apiserver
    - --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota

API服务器的架构

架构图

┌─────────────────────────────────────────────────────────────────┐
│                      API Server                                │
├─────────────────────────────────────────────────────────────────┤
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐        │
│  │  认证层     │───>│  授权层     │───>│  准入控制   │        │
│  └─────────────┘    └─────────────┘    └─────────────┘        │
│         │                                           │         │
│         ▼                                           ▼         │
│  ┌─────────────┐                            ┌─────────────┐    │
│  │   API路由   │                            │   存储层    │    │
│  └─────────────┘                            └─────────────┘    │
│         │                                           │         │
│         └───────────────────────────────────────────┘         │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
                  ┌───────────────────┐
                  │     etcd          │
                  └───────────────────┘

请求处理流程

  1. 接收请求:API服务器接收HTTP请求
  2. 认证:验证请求的身份
  3. 授权:检查请求是否有权限执行
  4. 准入控制:对请求进行校验和修改
  5. 路由:将请求路由到相应的处理函数
  6. 存储:读取或写入etcd

API服务器的配置

配置文件

apiVersion: v1
kind: Pod
metadata:
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - name: kube-apiserver
    image: k8s.gcr.io/kube-apiserver:v1.26.0
    command:
    - kube-apiserver
    - --advertise-address=192.168.1.100
    - --allow-privileged=true
    - --authorization-mode=Node,RBAC
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota
    - --enable-bootstrap-token-auth=true
    - --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
    - --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
    - --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
    - --etcd-servers=https://127.0.0.1:2379
    - --insecure-port=0
    - --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
    - --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
    - --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
    - --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
    - --requestheader-allowed-names=front-proxy-client
    - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
    - --requestheader-extra-headers-prefix=X-Remote-Extra-
    - --requestheader-group-headers=X-Remote-Group
    - --requestheader-username-headers=X-Remote-User
    - --secure-port=6443
    - --service-account-key-file=/etc/kubernetes/pki/sa.pub
    - --service-cluster-ip-range=10.96.0.0/12
    - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
    - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
    volumeMounts:
    - name: k8s-certs
      mountPath: /etc/kubernetes/pki
      readOnly: true
    - name: kubeconfig
      mountPath: /etc/kubernetes
      readOnly: true
  volumes:
  - name: k8s-certs
    hostPath:
      path: /etc/kubernetes/pki
      type: DirectoryOrCreate
  - name: kubeconfig
    hostPath:
      path: /etc/kubernetes
      type: DirectoryOrCreate

重要配置参数

参数 说明
--advertise-address API服务器的广告地址
--authorization-mode 授权模式
--client-ca-file 客户端CA证书文件
--etcd-servers etcd服务器地址
--secure-port 安全端口
--tls-cert-file TLS证书文件
--tls-private-key-file TLS私钥文件

API服务器的认证机制

1. TLS认证

apiVersion: v1
kind: Secret
metadata:
  name: apiserver-tls
  namespace: kube-system
data:
  tls.crt: <base64-encoded-cert>
  tls.key: <base64-encoded-key>

2. 客户端证书认证

# 使用客户端证书访问API服务器
curl --cert /path/to/client.crt --key /path/to/client.key \
  https://api-server:6443/api/v1/pods

3. Token认证

# 使用Token访问API服务器
curl -H "Authorization: Bearer <token>" \
  https://api-server:6443/api/v1/pods

4. ServiceAccount认证

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-service-account
  namespace: default

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: my-service-account-binding
  namespace: default
subjects:
- kind: ServiceAccount
  name: my-service-account
  namespace: default
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

API服务器的授权机制

RBAC授权

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
  namespace: default
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pod-reader-binding
  namespace: default
subjects:
- kind: User
  name: jane
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

ClusterRole授权

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-admin
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluster-admin-binding
subjects:
- kind: User
  name: admin
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

API服务器的准入控制

内置准入控制器

apiVersion: v1
kind: Pod
metadata:
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - name: kube-apiserver
    command:
    - kube-apiserver
    - --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota

自定义准入Webhook

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: my-mutating-webhook
webhooks:
- name: my-webhook.example.com
  clientConfig:
    service:
      name: my-webhook-service
      namespace: default
      path: /mutate
  rules:
  - apiGroups: [""]
    apiVersions: ["v1"]
    resources: ["pods"]
    operations: ["CREATE"]
  sideEffects: None
  timeoutSeconds: 10

API服务器的监控与调优

监控API服务器

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: kube-apiserver
  namespace: monitoring
spec:
  endpoints:
  - port: https
    scheme: https
    tlsConfig:
      insecureSkipVerify: true
    interval: 30s
  selector:
    matchLabels:
      component: apiserver
  namespaceSelector:
    matchNames:
    - kube-system

API服务器指标

指标 说明
apiserver_request_total 总请求数
apiserver_request_latencies_summary 请求延迟汇总
apiserver_request_duration_seconds_bucket 请求延迟直方图
apiserver_current_inflight_requests 当前并发请求数

性能调优

apiVersion: v1
kind: Pod
metadata:
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - name: kube-apiserver
    resources:
      requests:
        memory: "2Gi"
        cpu: "1"
      limits:
        memory: "4Gi"
        cpu: "2"
    command:
    - kube-apiserver
    - --max-requests-inflight=500
    - --max-mutating-requests-inflight=200
    - --request-timeout=60s

API服务器的高可用性

多Master部署

apiVersion: v1
kind: Service
metadata:
  name: kubernetes
  namespace: default
spec:
  type: ClusterIP
  clusterIP: 10.96.0.1
  ports:
  - port: 443
    targetPort: 6443
  selector:
    component: apiserver

负载均衡配置

# HAProxy配置
frontend kubernetes
    bind *:6443
    mode tcp
    option tcplog
    default_backend kubernetes-master-nodes

backend kubernetes-master-nodes
    mode tcp
    balance roundrobin
    option tcp-check
    server master1 192.168.1.10:6443 check fall 3 rise 2
    server master2 192.168.1.11:6443 check fall 3 rise 2
    server master3 192.168.1.12:6443 check fall 3 rise 2

API服务器的安全最佳实践

1. 使用TLS加密

apiVersion: v1
kind: Pod
metadata:
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - name: kube-apiserver
    command:
    - kube-apiserver
    - --secure-port=6443
    - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
    - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key

2. 限制访问权限

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: limited-access
  namespace: default
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]

3. 启用审计日志

apiVersion: v1
kind: Pod
metadata:
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - name: kube-apiserver
    command:
    - kube-apiserver
    - --audit-log-path=/var/log/kubernetes/audit.log
    - --audit-log-maxbackup=10
    - --audit-log-maxsize=100
    - --audit-policy-file=/etc/kubernetes/audit-policy.yaml

4. 定期轮换证书

# 生成新证书
kubeadm certs renew all

# 重启API服务器
kubectl rollout restart deployment/kube-apiserver -n kube-system

API服务器的常见问题及解决方案

问题1:API服务器无法启动

原因:证书过期、etcd连接失败、配置错误

解决方案

# 检查API服务器日志
kubectl logs kube-apiserver -n kube-system

# 检查etcd连接
etcdctl endpoint health

# 检查证书有效期
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout

问题2:API服务器性能问题

原因:资源不足、请求过多、etcd性能问题

解决方案

apiVersion: v1
kind: Pod
metadata:
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - name: kube-apiserver
    resources:
      requests:
        memory: "4Gi"
        cpu: "2"
      limits:
        memory: "8Gi"
        cpu: "4"

问题3:认证失败

原因:证书无效、Token过期、RBAC配置错误

解决方案

# 检查证书
kubectl config view

# 检查RBAC配置
kubectl get roles
kubectl get rolebindings

总结

Kubernetes API服务器是集群的核心组件,负责处理所有API请求、管理资源、认证授权和准入控制。通过合理配置和运维API服务器,可以确保集群的稳定运行和安全。

在实际应用中,需要关注API服务器的性能、安全性和高可用性,定期监控和优化,确保集群的正常运行。

掌握API服务器的配置和运维,对于构建和管理Kubernetes集群至关重要。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐