Skip to content
On this page

Kubernetes 核心概念

一、集群(Cluster)—— 运行环境根容器

Cluster 不是 API 资源,而是所有 Kubernetes 资源的运行上下文

Cluster(集群)

  • 是否 Kubernetes API 资源:否
  • 作用:Kubernetes 的完整运行环境,包含:
    • 控制平面(Control Plane):API Server、etcd、Scheduler、Controller Manager
      • API Server 唯一入口:用户、Pod、其他组件都必须通过 API Server 与集群交互
      • etcd:Kubernetes 集群的“大脑记忆”,存储所有集群状态
      • Scheduler:调度器,监听并决定新创建的 Pod 应该运行在哪台 Node(工作节点)上,负责调度、打分、绑定
      • Controller Manager:一组控制器(Controllers)的集合,负责维护集群的“期望状态”
    • 工作节点(Worker Nodes):运行用户工作负载的机器
  • 关键特性
    • 提供统一的编排、调度、自愈、服务发现能力
    • 所有命名空间、Pod、Service 等资源都隶属于一个 Cluster
  • 管理方式:通过工具创建(如 kubeadmk3sEKSGKE),无法用 YAML 声明

二、节点(Node)—— 集群工作单元

描述集群中的计算节点。

Node

  • API 路径/api/v1/nodes
  • 是否独立资源:✅ 是(但通常由 kubelet 自动注册)
  • 作用:集群中的物理机或虚拟机,用于运行 Pod。
  • 说明:用户一般不手动创建 Node;它是 Cluster 的组成部分。

三、工作负载(Workloads)

用于声明“如何运行应用”,最终都管理 Pod 生命周期。

Pod

  • API 路径/api/v1/pods
  • 是否独立资源:✅ 是
  • 作用:最小调度单元,包含一个或多个共享网络/存储的容器。
  • 最佳实践不应直接创建,应通过控制器管理。

Deployment

  • API 路径/apis/apps/v1/deployments
  • 是否独立资源:✅ 是
  • 用途:管理无状态、长期运行的应用(如 Web 服务、MinIO)。
  • 特性:支持滚动更新、回滚、自动扩缩容。

StatefulSet

  • API 路径/apis/apps/v1/statefulsets
  • 是否独立资源:✅ 是
  • 用途:管理有状态、长期运行的应用(如 MySQL、Kafka)。
  • 特性:稳定网络标识(如 pod-0.service)、有序启停、专属持久卷。

DaemonSet

  • API 路径/apis/apps/v1/daemonsets
  • 是否独立资源:✅ 是
  • 用途:确保每个 Node 上运行一个 Pod 副本(如日志收集、监控代理)。

Job

  • API 路径/apis/batch/v1/jobs
  • 是否独立资源:✅ 是
  • 用途:运行一次性任务,成功后自动终止。

CronJob

  • API 路径/apis/batch/v1/cronjobs
  • 是否独立资源:✅ 是
  • 用途:基于 cron 表达式周期性运行 Job(如每日备份)。

HorizontalPodAutoscaler(HPA)

  • API 路径/apis/autoscaling/v2/horizontalpodautoscalers
  • 是否独立资源:✅ 是
  • 用途:根据 CPU/内存使用率或自定义指标,自动扩缩容 Deployment / StatefulSet 的副本数
  • 依赖
    • Metrics Server
    • 目标工作负载必须设置 resources.requests
  • 示例场景:Web 服务在流量高峰时自动扩容

四、服务发现与网络(Service & Networking)

Service

  • API 路径/api/v1/services
  • 是否独立资源:✅ 是
  • 作用:为 Pod 提供稳定网络入口(虚拟 IP + DNS)。
  • 类型
    • ClusterIP:默认,集群内访问
    • NodePort:通过 NodeIP:30000-32767 访问
    • LoadBalancer:云厂商负载均衡
    • ExternalName:映射外部 DNS

Headless Service

  • 定义:设置 clusterIP: None 的 Service
  • 作用:不分配 VIP,DNS 直接返回 Pod IP 列表,用于 StatefulSet 服务发现。

Ingress

  • API 路径/apis/networking.k8s.io/v1/ingresses
  • 是否独立资源:✅ 是
  • 作用:七层(HTTP/HTTPS)路由规则(基于域名 / 路径)。
  • 依赖:需部署 Ingress Controller(如 Traefik、Nginx)。

NetworkPolicy

  • API 路径/apis/networking.k8s.io/v1/networkpolicies
  • 是否独立资源:✅ 是
  • 作用:定义 Pod 之间的入站/出站流量控制规则(类似微隔离防火墙)
  • 依赖:必须使用支持 NetworkPolicy 的 CNI(如 Calico、Cilium)
  • 默认行为:若未定义任何 NetworkPolicy,所有 Pod 之间默认互通

五、配置与存储(Configuration & Storage)

ConfigMap

  • API 路径/api/v1/configmaps
  • 是否独立资源:✅ 是
  • 用途:存储非敏感配置(如 app.conf、环境变量)。

Secret

  • API 路径/api/v1/secrets
  • 是否独立资源:✅ 是
  • 用途:存储敏感信息(密码、Token、TLS 证书)。

PersistentVolume(PV)

  • API 路径/api/v1/persistentvolumes
  • 是否独立资源:✅ 是
  • 作用:集群中的一块实际存储资源(由管理员或动态供给创建)。
  • 生命周期:独立于 Pod,通常跨应用复用。

PersistentVolumeClaim(PVC)

  • API 路径/api/v1/persistentvolumeclaims
  • 是否独立资源:✅ 是
  • 作用:用户对存储的申请请求(例如“我要 10Gi 存储”)。
  • 使用方式:在 Pod 的 volumes 中引用 claimName

💡 注意

  • Volume(如 emptyDirhostPath不是独立资源,而是 Pod Spec 的子字段
  • 只有 PVPVC 是可独立声明的存储抽象

六、元数据与组织(Metadata & Organization)

Namespace

  • API 路径/api/v1/namespaces
  • 是否独立资源:✅ 是
  • 作用:提供逻辑隔离的虚拟集群(如 dev / prod)。
  • 范围:大多数资源(Pod、Service 等)属于某个 Namespace;Node、PV 等属于集群级。

Label & Selector

  • 是否独立资源:❌ 否
  • 作用:键值对标签系统,用于关联资源(如 Service 通过 selector 匹配 Pod)。
  • 使用位置:作为 metadata 字段出现在各类资源中。

ResourceQuota

  • API 路径/api/v1/resourcequotas
  • 是否独立资源:✅ 是
  • 作用:限制 Namespace 内资源的总用量上限(如 CPU、内存、Pod 数、PVC 数等)
  • 适用场景:多团队共享集群时,防止某个 Namespace 耗尽资源

LimitRange

  • API 路径/api/v1/limitranges
  • 是否独立资源:✅ 是
  • 作用:为 Namespace 中的容器设置 默认 / 最小 / 最大资源请求与限制
  • 典型配置
    • 若 Pod 未声明 resources.requests.cpu,自动设为 100m
    • 禁止容器申请超过 2Gi 内存

七、客户端与运维辅助

kubeconfig

  • 是否 Kubernetes API 资源:❌ 否
  • 作用:本地凭证文件(通常 ~/.kube/config),用于 kubectl 认证到 Cluster。
  • 说明:属于客户端配置,不在集群内。

Probe(探针)

  • 是否独立资源:❌ 否
  • 类型livenessProbereadinessProbestartupProbe
  • 声明位置:Container Spec 内
  • 作用:健康检查,由 kubelet 执行。

八、工作节点核心组件(Node Components)

描述运行在每个 Worker Node 上的关键进程和插件,负责 Pod 的实际运行与网络通信。

kubelet

  • 是否 Kubernetes API 资源:❌ 否
  • 作用
    • 工作节点上的核心代理进程,管理本机 Pod 和容器的生命周期
    • 从 API Server 监听分配给本节点的 Pod,并调用容器运行时启动 / 停止容器
    • 执行健康检查(livenessProbereadinessProbe
    • 挂载存储卷(如 PVC、hostPath)
    • 定期上报节点状态(CPU、内存、Ready 状态等)
  • 关键特性
    • 由 systemd 管理(如 systemctl status kubelet
    • 所有 Pod 最终均由 kubelet 创建,即使通过 Deployment 声明

Container Runtime(容器运行时)

  • 是否 Kubernetes API 资源:❌ 否
  • 作用
    • 实际运行容器的底层引擎(如拉取镜像、创建容器、管理生命周期)
  • 常见实现
    • containerd(推荐,轻量、符合 CRI 标准)
    • CRI-O(专为 Kubernetes 设计)
    • Docker Engine(需通过 dockershim,K8s v1.24+ 已移除原生支持)
  • 接口标准:通过 CRI(Container Runtime Interface) 与 kubelet 通信

CNI(Container Network Interface)

  • 是否 Kubernetes API 资源:❌ 否(是一套插件规范)
  • 作用
    • 为 Pod 分配唯一 IP 地址(集群内可达)
    • 配置跨节点网络通信(如 VXLAN、BGP、eBPF)
    • 实现 NetworkPolicy(网络策略,如 Calico)
  • 常见实现
    • Calico:高性能,支持 BGP 和 NetworkPolicy(生产推荐)
    • Flannel:简单易用,基于 VXLAN(适合学习)
    • Cilium:基于 eBPF,超低延迟,云原生新锐
  • 关键要求
    • 必须在集群初始化前部署(kubeadm 安装时需先应用 CNI YAML)

总结:核心设计原则

原则说明
Cluster 是根上下文所有资源运行于一个 Cluster 内
声明式 API所有 ✅ 资源均可通过 YAML 声明期望状态
关注点分离工作负载(Deployment)≠ 存储(PVC)≠ 网络(Service)
Pod 不直管永远通过控制器管理 Pod
存储解耦用 PVC 申请存储,Pod 只需引用,不关心底层 PV

Kubernetes 常用命令速查表

💡 提示

  • 所有命令默认操作 default 命名空间,加 -n <namespace> 指定其他命名空间
  • -o wide 查看更多列(如 Node、IP)
  • --help 查看子命令帮助

一、集群与节点信息

命令说明
kubectl cluster-info查看集群基本信息(API Server、CoreDNS 地址)
kubectl get nodes列出所有节点状态
kubectl describe node <node-name>查看节点详细信息(资源、Pod 列表、事件)
kubectl top node查看节点 CPU/内存使用(需 Metrics Server)

资源消耗速查

目标命令说明
看节点总消耗kubectl top nodes查看每个节点 CPU/内存使用情况
看所有 Pod 消耗kubectl top pods -A查看全集群所有 Pod CPU/内存
看某业务命名空间kubectl top pods -n hedgedoc查看 HedgeDoc 相关 Pod 消耗
看系统组件kubectl top pods -n kube-system查看 Traefik、metrics-server 等系统组件消耗
看服务与 Pod 对照kubectl get svc,pods -A -o wide帮助定位哪个 Service 对应哪个 Pod
看某个 Service 详情kubectl describe svc hedgedoc -n hedgedoc查看 selector、endpoints
看某个 Pod 详细信息kubectl describe pod <pod-name> -n <namespace>查看资源配置、事件、异常情况
持续刷新看变化watch kubectl top pods -A持续观察资源波动

二、资源查看(核心)

通用格式

bash
kubectl get <resource> [-n namespace] [-o wide|yaml|json]
资源常用命令说明
Podkubectl get pods查看 Pod 列表
Podkubectl get pods -A查看所有命名空间的 Pod
Podkubectl describe pod &lt;pod-name&gt;查看 Pod 详情(事件、挂载、IP)
Podkubectl logs &lt;pod-name&gt; [-c container]查看日志
Podkubectl exec -it &lt;pod-name&gt; -- /bin/sh进入容器终端
Deploymentkubectl get deployments查看 Deployment
Deploymentkubectl describe deployment &lt;name&gt;查看滚动更新历史、ReplicaSet
StatefulSetkubectl get statefulsets查看有状态应用
DaemonSetkubectl get daemonsets查看每节点运行的 Pod
Jobkubectl get jobs查看任务状态
CronJobkubectl get cronjobs查看定时任务状态
Servicekubectl get svc查看服务(ClusterIP/NodePort)
Ingresskubectl get ingress查看七层路由规则
PVCkubectl get pvc查看存储申请状态
PVkubectl get pv查看存储供给状态
ConfigMapkubectl get cm查看配置
Secretkubectl get secret查看密钥

快捷别名:

  • po = pods
  • deploy = deployments
  • sts = statefulsets
  • ds = daemonsets
  • svc = services
  • ing = ingresses
  • cm = configmaps
  • ns = namespaces

三、应用部署与管理

命令说明
kubectl apply -f &lt;file.yaml&gt;声明式创建 / 更新资源(推荐)
kubectl delete -f &lt;file.yaml&gt;删除 YAML 中定义的资源
kubectl delete pod &lt;pod-name&gt;删除 Pod(Deployment 会自动重建)
kubectl scale deploy/&lt;name&gt; --replicas=3手动扩缩容 Deployment
kubectl rollout status deploy/&lt;name&gt;查看滚动更新进度
kubectl rollout history deploy/&lt;name&gt;查看发布历史
kubectl rollout undo deploy/&lt;name&gt;回滚到上一版本
kubectl rollout undo deploy/&lt;name&gt; --to-revision=2回滚到指定版本

四、日志与调试

命令说明
kubectl logs &lt;pod&gt;查看 Pod 主容器日志
kubectl logs &lt;pod&gt; -c &lt;container&gt;查看多容器 Pod 中指定容器日志
kubectl logs -f &lt;pod&gt;实时跟踪日志(类似 tail -f
kubectl logs --previous &lt;pod&gt;查看已崩溃容器的日志
kubectl exec -it &lt;pod&gt; -- /bin/sh进入容器执行命令(调试必备)
kubectl port-forward &lt;pod&gt; 8080:80将本地 8080 端口转发到 Pod 的 80 端口(本地调试)
kubectl port-forward svc/&lt;service&gt; 9000:9000转发到 Service(更稳定)

五、配置与上下文管理

命令说明
kubectl config view查看当前 kubeconfig 配置
kubectl config get-contexts列出所有集群上下文
kubectl config use-context &lt;context-name&gt;切换集群上下文
kubectl config current-context查看当前使用的上下文

六、批量操作与技巧

命令说明
kubectl get all查看当前命名空间下所有常见资源(Pod、Service、Deploy 等)
kubectl get all -A查看全集群所有资源(慎用,输出很长)
kubectl label pod &lt;pod&gt; env=prod给资源打标签
kubectl annotate pod &lt;pod&gt; owner=team-a添加注解(非查询用,用于工具集成)
kubectl explain &lt;resource&gt;查看资源字段说明(如 kubectl explain pod.spec.containers

五个常见命令

bash
kubectl get pods -A
kubectl describe pod <name>
kubectl logs -f <pod>
kubectl exec -it <pod> -- sh
kubectl apply -f .

最佳实践建议

  1. 永远优先用 kubectl apply -f,不要优先用 create
  2. 删除资源优先用 YAML:kubectl delete -f app.yaml
  3. 调试先看事件:kubectl describe pod &lt;xxx&gt;,重点看 Events 部分
  4. 日志看不全可加 --since=1h--tail=100
  5. 不确定 YAML 写法时,可用 kubectl create ... --dry-run=client -o yaml 生成模板

k3s 安装与初始化记录

1. 安装 k3s

bash
wget -O - https://get.k3s.io | sh -

2. 准备 kubeconfig

bash
mkdir -p /home/ME/.kube
sudo cat /etc/rancher/k3s/k3s.yaml > /home/ME/.kube/config
sudo chown ME:ME /home/ME/.kube/config
chmod 600 /home/ME/.kube/config

3. 配置 kubectl 别名与环境变量

bash
echo 'alias k=kubectl' >> ~/.bashrc
echo 'export KUBECONFIG="$HOME/.kube/config"' >> ~/.bashrc
source ~/.bashrc

4. MinIO 部署记录

bash
sudo mkdir -p /mnt/data_disk/minio-data
sudo chown -R 1000:1000 /mnt/data_disk/minio-data
kubectl apply -f minio-deploy.yaml
kubectl get svc minio-service
kubectl logs -l app=minio --tail=10
kubectl describe pod -l app=minio

5. 其他记录

bash
sudo nano /etc/rancher/k3s/registries.yaml