一、控制平面组件(Control Plane Components)
控制平面组件对集群做出全局决策(如调度),并检测和响应集群事件(如根据 replicas 字段启动新 Pod)。
| 组件 | 核心功能 | 关键细节 |
|---|---|---|
| kube-apiserver | 集群的统一 API 入口,所有操作(kubectl、其他组件、外部调用)均通过它 | • 提供认证、授权、准入控制机制 • 唯一与 etcd 直接交互的组件 • 无状态,可水平扩展 |
| etcd | 分布式、高可用的键值存储,用于保存所有集群数据 | • 存储 Pod、Service、ConfigMap、Secret 等对象的状态和元数据 • 仅 API Server 可直接访问 • 生产环境建议 3/5/7... 奇数节点集群 |
| kube-scheduler | 负责为新创建的未调度的 Pod 选择最合适的工作节点 | • 调度策略:预选(过滤不满足节点)→ 优选(打分排序) • 可自定义调度器或扩展调度插件 |
| kube-controller-manager | 运行集群中所有内置控制器,确保集群处于期望状态 | • 包含:节点控制器、副本集控制器、端点控制器、服务账户控制器等 • 每个控制器通过 API Server 监视资源变化,并执行调谐循环(Reconcile Loop) |
| cloud-controller-manager(可选) | 托管与底层云提供商(AWS、GCP、Azure、阿里云等)交互的控制逻辑 | • 将云厂商特定逻辑从核心控制器剥离,便于多云适配 • 典型控制器:节点控制器(检测云 VM 状态)、路由控制器(设置网络路由)、服务控制器(管理 LoadBalancer 型 Service) |
二、工作节点组件(Node Components)
每个工作节点上必须运行以下组件,用于维护运行的 Pod 并提供 Kubernetes 运行时环境。
| 组件 | 核心功能 | 关键细节 |
|---|---|---|
| kubelet | 节点上的"节点代理",负责管理该节点上所有 Pod 的生命周期 | • 接收来自 API Server 的 PodSpec,确保容器健康运行 • 上报节点和 Pod 状态至 API Server • 定期执行存活/就绪探针 |
| kube-proxy | 维护节点上的网络规则,实现 Service 抽象(VIP 和负载均衡) | • 支持代理模式:iptables(默认)、IPVS、userspace • 监听 API Server 中 Service 和 EndpointSlice 的变化,并更新内核路由规则 |
| 容器运行时(Container Runtime) | 拉取镜像并运行容器 | • 必须实现 CRI(Container Runtime Interface)标准 • 常见实现:containerd(推荐)、CRI-O、Docker Engine(通过 cri-dockerd 适配) |
补充说明:传统 Docker Engine 在 1.20 之后不再被 kubelet 原生支持,需要额外的对接组件。
三、核心附加组件(Addons)
生产集群通常需要部署附加组件来增强功能,它们通过 Deployment / DaemonSet 等形式运行。
| 组件 | 功能说明 |
|---|---|
| CoreDNS | 集群内部 DNS 服务器,为 Service 提供稳定的名称解析(如 my-service.default.svc.cluster.local) |
| Ingress Controller | 管理外部访问集群服务的 HTTP/HTTPS 路由(如 Nginx Ingress、Traefik、HAProxy Ingress) |
| Metrics Server | 采集节点和 Pod 的资源使用指标(CPU/内存),用于 HPA(水平自动扩缩)和 kubectl top |
| Dashboard | Web UI 界面,方便可视化操作集群 |
| CNI 插件(网络插件) | 实现 Pod 网络互通,必须安装一个,如 Calico(支持网络策略)、Flannel(简单)、Cilium(eBPF) |
| CSI 驱动(存储插件) | 使集群可以通过 PVC 挂载外部存储系统(如云磁盘、NFS、Ceph) |
四、组件交互简例(创建 Pod 的过程)
-
提交 :用户向
kube-apiserver发送创建 Pod 的请求(kubectl 或 API 调用)。 -
认证与存储 :API Server 完成认证、授权、准入控制后,将 Pod 对象写入
etcd。 -
调度 :
kube-scheduler通过 API Server 监听未调度的 Pod,为其选择最合适的节点,并更新 Pod 的nodeName字段。 -
启动容器 :目标节点上的
kubelet监测到 Pod 被调度到自己身上,调用容器运行时(containerd)创建并启动容器。 -
网络与服务 :
kube-proxy负责维护 Pod IP 与 Service IP 的转发规则;CoreDNS 提供 Service 域名解析。 -
状态维持 :
kube-controller-manager中的各个控制器持续监控集群状态,确保实际状态与期望一致。
五、总结图(文字结构)
text
控制平面(Master)
+----------------+ +-----------------+
| etcd |<--->| kube-apiserver |
+----------------+ +-----------------+
^
| (通过 API 交互)
+----------------+ +-----------------+
| controller-man | | kube-scheduler |
+----------------+ +-----------------+
工作节点(Node1) 工作节点(Node2)
+---------------------+ +---------------------+
| kubelet | | kubelet |
| kube-proxy | | kube-proxy |
| container runtime | | container runtime |
| (Pod1, Pod2, ...) | | (Pod3, Pod4, ...) |
+---------------------+ +---------------------+
⚙️ 基础命令 (Beginner Commands) - 日常必备
这部分是使用 Kubernetes 最频繁的操作,主要涉及资源的创建、查看和基本操作。
-
kubectl get:列出各种资源。-
kubectl get nodes: 查看集群所有节点状态。 -
kubectl get pods: 列出当前命名空间下的 Pod 。 -
kubectl get svc: 列出集群服务 。 -
kubectl get all: 快速查看命名空间下几乎所有核心资源的状态。 -
常用参数:
-
-o wide: 展示更多信息,如 Pod 的 IP 和所在节点。 -
-n: 指定命名空间。 -
-A / --all-namespaces: 查看所有命名空间的资源。
-
-
-
kubectl describe:查看资源详情,是排查问题的重要工具。kubectl describe pod <pod-name>: 深入查看 Pod 的状态和事件,比如为什么处于Pending状态。
-
kubectl create:命令式地创建资源。-
kubectl create deployment nginx --image=nginx: 快速创建一个 Deployment。 -
kubectl create namespace my-namespace: 创建一个新的命名空间。 -
kubectl create -f manifest.yaml: 通过 YAML 文件创建资源。
-
-
kubectl apply:声明式管理资源,推荐使用。-
kubectl apply -f manifest.yaml: 创建或更新 YAML 文件中定义的资源。 -
与
create的区别 :apply更智能,它会计算变更并应用到现有对象;而create是命令式的,如果资源已存在会报错。
-
-
kubectl delete:删除资源。-
kubectl delete pod <pod-name>: 直接删除 Pod。 -
kubectl delete -f manifest.yaml: 删除 YAML 文件里定义的所有资源。 -
kubectl delete pods --all: 强制删除当前命名空间下所有 Pod(操作危险,需谨慎)。
-
-
kubectl edit:直接编辑运行中资源的配置。kubectl edit deployment nginx: 会打开默认编辑器,修改后立即生效。
📦 资源管理 (Management Commands) - 调度与变更
用于管理应用的生命周期,如部署、扩展和更新。
-
kubectl rollout:管理 Deployment 的滚动更新。-
kubectl rollout status deployment/<deployment-name>: 查看更新进度。 -
kubectl rollout history deployment/<deployment-name>: 查看历史版本。 -
kubectl rollout undo deployment/<deployment-name>: 回滚到上一个版本。
-
-
kubectl scale:手动调整副本数量。kubectl scale deployment <deployment-name> --replicas=5: 将 Deployment 扩展到 5 个 Pod。
🐛 调试与排查 (Debugging Commands) - 定位问题
当应用出现异常时,这些命令能帮我们进入容器内部、查看日志、排查配置。
-
kubectl logs:查看容器日志。-
kubectl logs <pod-name>: 查看单个 Pod 的日志。 -
kubectl logs -f <pod-name>: 实时跟踪日志输出。 -
kubectl logs <pod-name> -c <container-name>: 查看多容器 Pod 中指定容器的日志。
-
-
kubectl exec:在容器内执行命令。kubectl exec -it <pod-name> -- /bin/bash: 进入 Pod 内部,获取一个交互式 Shell。
-
kubectl port-forward:建立本地端口到 Pod 的转发。kubectl port-forward pod/<pod-name> 8080:80: 访问localhost:8080就能直接连到 Pod 的 80 端口。
-
辅助命令:
-
kubectl top pod / node: 查看 Pod 或节点的实时资源(CPU/内存)使用情况。 -
kubectl get events --sort-by=.metadata.creationTimestamp: 查看集群事件,并按发生时间排序。
-
🔧 高级/其他操作 (Advanced/Other Commands)
一些进阶管理命令。
-
存储相关:
-
kubectl get pv: 查看持久卷。 -
kubectl get pvc: 查看持久卷声明。
-
-
配置相关:
-
kubectl get configmap: 查看 ConfigMap。 -
kubectl get secret: 查看 Secret。默认输出进行了 Base64 编码,需要用-o yaml等参数获取具体内容。
-
-
网络相关:
-
kubectl get ingress: 查看入口配置。 -
kubectl get networkpolicy: 查看网络策略。
-
-
集群管理:
-
kubectl get namespace: 查看集群命名空间。 -
kubectl config view: 查看当前kubeconfig配置。 -
kubectl config use-context <context-name>: 切换集群环境/上下文。
-
💡 实用技巧
-
配置 Shell 自动补全 :为
kubectl设置自动补全能极大提升输入效率和准确性。以常用的bash环境为例:bash
# 先安装 bash-completion 包(很多 Linux 发行版已经预装) # Debian/Ubuntu: apt-get install bash-completion # CentOS/RHEL: yum install bash-completion # 启用 kubectl 的 bash 补全功能,并设置别名 k echo 'source <(kubectl completion bash)' >>~/.bashrc echo 'alias k=kubectl' >>~/.bashrc echo 'complete -o default -F __start_kubectl k' >>~/.bashrc exec $SHELL # 重新加载配置文件,或新开一个终端窗口配置后,输入
k get po然后按 Tab 键,就可以自动补全命令了。 -
常用全局标志:
-
-n <namespace>: 指定操作的目标命名空间。 -
-A, --all-namespaces: 操作目标为所有命名空间。 -
--context: 指定 kubeconfig 中的上下文,用于快速切换集群。 -
-l, --selector: 通过标签(labels)筛选资源。
-