Skip to main content
Kubernetes(K8s)面试高频考点,覆盖架构原理、核心资源、网络存储、调度策略、运维监控等核心知识。

一、基础概念

Q1: Kubernetes 是什么?

Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。 核心能力:
  • 自动化部署与回滚
  • 服务发现与负载均衡
  • 自我修复(容器重启、替换)
  • 水平扩缩容
  • 配置管理与密钥管理
  • 存储编排

Q2: Kubernetes 的整体架构是怎样的?

K8s 采用 Master-Worker 架构:
组件位置说明
kube-apiserverControl Plane集群的 API 入口,所有操作都通过它
etcdControl Plane分布式 KV 存储,保存集群所有状态
kube-schedulerControl Plane负责 Pod 调度
kube-controller-managerControl Plane运行各种控制器
kubeletWorker Node管理节点上的 Pod
kube-proxyWorker Node负责 Service 的网络代理
Container RuntimeWorker Node运行容器(如 containerd)

Q3: etcd 在 K8s 中的作用是什么?

etcd 是 Kubernetes 的”大脑”,存储集群的所有状态数据。 特点:
  • 分布式键值存储
  • 使用 Raft 协议保证一致性
  • 存储 Pod、Service、ConfigMap 等所有资源信息
  • 只有 API Server 直接与 etcd 交互
重要性:
  • etcd 数据丢失 = 集群完全失效
  • 生产环境必须做好 etcd 的备份和高可用

Q4: kube-apiserver 的作用?

API Server 是 Kubernetes 控制平面的核心组件。 主要职责:
  1. 提供 RESTful API 接口
  2. 认证、授权和准入控制
  3. 集群网关,所有组件通信的枢纽
  4. 唯一直接操作 etcd 的组件
  5. 提供 watch 机制,支持事件通知
# 所有 kubectl 命令都通过 API Server
kubectl get pods
# 等同于调用 GET /api/v1/namespaces/default/pods

Q5: kube-scheduler 如何进行调度?

Scheduler 负责将 Pod 分配到合适的 Node 上。 调度流程:
  1. 过滤(Filtering):筛选满足条件的节点
    • 资源是否充足(CPU、内存)
    • 节点是否有污点(Taints)
    • 亲和性规则是否满足
  2. 打分(Scoring):对候选节点打分
    • 资源利用率均衡
    • 节点亲和性优先级
  3. 选择:选择得分最高的节点

Q6: kube-controller-manager 包含哪些控制器?

Controller Manager 运行多个控制器,维护集群期望状态。
控制器作用
Node Controller监控节点状态,处理节点故障
Replication Controller维护 Pod 副本数
Deployment Controller管理 Deployment 资源
StatefulSet Controller管理有状态应用
Endpoints Controller填充 Endpoints 对象
Service Account Controller创建默认 ServiceAccount
Namespace Controller管理命名空间生命周期

Q7: kubelet 的作用是什么?

kubelet 是每个 Node 上的代理进程,负责管理 Pod 的生命周期。 主要职责:
  1. Pod 管理:接收 PodSpec,确保容器正常运行
  2. 健康检查:执行 Liveness 和 Readiness 探针
  3. 状态上报:定期向 API Server 汇报节点和 Pod 状态
  4. 资源监控:收集节点资源使用情况
  5. 容器日志:管理容器日志
# kubelet 通过 CRI 与容器运行时交互
kubelet CRI containerd 容器

Q8: kube-proxy 的工作模式有哪些?

kube-proxy 实现 Service 的负载均衡。
模式说明优缺点
userspace用户空间代理性能差,已弃用
iptables使用 iptables 规则转发默认模式,规则多时性能下降
IPVS使用 Linux IPVS高性能,支持更多负载均衡算法
# 查看 kube-proxy 模式
kubectl logs -n kube-system -l k8s-app=kube-proxy | grep "Using"

Q9: Pod 是什么?为什么是最小调度单位?

Pod 是 K8s 中最小的调度和部署单元。 Pod 特点:
  • 一个 Pod 可包含一个或多个容器
  • Pod 内容器共享网络和存储
  • Pod 内容器通过 localhost 通信
  • Pod 是原子调度单位
为什么不直接调度容器?
  1. 某些应用需要多容器紧密协作(如 sidecar 模式)
  2. Pod 提供了容器组的抽象
  3. 简化网络和存储的共享

Q10: Pod 的生命周期有哪些阶段?

阶段说明
PendingPod 已创建,等待调度或容器镜像下载
RunningPod 已调度到节点,至少一个容器运行中
Succeeded所有容器成功终止,不会重启
Failed所有容器终止,至少一个容器失败
Unknown无法获取 Pod 状态(通常是通信问题)

二、核心资源

Q11: Pod 的重启策略有哪些?

spec:
  restartPolicy: Always  # 可选:Always、OnFailure、Never
策略说明适用场景
Always容器退出时总是重启长期运行的服务
OnFailure只在失败时重启Job、CronJob
Never从不重启一次性任务

Q12: Liveness 和 Readiness 探针的区别?

探针作用失败后果
Liveness检测容器是否存活重启容器
Readiness检测容器是否就绪从 Service 中移除
Startup检测应用是否启动延迟其他探针
livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 15
  periodSeconds: 10

readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5

Q13: Deployment 和 ReplicaSet 的关系?

Deployment 管理 ReplicaSet,ReplicaSet 管理 Pod。
Deployment

    ├── ReplicaSet (v1) ── Pod, Pod, Pod
    └── ReplicaSet (v2) ── Pod, Pod, Pod  (滚动更新时)
Deployment 的能力:
  • 声明式更新
  • 滚动更新和回滚
  • 版本历史管理
  • 暂停和恢复部署

Q14: Deployment 如何实现滚动更新?

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%        # 最多超出期望数量的比例
      maxUnavailable: 25%   # 最多不可用的比例
滚动更新流程:
  1. 创建新的 ReplicaSet
  2. 逐步增加新 RS 的 Pod 数量
  3. 同时减少旧 RS 的 Pod 数量
  4. 直到新 RS 达到期望数量
# 查看滚动更新状态
kubectl rollout status deployment/nginx

# 回滚到上一版本
kubectl rollout undo deployment/nginx

# 回滚到指定版本
kubectl rollout undo deployment/nginx --to-revision=2

Q15: StatefulSet 和 Deployment 的区别?

特性DeploymentStatefulSet
Pod 名称随机后缀有序编号(-0, -1, -2)
启动顺序并行顺序启动
网络标识无稳定标识稳定的网络标识
存储共享 PVC每个 Pod 独立 PVC
适用场景无状态服务有状态服务(数据库、消息队列)

Q16: DaemonSet 的作用和使用场景?

DaemonSet 确保每个节点(或符合条件的节点)运行一个 Pod 副本。 使用场景:
  • 日志收集(Fluentd、Filebeat)
  • 监控代理(Node Exporter)
  • 网络插件(Calico、Flannel)
  • 存储守护进程
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
spec:
  selector:
    matchLabels:
      name: fluentd
  template:
    spec:
      containers:
      - name: fluentd
        image: fluentd:v1.14

Q17: Job 和 CronJob 的区别?

资源作用使用场景
Job一次性任务数据处理、迁移任务
CronJob定时任务定期备份、报表生成
# CronJob 示例
apiVersion: batch/v1
kind: CronJob
metadata:
  name: backup-job
spec:
  schedule: "0 2 * * *"  # 每天凌晨 2 点
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup
            image: backup:latest
          restartPolicy: OnFailure

Q18: Service 有哪些类型?

类型说明访问方式
ClusterIP集群内部访问只能在集群内部访问
NodePort节点端口暴露NodeIP:NodePort
LoadBalancer云负载均衡外部 LB IP
ExternalNameDNS 映射返回 CNAME 记录
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080
    nodePort: 30080  # 30000-32767

Q19: Service 如何实现服务发现?

K8s 提供两种服务发现机制: 1. 环境变量
# 自动注入的环境变量
MY_SERVICE_SERVICE_HOST=10.96.0.1
MY_SERVICE_SERVICE_PORT=80
2. DNS(推荐)
# Service DNS 格式
<service-name>.<namespace>.svc.cluster.local

# 示例
curl http://my-service.default.svc.cluster.local

Q20: Ingress 和 Service 的区别?

特性ServiceIngress
协议TCP/UDPHTTP/HTTPS
功能负载均衡路由、TLS 终止、虚拟主机
暴露方式NodePort/LB7 层负载均衡
使用场景服务间通信对外暴露 HTTP 服务
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

Q21: Headless Service 是什么?

Headless Service 是没有 ClusterIP 的 Service(设置 clusterIP: None)。 特点:
  • 不分配 ClusterIP
  • DNS 直接返回 Pod IP 列表
  • 用于有状态服务的直接访问
apiVersion: v1
kind: Service
metadata:
  name: mysql-headless
spec:
  clusterIP: None  # Headless
  selector:
    app: mysql
  ports:
  - port: 3306
使用场景: StatefulSet 中访问特定 Pod

Q22: Namespace 的作用是什么?

Namespace 用于逻辑隔离集群资源。 默认 Namespace:
  • default:默认命名空间
  • kube-system:系统组件
  • kube-public:公开资源
  • kube-node-lease:节点心跳
最佳实践:
  • 按环境隔离(dev、staging、prod)
  • 按团队隔离
  • 配合 ResourceQuota 限制资源
  • 配合 NetworkPolicy 网络隔离

三、配置与存储

Q23: ConfigMap 和 Secret 的区别?

特性ConfigMapSecret
用途非敏感配置敏感数据
存储明文Base64 编码
典型内容配置文件、环境变量密码、证书、密钥
# ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  config.yaml: |
    database:
      host: mysql
      port: 3306

# Secret
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  password: cGFzc3dvcmQxMjM=  # base64 encoded

Q24: 如何在 Pod 中使用 ConfigMap?

三种使用方式:
# 1. 环境变量
env:
- name: DATABASE_HOST
  valueFrom:
    configMapKeyRef:
      name: app-config
      key: database_host

# 2. 全部注入环境变量
envFrom:
- configMapRef:
    name: app-config

# 3. 挂载为文件
volumes:
- name: config-volume
  configMap:
    name: app-config
volumeMounts:
- name: config-volume
  mountPath: /etc/config

Q25: PV、PVC、StorageClass 的关系?

StorageClass (动态供应策略)


PersistentVolume (存储资源)

      ↓ (绑定)
PersistentVolumeClaim (存储请求)

      ↓ (挂载)
Pod
概念说明
PV集群级别的存储资源
PVC用户对存储的请求
StorageClass动态供应 PV 的模板

Q26: PV 的访问模式有哪些?

模式缩写说明
ReadWriteOnceRWO单节点读写
ReadOnlyManyROX多节点只读
ReadWriteManyRWX多节点读写
ReadWriteOncePodRWOP单 Pod 读写(K8s 1.22+)

Q27: PV 的回收策略有哪些?

策略说明
Retain保留数据,需手动处理
Delete删除 PV 和底层存储
Recycle清空数据(已弃用)

Q28: 什么是动态存储供应?

动态供应:通过 StorageClass 自动创建 PV。
# StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-storage
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp3
reclaimPolicy: Delete

# PVC(自动创建 PV)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes: ["ReadWriteOnce"]
  storageClassName: fast-storage
  resources:
    requests:
      storage: 10Gi

四、调度与扩缩容

Q29: nodeSelector 如何工作?

nodeSelector 通过标签匹配将 Pod 调度到特定节点。
# 给节点打标签
kubectl label nodes node1 disktype=ssd

# Pod 中使用 nodeSelector
spec:
  nodeSelector:
    disktype: ssd

Q30: Node Affinity 和 nodeSelector 的区别?

特性nodeSelectorNode Affinity
表达能力简单匹配支持复杂表达式
软硬约束硬约束支持软硬约束
操作符只有 InIn、NotIn、Exists 等
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:  # 硬约束
      nodeSelectorTerms:
      - matchExpressions:
        - key: disktype
          operator: In
          values: ["ssd"]
    preferredDuringSchedulingIgnoredDuringExecution:  # 软约束
      - weight: 1
        preference:
          matchExpressions:
          - key: zone
            operator: In
            values: ["zone-a"]

Q31: Pod Affinity 和 Anti-Affinity 的作用?

类型作用使用场景
Pod AffinityPod 调度到一起关联服务就近部署
Pod Anti-AffinityPod 分散调度高可用、故障隔离
affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
        matchExpressions:
        - key: app
          operator: In
          values: ["web"]
      topologyKey: "kubernetes.io/hostname"  # 不同节点

Q32: Taints 和 Tolerations 如何工作?

Taints(污点):阻止 Pod 调度到节点 Tolerations(容忍):允许 Pod 调度到有污点的节点
# 给节点添加污点
kubectl taint nodes node1 gpu=true:NoSchedule
# Pod 添加容忍
tolerations:
- key: "gpu"
  operator: "Equal"
  value: "true"
  effect: "NoSchedule"
Effect 类型:
  • NoSchedule:不调度新 Pod
  • PreferNoSchedule:尽量不调度
  • NoExecute:驱逐现有 Pod

Q33: 什么是 Pod 优先级和抢占?

优先级和抢占用于资源紧张时的调度决策。
# PriorityClass
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000000
globalDefault: false
description: "高优先级任务"

# Pod 使用
spec:
  priorityClassName: high-priority
抢占机制: 当高优先级 Pod 无法调度时,会驱逐低优先级 Pod

Q34: HPA 如何实现自动扩缩容?

HPA(Horizontal Pod Autoscaler)根据指标自动调整 Pod 副本数。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
# 快速创建 HPA
kubectl autoscale deployment nginx --min=2 --max=10 --cpu-percent=70

Q35: HPA 和 VPA 的区别?

特性HPAVPA
扩展方式水平扩展(增加 Pod 数量)垂直扩展(调整资源配额)
使用场景无状态服务有状态服务、单实例应用
成熟度内置稳定需要额外安装

五、网络与安全

Q36: Kubernetes 网络模型的基本原则?

K8s 网络模型要求:
  1. Pod 间通信:所有 Pod 可以直接通信(无 NAT)
  2. Node 与 Pod 通信:节点可以直接与所有 Pod 通信
  3. Pod IP 一致:Pod 看到的自己 IP 与其他 Pod 看到的一致
常见 CNI 插件:
  • Calico
  • Flannel
  • Cilium
  • Weave Net

Q37: Pod 之间如何通信?

场景通信方式
同 Pod 内容器localhost
同 Node 的 Pod直接通过 Pod IP
跨 Node 的 Pod通过 CNI 网络插件
通过 ServiceClusterIP / DNS

Q38: NetworkPolicy 的作用?

NetworkPolicy 用于控制 Pod 间的网络访问。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
  namespace: production
spec:
  podSelector: {}  # 应用到所有 Pod
  policyTypes:
  - Ingress
  - Egress
  # 不定义规则 = 拒绝所有

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-web
spec:
  podSelector:
    matchLabels:
      app: api
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: web
    ports:
    - port: 8080

Q39: RBAC 权限控制如何工作?

RBAC(Role-Based Access Control)基于角色的权限控制。
资源作用作用域
Role定义权限命名空间级别
ClusterRole定义权限集群级别
RoleBinding绑定用户和 Role命名空间级别
ClusterRoleBinding绑定用户和 ClusterRole集群级别
# Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]

# RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: alice
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

Q40: ServiceAccount 的作用?

ServiceAccount 为 Pod 提供身份认证。 用途:
  1. Pod 访问 API Server 的身份
  2. 拉取私有镜像的凭证
  3. RBAC 权限绑定的主体
# 创建 ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-sa
  
# Pod 使用 ServiceAccount
spec:
  serviceAccountName: my-sa

Q41: Pod Security 如何配置?

Pod Security 控制 Pod 的安全上下文。
spec:
  securityContext:
    runAsUser: 1000          # 运行用户
    runAsGroup: 3000         # 运行组
    fsGroup: 2000            # 文件系统组
    runAsNonRoot: true       # 禁止 root 运行
  containers:
  - name: app
    securityContext:
      allowPrivilegeEscalation: false  # 禁止提权
      readOnlyRootFilesystem: true     # 只读根文件系统
      capabilities:
        drop: ["ALL"]

六、运维与监控

Q42: kubectl 常用命令有哪些?

# 资源查看
kubectl get pods -o wide
kubectl describe pod nginx
kubectl logs nginx -f --tail=100

# 资源创建
kubectl apply -f deployment.yaml
kubectl create deployment nginx --image=nginx

# 资源编辑
kubectl edit deployment nginx
kubectl patch deployment nginx -p '{"spec":{"replicas":3}}'

# 资源删除
kubectl delete pod nginx
kubectl delete -f deployment.yaml

# 调试命令
kubectl exec -it nginx -- /bin/sh
kubectl port-forward pod/nginx 8080:80
kubectl cp nginx:/var/log/app.log ./app.log

# 集群管理
kubectl get nodes
kubectl cordon node1        # 禁止调度
kubectl drain node1         # 驱逐并禁止调度
kubectl uncordon node1      # 恢复调度

Q43: 如何排查 Pod 启动失败?

排查步骤:
# 1. 查看 Pod 状态
kubectl get pod nginx -o wide

# 2. 查看详细事件
kubectl describe pod nginx

# 3. 查看容器日志
kubectl logs nginx
kubectl logs nginx --previous  # 上一次容器日志

# 4. 进入容器调试
kubectl exec -it nginx -- /bin/sh
常见问题:
状态可能原因
ImagePullBackOff镜像拉取失败
CrashLoopBackOff容器启动后立即退出
Pending资源不足或调度失败
Init:ErrorInit 容器失败

Q44: 如何查看集群事件?

# 查看所有事件
kubectl get events --sort-by=.metadata.creationTimestamp

# 查看特定命名空间事件
kubectl get events -n kube-system

# 以 watch 模式查看
kubectl get events -w

Q45: Prometheus 和 Grafana 如何监控 K8s?

监控架构:
Node Exporter  → Prometheus → Grafana
kube-state-metrics ↗
cAdvisor ↗
核心组件:
  • Prometheus:指标采集和存储
  • Grafana:可视化展示
  • kube-state-metrics:集群状态指标
  • Node Exporter:节点指标
  • cAdvisor:容器资源指标

Q46: 如何收集 Pod 日志?

日志收集方案:
方案组件特点
EFKElasticsearch + Fluentd + Kibana功能强大
ELKElasticsearch + Logstash + Kibana经典方案
LokiLoki + Promtail + Grafana轻量级
Fluentd DaemonSet 方式:
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
spec:
  template:
    spec:
      containers:
      - name: fluentd
        image: fluentd
        volumeMounts:
        - name: varlog
          mountPath: /var/log
      volumes:
      - name: varlog
        hostPath:
          path: /var/log

Q47: Init Container 的作用?

Init Container 在主容器启动前运行,用于初始化工作。 使用场景:
  • 等待依赖服务就绪
  • 初始化配置文件
  • 下载依赖文件
  • 执行数据库迁移
spec:
  initContainers:
  - name: wait-mysql
    image: busybox
    command: ['sh', '-c', 'until nc -z mysql 3306; do sleep 2; done']
  containers:
  - name: app
    image: myapp

Q48: Sidecar 模式是什么?

Sidecar 是与主容器共同运行的辅助容器。 常见用途:
  • 日志收集:收集主容器日志
  • 代理:Service Mesh 数据面代理(Envoy)
  • 配置同步:从配置中心同步配置
spec:
  containers:
  - name: app
    image: myapp
  - name: log-collector
    image: fluentd
    volumeMounts:
    - name: logs
      mountPath: /var/log/app

Q49: 什么是 Helm?

Helm 是 Kubernetes 的包管理工具。 核心概念:
  • Chart:应用包,包含 K8s 资源模板
  • Release:Chart 的一次安装实例
  • Repository:Chart 仓库
# 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami

# 搜索 Chart
helm search repo nginx

# 安装 Chart
helm install my-nginx bitnami/nginx

# 查看 Release
helm list

# 升级
helm upgrade my-nginx bitnami/nginx --set replicaCount=3

# 卸载
helm uninstall my-nginx

Q50: Helm Chart 的结构?

mychart/
├── Chart.yaml          # Chart 元数据
├── values.yaml         # 默认配置值
├── charts/             # 依赖的其他 Chart
├── templates/          # K8s 资源模板
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── _helpers.tpl    # 模板助手函数
│   └── NOTES.txt       # 安装后提示
└── .helmignore         # 忽略文件

七、高级主题

Q51: 什么是 Operator?

Operator 是一种封装运维知识的 K8s 扩展。 核心思想:
  • 将运维操作编码为 Controller
  • 使用 CRD(Custom Resource Definition)扩展 API
  • 自动化复杂应用的生命周期管理
使用场景:
  • 数据库(MySQL Operator、Redis Operator)
  • 消息队列(Kafka Operator)
  • 监控系统(Prometheus Operator)

Q52: CRD 是什么?

CRD(Custom Resource Definition)用于扩展 Kubernetes API。
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: databases.example.com
spec:
  group: example.com
  names:
    kind: Database
    plural: databases
    singular: database
  scope: Namespaced
  versions:
  - name: v1
    served: true
    storage: true
    schema:
      openAPIV3Schema:
        type: object
        properties:
          spec:
            type: object
            properties:
              engine:
                type: string
              version:
                type: string

Q53: 什么是 Service Mesh?

Service Mesh 是微服务间通信的基础设施层。 功能:
  • 流量管理(路由、重试、熔断)
  • 安全(mTLS、认证授权)
  • 可观测性(指标、日志、链路追踪)
常见实现:
  • Istio:功能最全,学习曲线陡峭
  • Linkerd:轻量级,易于使用
  • Cilium:基于 eBPF,高性能

Q54: 什么是 GitOps?

GitOps 是以 Git 为唯一真实来源的运维方式。 核心原则:
  1. 基础设施即代码(IaC)
  2. Git 是唯一真实来源
  3. 声明式配置
  4. 自动同步和收敛
常用工具:
  • Argo CD
  • Flux

Q55: 如何实现 K8s 的多集群管理?

多集群管理方案:
方案说明
Rancher统一管理多个 K8s 集群
KubeFedKubernetes 联邦
Loft虚拟集群和多租户
Argo CDGitOps 方式管理多集群

八、场景问题

Q56: Pod 一直处于 Pending 状态怎么办?

排查步骤:
kubectl describe pod <pod-name>
常见原因:
原因解决方法
资源不足增加节点或调整资源请求
nodeSelector 不匹配检查标签或调整选择器
污点导致添加容忍或移除污点
PVC 未绑定检查 PV 和 StorageClass

Q57: Pod 频繁重启(CrashLoopBackOff)怎么办?

排查步骤:
# 查看日志
kubectl logs <pod-name> --previous

# 查看退出码
kubectl describe pod <pod-name>
常见原因:
  • 应用启动失败
  • 配置错误
  • 资源限制触发 OOMKilled
  • 健康检查配置不当

Q58: 如何优化 Pod 启动速度?

  1. 使用轻量级基础镜像(alpine)
  2. 预拉取镜像(使用 DaemonSet 预热)
  3. 优化健康检查参数
  4. 减少 Init Container 数量
  5. 开启镜像缓存
  6. 使用 StartupProbe

Q59: 如何实现零停机部署?

  1. 滚动更新策略
    strategy:
      type: RollingUpdate
      rollingUpdate:
        maxSurge: 1
        maxUnavailable: 0
    
  2. 配置 Readiness 探针
  3. 使用 PodDisruptionBudget
  4. 配置 preStop 钩子

Q60: 如何限制容器资源使用?

resources:
  requests:       # 调度时保证的资源
    memory: "256Mi"
    cpu: "250m"
  limits:         # 运行时的上限
    memory: "512Mi"
    cpu: "500m"
最佳实践:
  • 始终设置 requests 和 limits
  • 使用 LimitRange 设置默认值
  • 使用 ResourceQuota 限制命名空间总资源

Q61: 如何实现配置热更新?

方法一:ConfigMap 自动更新
  • 挂载为 Volume,kubelet 会自动同步
  • 应用需要监听文件变化
方法二:使用 Reloader
metadata:
  annotations:
    reloader.stakater.com/auto: "true"
方法三:滚动重启
kubectl rollout restart deployment my-app

Q62: 如何处理节点故障?

自动处理:
  1. kubelet 停止心跳上报
  2. Node Controller 检测到节点不可达
  3. 等待超时后标记 Pod 为 Terminating
  4. Pod 被调度到其他节点
手动处理:
# 禁止调度新 Pod
kubectl cordon <node>

# 驱逐现有 Pod
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data

# 维护完成后恢复
kubectl uncordon <node>

Q63: 如何备份和恢复 K8s 集群?

备份内容:
  1. etcd 数据(最重要)
  2. K8s 资源配置(YAML)
  3. PV 数据
备份工具:
  • Velero:备份 K8s 资源和 PV
  • etcdctl:备份 etcd
# etcd 备份
ETCDCTL_API=3 etcdctl snapshot save backup.db

# Velero 备份
velero backup create my-backup --include-namespaces=production

Q64: K8s 和 Docker Compose 的区别?

特性Docker ComposeKubernetes
规模单机集群
高可用不支持原生支持
服务发现简单完整
滚动更新有限完整支持
学习曲线
适用场景开发测试生产环境

Q65: 生产环境 K8s 最佳实践?

方面最佳实践
资源配置始终设置 requests 和 limits
健康检查配置 Liveness 和 Readiness 探针
安全启用 RBAC,使用非 root 用户运行
网络配置 NetworkPolicy
日志监控部署完整的日志和监控方案
备份定期备份 etcd 和重要数据
更新策略使用滚动更新,配置 PDB
GitOps采用 GitOps 工作流

九、高频考点清单

必考

  • K8s 架构(Control Plane / Worker Node)
  • Pod 概念和生命周期
  • Deployment 滚动更新原理
  • Service 类型和服务发现
  • ConfigMap 和 Secret 使用
  • PV/PVC 存储
  • 调度策略(nodeSelector、Affinity、Taints)

常考

  • StatefulSet vs Deployment
  • HPA 自动扩缩容
  • Ingress 与 Ingress Controller
  • RBAC 权限控制
  • NetworkPolicy
  • Pod 健康检查(Liveness/Readiness)
  • kubectl 常用命令

进阶

  • Operator 和 CRD
  • Service Mesh(Istio)
  • Helm 包管理
  • GitOps(Argo CD)
  • 多集群管理
  • etcd 原理
  • CNI 网络插件