Kubernetes(K8s)重要知识点复习与记录
一、K8s 概述
Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它起源于 Google 的 Borg 系统,现由 CNCF(云原生计算基金会)管理。
核心特性:
- 自动装箱、自我修复
- 水平扩展、服务发现
- 滚动更新与回滚
- 密钥与配置管理
- 存储编排
- 批处理与 CI/CD 支持
二、集群架构
K8s 集群由控制平面(Control Plane)和工作节点(Worker Node)组成。
1. 控制平面(Master 节点)
| 组件 | 功能 |
|---|---|
| kube-apiserver | 集群统一入口,提供 REST API,所有组件间通信都需经过它 |
| etcd | 分布式键值存储,保存集群所有状态数据(唯一存储) |
| kube-scheduler | 负责 Pod 调度的决策,决定 Pod 跑在哪个 Node 上 |
| kube-controller-manager | 运行各种控制器(Node、Replication、Endpoint 等) |
| cloud-controller-manager | 与云服务商对接(如负载均衡、存储卷) |
2. 工作节点(Node)
| 组件 | 功能 |
|---|---|
| kubelet | 节点上的"管家",与 apiserver 通信,管理本机 Pod 生命周期 |
| kube-proxy | 维护节点上的网络规则,实现 Service 负载均衡 |
| 容器运行时(Container Runtime) | 如containerd、CRI-O,负责真正运行容器 |
三、核心对象(Workload Resources)
1. Pod
- K8s最小调度单位,可包含 1~N 个紧密耦合的容器
- 同 Pod 内容器共享:网络命名空间、存储卷、IP 地址
- Pod 是临时性的,可能被重建,所以一般不直接创建
2. Deployment
- 最常见的无状态应用控制器
- 管理 ReplicaSet,支持滚动更新、回滚、扩缩容
- 典型命令:
kubectl rollout status deployment/web kubectl rollout undo deployment/web kubectl scale deployment/web --replicas=5
3. StatefulSet
- 用于管理有状态应用(如 MySQL、Redis、ZooKeeper)
- Pod 具有稳定的网络标识(hostname)、持久存储、有序部署/删除
- 每个 Pod 对应独立的 PVC 和 Headless Service
4. DaemonSet
- 确保每个 Node 上都运行一个Pod 副本
- 典型场景:日志收集(Filebeat)、节点监控(Node Exporter)、网络插件
5. Job / CronJob
- Job:运行一次性任务(计算完成后退出)
- CronJob:基于时间调度的 Job(类似 Linux crontab)
四、标签、选择器与命名空间
1. Label(标签)
- 键值对形式(
app=nginx),用于标识和分类资源 - 灵活、动态,常与选择器配合使用
2. Selector(选择器)
- 通过 Label 筛选资源,是 Service、Deployment 等关联 Pod 的桥梁
3. Namespace(命名空间)
- 用于多租户资源隔离
- 默认命名空间:
default、kube-system、kube-public - 删除命名空间会释放其下所有资源:
kubectl delete ns xxx
五、Service(服务发现与负载均衡)
Service 是一组提供相同服务的 Pod 的统一访问入口,核心是解决 Pod IP 动态变化的问题。
| 类型 | 说明 |
|---|---|
| ClusterIP | 集群内部访问(默认类型) |
| NodePort | 在每个 Node 上开放固定端口(30000-32767)外部可访问 |
| LoadBalancer | 调用云厂商 LB,对外暴露服务 |
| ExternalName | 通过 CNAME 映射到外部服务 |
底层实现机制:kube-proxy 通过 iptables 或 IPVS 模式转发流量到后端 Pod。
六、网络模型
1. 三大网络
- Node 网络:物理节点之间的通信
- Pod 网络:所有 Pod 之间可直接通信(无需 NAT)
- Service 网络:为 Service 分配的虚拟 IP(ClusterIP)
2.CNI 插件
- Flannel:简单易用,VXLAN/host-gw 模式
- Calico:支持网络策略,性能好,BGP 模式
- Cilium:基于 eBPF,高性能、可观测性强
3.Ingress
- 七层负载均衡,管理外部到集群内部服务的 HTTP/HTTPS 路由
- 需配合 Ingress Controller(如 Nginx Ingress、Traefik)使用
七、存储管理
1. Volume 分类
- 临时卷(emptyDir):Pod 删除时数据丢失
- 节点本地卷(hostPath):挂载宿主机目录
- 网络存储卷:NFS、Ceph、GlusterFS
- 云存储卷:AWS EBS、阿里云盘、Azure Disk
2. PV / PVC / StorageClass
- PV(PersistentVolume):集群级别的存储资源抽象
- PVC(PersistentVolumeClaim):用户对存储的"申请"
- StorageClass:动态供给存储的模板,定义 provisioner 与参数
- 流程:Pod → PVC → 绑定 PV(静态/动态) → 挂载
3.ConfigMap 与 Secret
- ConfigMap:明文配置(如配置文件、启动参数)
- Secret:敏感信息(密码、Token、证书),base64 编码
- 注入方式:环境变量或volume 挂载
八、调度策略
1. 调度流程
- 过滤(Predicate):筛选满足条件的 Node
- 打分(Priority):根据策略为 Node 评分
- 绑定:选择最优 Node,绑定 Pod
2. 常见调度方式
- nodeName:强制绑定指定节点
- nodeSelector:简单标签选择
- 亲和性(Affinity):
requiredDuringSchedulingIgnoredDuringExecution(硬亲和)preferredDuringSchedulingIgnoredDuringExecution(软亲和)
- 反亲和(anti-affinity):避免 Pod 调度到同一节点/区域
- 污点与容忍(Taint & Toleration):
- 节点打污点 → 普通 Pod 无法调度
- Pod 配容忍 → 可调度到对应节点
- 拓扑分布约束(Topology Spread Constraints):均匀打散 Pod
九、安全机制
1. RBAC(基于角色的访问控制)
- Role / ClusterRole:定义权限集合
- RoleBinding / ClusterRoleBinding:将权限绑定到 Subject
- Subject:User、Group、ServiceAccount
2. ServiceAccount
- Pod 使用的身份,用于调用 apiserver
- 默认挂载到
/var/run/secrets/kubernetes.io/serviceaccount
3. NetworkPolicy
- 定义 Pod 间的网络访问规则(白名单机制)
- 需要网络插件支持(Calico、Cilium)
4. SecurityContext
- 控制 Pod/容器的安全属性:用户 ID、特权模式、只读根文件系统、Capabilities 等
十、Helm 与 Kustomize
1. Helm(包管理工具)
- Chart:K8s 资源的模板化打包
- Release:Chart 在集群中的一次部署实例
- 核心概念:
values.yaml+ 模板 + release 管理 - 常用命令:
helm install my-redis bitnami/redis helm upgrade my-redis bitnami/redis helm rollback my-redis 12. Kustomize
- 无模板的配置管理工具
- 通过base + overlay方式实现环境差异化
- K8s 1.14+ 内置:
kubectl apply -k ./overlay
十一、可观测性
1. 健康检查(Probe)
| 类型 | 作用 |
|---|---|
| livenessProbe | 探测容器是否存活,失败则重启 |
| readinessProbe | 探测是否就绪,未就绪则从 Service 摘除 |
| startupProbe | 启动慢的应用,成功后才执行 liveness |
实现方式:httpGet、tcpSocket、exec
2. 监控体系
- metrics-server:采集 CPU/内存指标(kubectl top、HPA)
- Prometheus + Grafana:主流监控方案
- EFK / Loki:日志收集与展示
3. HPA(Horizontal Pod Autoscaler)
- 基于 CPU、内存或自定义指标自动扩缩容
- 需配合 metrics-server 或 KEDA
十二、常用命令速查
# 集群信息 kubectl cluster-info kubectl get nodes -o wide # 资源查看 kubectl get pods,svc,deploy -A kubectl describe pod <pod-name> kubectl logs -f <pod-name> -c <container> # 调试 kubectl exec -it <pod> -- /bin/sh kubectl port-forward <pod> 8080:80 kubectl cp <file> <pod>:/path # 部署与伸缩 kubectl apply -f deployment.yaml kubectl scale deploy/web --replicas=3 kubectl set image deploy/web web=nginx:1.25 # 上下文与配置 kubectl config use-context <context> kubectl config get-contexts十三、面试常考要点 ⚡
- Pod 创建流程:用户 → apiserver → etcd → scheduler → kubelet → CRI 运行时启动容器
- Deployment 滚动更新原理:新建 RS、逐步替换旧 Pod
- Service 负载均衡原理:iptables/IPVS 规则
- K8s 网络模型要求:Pod-IP 可直达、Node-IP 可直达、Pod 间跨节点直接通信
- etcd 一致性保证:基于 Raft 协议
- HPA 扩容算法:
desiredReplicas = ceil(currentReplicas * currentMetric / targetMetric) - StatefulSet 与 Deployment区别:网络标识、存储、部署顺序
