1.4 Kube API Server

1.4 Kube API Server

一、API Server 核心功能

Kubernetes API Server(kube-apiserver)是集群的唯一入口,提供 RESTful API 供所有组件和用户交互。其核心职责包括:

  1. 请求处理:接收并校验 kubectl、控制器、调度器等客户端的请求。
  2. 数据持久化:将集群状态(如 Pod、Service 等资源)存储到 ETCD。
  3. 认证与授权:通过插件链(如 RBAC、Webhook)控制访问权限。
  4. 资源版本控制:为每个对象维护多版本(如 v1apps/v1)。
  5. API 扩展:支持 Custom Resource Definitions (CRDs)。

二、API Server 架构与组件交互

1
2
3
4
5
6
7
graph LR
A[用户/工具] -->|HTTP请求| B[API Server]
B -->|读写| C[ETCD]
B --> D[Controller Manager]
B --> E[Scheduler]
D -->|监听资源变化| B
E -->|获取未调度Pod| B
  • 唯一数据入口:所有组件(包括 kubelet)必须通过 API Server 操作资源。
  • 无状态设计:可水平扩展,通过负载均衡暴露服务。

三、API Server 关键启动参数

配置文件通常位于 /etc/kubernetes/manifests/kube-apiserver.yaml(静态 Pod 部署方式)。以下为关键参数:

参数 作用 示例值
--etcd-servers 指定 ETCD 集群地址 https://10.0.0.1:2379
--authorization-mode 授权模式(如 RBAC、Node) RBAC,Node
--enable-admission-plugins 准入控制插件(如资源限制、Pod 安全策略) ResourceQuota,PodSecurity
--service-cluster-ip-range Service 的 ClusterIP 地址池 10.96.0.0/12
--tls-cert-file API Server 的 TLS 证书 /etc/kubernetes/pki/apiserver.crt
--audit-log-path 审计日志路径(记录所有 API 请求) /var/log/kubernetes/audit.log

四、常见命令与使用场景

1. 查看 API Server 状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 检查 API Server Pod 状态 
# 通常Kubeadm在master node的kubesystem namespace中将kubeapi server服务器部署为pod
kubectl get pods -n kube-system -l component=kube-apiserver
# 在Kubeadm管理情况下,可以在pod definition file查看options:
cat /etc/kubernetes/manifests/kube-apiserver.yaml

#在非Kubeadm管理情况下,options查看:
cat /etc/systemd/system/kube-apiserver.service

# 查看正在运行的进程
ps -aux | grep kube-apiserver

# 测试 API Server 连通性
kubectl cluster-info

2. 直接访问 API(无需 kubectl)

1
2
3
4
5
6
# 获取所有 Pod 信息(需认证)
curl -k -H "Authorization: Bearer $(kubectl get secret -n default -o jsonpath='{.items[0].data.token}' | base64 --decode)" \
https://<API_SERVER_IP>:6443/api/v1/pods

# 查看支持的 API 资源列表
kubectl api-resources

3. 调试 API 请求

1
2
3
4
5
# 查看请求的详细过程(包括 API 版本和响应)
kubectl get pods -v=8

# 以 YAML 格式输出原始 API 响应
kubectl get pod nginx -o yaml --raw

4. 管理 API 扩展(CRD)

1
2
3
4
5
# 创建自定义资源定义(CRD)
kubectl apply -f my-crd.yaml

# 查看所有 API 版本(包括自定义资源)
kubectl api-versions

5. 安全相关操作

1
2
3
4
5
# 检查当前用户的权限
kubectl auth can-i create deployments --namespace dev

# 查看审计日志(需提前配置 --audit-log-path)
tail -f /var/log/kubernetes/audit.log

五、API Server 高可用配置

生产环境中通常需要部署多个 API Server 实例,通过负载均衡对外提供服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 示例:kube-apiserver 的静态 Pod 配置(高可用)
apiVersion: v1
kind: Pod
metadata:
name: kube-apiserver
namespace: kube-system
spec:
containers:
- command:
- kube-apiserver
- --etcd-servers=https://10.0.0.1:2379,https://10.0.0.2:2379
- --service-cluster-ip-range=10.96.0.0/12
- --apiserver-count=3 # 指定集群中 API Server 的数量

六、常见问题排查

1. API Server 无法启动

  • 检查日志
    1
    journalctl -u kube-apiserver -f
  • 常见原因
    • ETCD 连接失败(证书错误或网络不通)。
    • 端口冲突(默认 6443)。

2. 请求被拒绝

  • 错误示例403 Forbidden
  • 解决方案
    1
    2
    # 检查 RBAC 权限
    kubectl get rolebindings,clusterrolebindings --all-namespaces

3. 性能优化

  • 启用缓存--watch-cache=true(默认开启)。
  • 限制请求速率--max-requests-inflight=400

七、总结

  • API Server 是集群的“网关”:所有操作必须通过其 REST API。
  • 核心能力:认证、授权、版本转换、数据校验。
  • 关键命令kubectl cluster-infokubectl api-resourcescurl 直接访问 API。
  • 生产建议:启用审计日志、配置高可用、定期升级。

通过理解 API Server 的运作机制,可以更高效地管理 Kubernetes 集群并快速定位问题。

1.5 Kube Controller Manager

1.5 Kube Controller Manager

Kube Controller Manager 相关常用命令详解

Kube Controller Manager 作为 Kubernetes 控制平面的核心组件,虽然大多数操作都是自动化的,但管理员仍需要通过一些命令来监控和管理其运行状态。以下是与之相关的常用命令分类说明:

Kube Controller Manager 包含多个内置的控制器,每个控制器都是一个独立的控制循环,监视集群状态并做出相应调整:

主要控制器

  1. Node Controller - 节点控制器

    • 监控节点状态
    • 当节点不可达时负责响应
    • 维护节点列表和节点生命周期
  2. Replication Controller - 副本控制器

    • 确保每个 ReplicationController 对象都有正确数量的 Pod 副本在运行
    • (注:在新版本中更推荐使用 Deployment 和 ReplicaSet)
  3. Deployment Controller - 部署控制器

    • 实现 Deployment 对象的声明式更新
    • 控制 ReplicaSet 的创建和滚动更新
  4. ReplicaSet Controller - 副本集控制器

    • 维护 ReplicaSet 的正确副本数
    • 创建和删除 Pod 以满足副本数要求
  5. Endpoint Controller - 端点控制器

    • 维护 Service 与 Pod 的关联关系
    • 填充 Endpoints 对象(即 Pod IP:Port 对)
  6. Service Account & Token Controller - 服务账户控制器

    • 为新的命名空间创建默认 ServiceAccount
    • 为 ServiceAccount 创建和管理 API 访问令牌
  7. Namespace Controller - 命名空间控制器

    • 处理命名空间的删除
    • 确保所有属于该命名空间的资源都被清除
  8. Job Controller - 任务控制器

    • 监控 Job 对象并创建 Pod 来完成任务
    • 跟踪任务完成状态
  9. DaemonSet Controller - 守护进程集控制器

    • 确保每个符合条件的节点都运行一个指定的 Pod 副本
  10. StatefulSet Controller - 有状态集控制器

    • 管理有状态应用的部署和扩展
    • 维护 Pod 的唯一性和持久存储
  11. PersistentVolume Controller - 持久卷控制器

    • 绑定 PersistentVolumeClaims 到 PersistentVolumes
    • 自动执行存储供应

工作原理

  1. 监控状态:通过 API Server 监听集群中资源对象的变化
  2. 比较状态:将实际状态与期望状态(在资源对象的 spec 中定义)进行比较
  3. 执行操作:采取必要操作使实际状态趋向期望状态
  4. 循环执行:不断重复上述过程

配置参数

Kube Controller Manager 支持多种配置参数,常见的有:

  • --cluster-cidr: 集群中 Pod 的 CIDR 范围
  • --service-cluster-ip-range: Service 的 VIP CIDR 范围
  • --node-monitor-period: 节点状态检查周期
  • --concurrent-deployment-syncs: 并发 Deployment 同步数
  • --concurrent-endpoint-syncs: 并发 Endpoint 同步数
  • --leader-elect: 是否启用领导者选举(高可用部署时使用)
  • --controllers: 指定启用的控制器列表

1. 查看 Controller Manager 状态

查看组件状态

1
2
3
kubectl get componentstatuses
# 或缩写
kubectl get cs

输出示例:

NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok                  
scheduler            Healthy   ok                  
etcd-0               Healthy   {"health":"true"}   

查看 Controller Manager Pod

1
2
# 在 kube-system 命名空间中查找
kubectl get pods -n kube-system -l component=kube-controller-manager

查看日志

1
2
3
4
5
6
# 查看 Controller Manager 日志
kubectl logs -n kube-system <controller-manager-pod-name>
# 持续查看日志
kubectl logs -n kube-system <controller-manager-pod-name> -f
# 查看过去30分钟的日志
kubectl logs -n kube-system <controller-manager-pod-name> --since=30m

2. 领导者选举相关命令

查看当前领导者

1
kubectl get endpoints kube-controller-manager -n kube-system -o yaml

输出中的 annotations 部分会包含当前领导者信息:

1
2
3
4
5
6
7
8
annotations:
control-plane.alpha.kubernetes.io/leader: '{
"holderIdentity":"controller-manager-pod-name_xxxx",
"leaseDurationSeconds":15,
"acquireTime":"2023-01-01T00:00:00Z",
"renewTime":"2023-01-01T00:01:00Z",
"leaderTransitions":3
}'

3. 控制器特定资源操作

查看控制器管理的资源

1
2
3
4
5
6
# 查看所有 Deployment
kubectl get deployments --all-namespaces
# 查看所有 ReplicaSet
kubectl get replicasets --all-namespaces
# 查看所有 StatefulSet
kubectl get statefulsets --all-namespaces

强制删除卡住的资源

1
2
3
4
# 强制删除 Pod
kubectl delete pod <pod-name> --grace-period=0 --force
# 强制删除 Namespace
kubectl delete namespace <ns-name> --grace-period=0 --force

4. 配置和参数检查

查看运行参数

1
2
3
4
# 查看当前运行的参数
kubectl get pod <controller-manager-pod-name> -n kube-system -o yaml
# 查找 --leader-elect 等特定参数
kubectl get pod <controller-manager-pod-name> -n kube-system -o yaml | grep -i "leader-elect"

检查配置的 CIDR 范围

1
kubectl describe pod <controller-manager-pod-name> -n kube-system | grep -E "cluster-cidr|service-cluster-ip-range"

5. 调试和性能分析

查看控制器指标

1
2
3
4
# 先进行端口转发
kubectl port-forward -n kube-system <controller-manager-pod-name> 10252:10252
# 然后访问指标端点
curl http://localhost:10252/metrics

检查工作队列状态

1
curl http://localhost:10252/metrics | grep -E "workqueue_adds_total|workqueue_depth|workqueue_queue_duration_seconds"

CPU/内存分析

1
2
# 进入容器执行 top 命令
kubectl exec -it -n kube-system <controller-manager-pod-name> -- top

6. 维护和故障排查

重启 Controller Manager

1
2
# 删除 Pod 让其自动重建
kubectl delete pod -n kube-system <controller-manager-pod-name>

检查事件

1
2
3
kubectl get events --sort-by=.metadata.creationTimestamp -A
# 只看与控制器相关的事件
kubectl get events --field-selector involvedObject.kind=ReplicaSet -A

检查控制器版本

1
kubectl get pod -n kube-system <controller-manager-pod-name> -o yaml | grep image:

7. 高级诊断命令

检查 API 调用延迟

1
kubectl get --raw /metrics | grep -E "rest_client_request_latency_seconds.*controller"

检查控制器处理延迟

1
kubectl get --raw /metrics | grep -E "controller_runtime_reconcile_time_seconds"

检查资源同步状态

1
2
3
4
# 查看 Deployment 同步状态
kubectl get deployments -o wide
# 查看 ReplicaSet 状态
kubectl get replicasets -o wide

8. 安全相关命令

检查 RBAC 权限

1
2
3
4
# 查看 Controller Manager 使用的 ServiceAccount
kubectl get pod -n kube-system <controller-manager-pod-name> -o jsonpath='{.spec.serviceAccountName}'
# 查看关联的 ClusterRole
kubectl get clusterrole system:kube-controller-manager -o yaml

使用技巧

  1. 结合 grep 过滤:大多数命令可以结合 grep 过滤关键信息

    1
    kubectl logs -n kube-system <pod-name> | grep -i "error"
  2. 使用 -o wide/yaml/json:获取更详细的输出格式

    1
    2
    kubectl get pod <pod-name> -o yaml
    kubectl get endpoints kube-controller-manager -n kube-system -o json
  3. 时间排序事件:排查问题时按时间顺序查看事件

    1
    kubectl get events --sort-by=.metadata.creationTimestamp -A
  4. 监控关键指标:使用 watch 命令实时监控

    1
    watch -n 1 'kubectl get deployments,pods,replicasets -A'

这些命令可以帮助 Kubernetes 管理员有效地监控和管理 Controller Manager 及其管理的各种控制器,确保集群稳定运行。