K8s 集群

一、控制平面组件(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 的过程)

  1. 提交 :用户向 kube-apiserver 发送创建 Pod 的请求(kubectl 或 API 调用)。

  2. 认证与存储 :API Server 完成认证、授权、准入控制后,将 Pod 对象写入 etcd

  3. 调度kube-scheduler 通过 API Server 监听未调度的 Pod,为其选择最合适的节点,并更新 Pod 的 nodeName 字段。

  4. 启动容器 :目标节点上的 kubelet 监测到 Pod 被调度到自己身上,调用容器运行时(containerd)创建并启动容器。

  5. 网络与服务kube-proxy 负责维护 Pod IP 与 Service IP 的转发规则;CoreDNS 提供 Service 域名解析。

  6. 状态维持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)筛选资源。

相关推荐
Devin~Y2 小时前
大厂Java面试实战:Spring Boot/Cloud + Redis/Kafka + K8s + RAG/Agent 追问全流程(小Y翻车记)
java·spring boot·redis·spring cloud·kafka·kubernetes·micrometer
Cyber4K2 小时前
【Kubernetes专项】温故而知新,重温技术原理(1)
云原生·容器·架构·kubernetes
独隅3 小时前
ZooKeeper 基础原理深度解析
分布式·zookeeper·云原生
拄杖忙学轻声码3 小时前
Docker Swarm 集群部署应用容器常见问题解决
docker·容器
ofoxcoding4 小时前
DeepSeek V4 本地部署 + 生产级监控:从 Dockerfile 到 K8s 完整运维方案(2026)
运维·ai·容器·kubernetes
小夏子_riotous4 小时前
Docker学习路径——7、Docker搭建MySQL 主从复制
linux·运维·mysql·docker·容器·centos·云计算
liyinchi19884 小时前
Windows Server 部署Docker Engine
运维·docker·容器
郝开4 小时前
Docker Compose 本地环境搭建:.env 统一配置模板
运维·docker·容器
星梦清河4 小时前
微服务-01
微服务·云原生·架构