Appearance
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):运行用户工作负载的机器
- 控制平面(Control Plane):API Server、etcd、Scheduler、Controller Manager
- 关键特性:
- 提供统一的编排、调度、自愈、服务发现能力
- 所有命名空间、Pod、Service 等资源都隶属于一个 Cluster
- 管理方式:通过工具创建(如
kubeadm、k3s、EKS、GKE),无法用 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(如emptyDir、hostPath)不是独立资源,而是 Pod Spec 的子字段- 只有
PV和PVC是可独立声明的存储抽象
六、元数据与组织(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内存
- 若 Pod 未声明
七、客户端与运维辅助
kubeconfig
- 是否 Kubernetes API 资源:❌ 否
- 作用:本地凭证文件(通常
~/.kube/config),用于kubectl认证到 Cluster。 - 说明:属于客户端配置,不在集群内。
Probe(探针)
- 是否独立资源:❌ 否
- 类型:
livenessProbe、readinessProbe、startupProbe - 声明位置:Container Spec 内
- 作用:健康检查,由 kubelet 执行。
八、工作节点核心组件(Node Components)
描述运行在每个 Worker Node 上的关键进程和插件,负责 Pod 的实际运行与网络通信。
kubelet
- 是否 Kubernetes API 资源:❌ 否
- 作用:
- 工作节点上的核心代理进程,管理本机 Pod 和容器的生命周期
- 从 API Server 监听分配给本节点的 Pod,并调用容器运行时启动 / 停止容器
- 执行健康检查(
livenessProbe、readinessProbe) - 挂载存储卷(如 PVC、hostPath)
- 定期上报节点状态(CPU、内存、Ready 状态等)
- 关键特性:
- 由 systemd 管理(如
systemctl status kubelet) - 所有 Pod 最终均由 kubelet 创建,即使通过 Deployment 声明
- 由 systemd 管理(如
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]
| 资源 | 常用命令 | 说明 |
|---|---|---|
| Pod | kubectl get pods | 查看 Pod 列表 |
| Pod | kubectl get pods -A | 查看所有命名空间的 Pod |
| Pod | kubectl describe pod <pod-name> | 查看 Pod 详情(事件、挂载、IP) |
| Pod | kubectl logs <pod-name> [-c container] | 查看日志 |
| Pod | kubectl exec -it <pod-name> -- /bin/sh | 进入容器终端 |
| Deployment | kubectl get deployments | 查看 Deployment |
| Deployment | kubectl describe deployment <name> | 查看滚动更新历史、ReplicaSet |
| StatefulSet | kubectl get statefulsets | 查看有状态应用 |
| DaemonSet | kubectl get daemonsets | 查看每节点运行的 Pod |
| Job | kubectl get jobs | 查看任务状态 |
| CronJob | kubectl get cronjobs | 查看定时任务状态 |
| Service | kubectl get svc | 查看服务(ClusterIP/NodePort) |
| Ingress | kubectl get ingress | 查看七层路由规则 |
| PVC | kubectl get pvc | 查看存储申请状态 |
| PV | kubectl get pv | 查看存储供给状态 |
| ConfigMap | kubectl get cm | 查看配置 |
| Secret | kubectl get secret | 查看密钥 |
快捷别名:
po= podsdeploy= deploymentssts= statefulsetsds= daemonsetssvc= servicesing= ingressescm= configmapsns= namespaces
三、应用部署与管理
| 命令 | 说明 |
|---|---|
kubectl apply -f <file.yaml> | 声明式创建 / 更新资源(推荐) |
kubectl delete -f <file.yaml> | 删除 YAML 中定义的资源 |
kubectl delete pod <pod-name> | 删除 Pod(Deployment 会自动重建) |
kubectl scale deploy/<name> --replicas=3 | 手动扩缩容 Deployment |
kubectl rollout status deploy/<name> | 查看滚动更新进度 |
kubectl rollout history deploy/<name> | 查看发布历史 |
kubectl rollout undo deploy/<name> | 回滚到上一版本 |
kubectl rollout undo deploy/<name> --to-revision=2 | 回滚到指定版本 |
四、日志与调试
| 命令 | 说明 |
|---|---|
kubectl logs <pod> | 查看 Pod 主容器日志 |
kubectl logs <pod> -c <container> | 查看多容器 Pod 中指定容器日志 |
kubectl logs -f <pod> | 实时跟踪日志(类似 tail -f) |
kubectl logs --previous <pod> | 查看已崩溃容器的日志 |
kubectl exec -it <pod> -- /bin/sh | 进入容器执行命令(调试必备) |
kubectl port-forward <pod> 8080:80 | 将本地 8080 端口转发到 Pod 的 80 端口(本地调试) |
kubectl port-forward svc/<service> 9000:9000 | 转发到 Service(更稳定) |
五、配置与上下文管理
| 命令 | 说明 |
|---|---|
kubectl config view | 查看当前 kubeconfig 配置 |
kubectl config get-contexts | 列出所有集群上下文 |
kubectl config use-context <context-name> | 切换集群上下文 |
kubectl config current-context | 查看当前使用的上下文 |
六、批量操作与技巧
| 命令 | 说明 |
|---|---|
kubectl get all | 查看当前命名空间下所有常见资源(Pod、Service、Deploy 等) |
kubectl get all -A | 查看全集群所有资源(慎用,输出很长) |
kubectl label pod <pod> env=prod | 给资源打标签 |
kubectl annotate pod <pod> owner=team-a | 添加注解(非查询用,用于工具集成) |
kubectl explain <resource> | 查看资源字段说明(如 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 .
最佳实践建议
- 永远优先用
kubectl apply -f,不要优先用create - 删除资源优先用 YAML:
kubectl delete -f app.yaml - 调试先看事件:
kubectl describe pod <xxx>,重点看 Events 部分 - 日志看不全可加
--since=1h或--tail=100 - 不确定 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