GitLab FAQ
Kubernetes 是自动化容器编排系统,主要解决:
| 要解决的问题 | Kubernetes 提供的能力 |
|---|---|
| 服务数量多、手动部署麻烦 | 自动部署 Deployment |
| 服务需要水平扩缩容 | HPA、ReplicaSet |
| 服务会故障 | 自动自愈(重启 Pod、漂移节点) |
| 服务之间需要通信 | Service / DNS |
| 需要跨机房部署 | 控制平面 + 广义调度 |
| 应用需要可观测性 | Events、Logs、Metrics |
Pod 是 Kubernetes 最小调度单位,封装一个或多个共享网络、共享存储的容器。
原因:
- 容器之间需要共享 IP、端口、Volume。
- Kubernetes 调度的基本单位是 Pod,而不是容器。
- Sidecar 模式(如 envoy、log-agent)必须在同一个 Pod 才能共享资源。
| Workload | 使用场景 | 特点 |
|---|---|---|
| Deployment | Web、API 服务 | 无状态、随意扩缩、滚动更新 |
| StatefulSet | DB、MQ、Redis、ElasticSearch | 有序部署、有持久存储、稳定DNS |
| DaemonSet | 日志收集、监控、网络插件 | 每个节点都部署一个 |
什么时候用 StatefulSet?
当 Pod 需要稳定身份、独立存储、顺序部署时。
- Filter(预选):能跑的节点?(资源、污点、亲和性)
- Score(打分):哪个节点更适合?
- Bind(绑定):把 Pod 指定到节点
可能状态:
- NotReady
- MemoryPressure
- DiskPressure
- NetworkUnavailable
排查:
kubectl describe node nodex
journalctl -u kubelet -f
Taint:给节点设置限制
Toleration:Pod 的容忍策略
使用场景:
- 让部分节点只跑特定业务
- GPU 节点隔离
- master 节点隔离
命令:
kubectl taint nodes node1 key=value:NoSchedule
| 类型 | 适用场景 | 特点 |
|---|---|---|
| ClusterIP | 集群内部通信 | 默认类型 |
| NodePort | 外部访问 | 占用 node 端口 |
| LoadBalancer | 云厂商负载均衡 | 依赖云平台 |
- kube-proxy 维护 iptables/ipvs 规则
- 每次 Service 更新,kube-proxy 重写转发规则
- 客户端访问 Virtual IP(VIP)自动轮询 Endpoints
Pod 重建后 IP 变了怎么办?
Service 永久不变,Pod 的 IP 自动更新到 Endpoints。
- Service 是“L4”,Ingress 是“L7”
- Ingress 控制器负责:
- URL 路由
- HTTPS(TLS)
- 反向代理
- 七层负载均衡
| 概念 | 角色 | 类比 |
|---|---|---|
| PV | 持久卷 | 云盘 |
| PVC | 持久卷申请 | 云盘申请订单 |
| StorageClass | 自动创建 PV 的模板 | 云盘规格(SSD、HDD) |
- 每个 Pod 会自动创建自己的 PVC
- PVC 不会因为 Pod 重建而删除
- 有顺序性 0 -> 1 -> 2
- 创建新的 ReplicaSet(RS)
- 按策略(maxUnavailable / maxSurge)滚动替换
- 替换完成旧 RS 保留(用于回滚)
imagePullPolicy: Always
或
kubectl rollout restart deploy/myapp
- Pending
- Running
- Succeeded
- Failed
- Unknown
容器状态:
- Waiting(拉镜像)
- Running
- Terminated(退出码)
基于角色的访问控制。
对象:
- Role / ClusterRole
- RoleBinding / ClusterRoleBinding
- ServiceAccount
例如:
kubectl auth can-i get pods --as=system:serviceaccount:dev:tester
原因:证书 SAN 不包含访问的 IP/域名。
解决:
kubeadm init --apiserver-cert-extra-sans="api.example.com,10.0.0.10"
常见原因:
- PVC 无法绑定(无可用 PV)
- 无可调度节点(资源不足、污点)
- 节点 Label 不匹配
- 节点 NotReady
检查:
kubectl describe pod pod-name
kubectl get events --sort-by=.metadata.creationTimestamp
-
查看日志:
kubectl logs pod --previous -
查看容器启动命令:
kubectl describe pod -
是否探针失败(liveness/readiness):
kubectl describe pod | grep -i probe
- 镜像不存在
- Docker Hub 限流
- 私有仓库 Secret 错误
kubectl describe pod | grep -A3 "Image"
- kubelet 链不上 API Server
- 磁盘压力
- 内存压力
- 网络断开
- containerd/cri dockerd 失败
Calico 示例:
- 每个 Pod 拥有独立 IP(来自 CNI 插件)
- CNI 负责创建 Pod veth pair
- 路由管理统一由 Linux 内核 + CNI 组件维护
- Service 由 kube-proxy 提供转发(iptables/ipvs)
| 网络插件 | 特点 | 技术 |
|---|---|---|
| Calico(推荐) | 高性能、BGP、eBPF | 路由为主 |
| Flannel | 简单、兼容性高 | VXLAN、封包 |
| Cilium | eBPF、L7、网络安全 | eBPF |
| 项 | iptables | ipvs |
|---|---|---|
| 性能 | 中等 | 高 |
| 连接跟踪 | 有 | 无 |
| 功能 | 单机防火墙 | 四层负载均衡 |
| 适用 | 小规模 | 中大型集群 |
- Kubernetes 所有状态信息都存储在 etcd
- 满磁盘会导致:
- 写入失败
- Leader 选举失败
- API Server 无法读写
| 组件 | 职责 |
|---|---|
| kube-apiserver | 所有请求入口,认证、授权、准入 |
| kube-controller-manager | 副本控制、自愈、Service、Node 控制 |
| kube-scheduler | 选择最优节点 |
| kubelet | 管理本机 Pod |
| kube-proxy | 维护 Service 转发规则 |
- SIGTERM(grace period)
- readiness probe fail -> 从 LB 移除
- 等待 preStop
- SIGKILL(到达 timeout)
- Namespace
- Taint/Toleration
- NetworkPolicy
- RBAC
- 节点池
resources:
requests:
cpu: 500m
limits:
cpu: 1
- requests 决定调度
- limits 决定上限
典型用途:
- Envoy / Istio(服务网格)
- 日志收集(fluentd)
- 监控 agent
- 数据同步
- 不可预期
- 不可回滚
- 会导致节点缓存混乱
- CICD 无法管理版本