当前位置: 首页 > news >正文

k8s高频面试题汇总

📖 目录

  • 一、基础概念篇
  • 二、核心组件篇
  • 三、Pod和容器篇
  • 四、网络和服务篇
  • 五、存储管理篇
  • 六、调度和资源管理篇
  • 七、实战操作篇
  • 八、故障排查篇

一、基础概念篇

1. 什么是Kubernetes?它解决了什么问题?

答案:

Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。

解决的问题:

  • 容器调度:在哪个节点运行哪个容器
  • 服务发现:容器如何找到彼此
  • 负载均衡:流量如何分配到多个容器实例
  • 自动扩缩容:根据负载自动调整容器数量
  • 滚动更新:零停机更新应用
  • 自愈能力:容器崩溃时自动重启

比喻理解:
Kubernetes就像一个交响乐团的指挥,协调各个乐手(容器)完成演奏(应用服务)。


2. 简述Kubernetes的架构组成?

答案:

Kubernetes集群由两部分组成:

控制平面(Control Plane)

┌──────────────────────────────────────┐
│ 控制平面节点 │
├──────────────────────────────────────┤
│ 1. API Server - 统一入口 │
│ 2. etcd - 配置存储 │
│ 3. Scheduler - 调度器 │
│ 4. Controller - 控制器 │
│ 5. Cloud Controller - 云控制器 │
└──────────────────────────────────────┘

工作节点(Worker Nodes)

┌──────────────────────────────────────┐
│ 工作节点 │
├──────────────────────────────────────┤
│ 1. kubelet - 节点代理 │
│ 2. kube-proxy - 网络代理 │
│ 3. Container Runtime - 容器运行时 │
└──────────────────────────────────────┘


3. Master节点和Node节点的职责分别是什么?

答案:

角色主要职责关键组件
Master节点集群管理、调度决策、API服务API Server, etcd, Scheduler, Controller
Node节点运行容器、执行任务kubelet, kube-proxy, Container Runtime

Master节点作用:

  • 做出调度决策
  • 监控和响应事件
  • 维护集群状态
  • 提供REST API

Node节点作用:

  • 运行Pod和容器
  • 向Master报告状态
  • 执行Master指令
  • 管理网络和存储

4. Pod的概念和作用是什么?

答案:

Pod定义:

  • Kubernetes中最小的部署和管理单位
  • 一个或多个容器的组合
  • 共享网络命名空间和存储卷

特点:

# Pod示例
apiVersion: v1
kind: Pod
metadata:name: nginx-pod
spec:containers:- name: nginximage: nginx:1.20ports:- containerPort: 80- name: sidecarimage: busyboxcommand: ["sleep", "3600"]

作用:

  • 资源共享:Pod内容器共享网络IP、端口空间、存储卷
  • 协同工作:支持sidecar模式(如日志收集、代理容器)
  • 生命周期管理:Pod是调度、扩展、删除的最小单位

5. Deployment、ReplicaSet、Pod的关系?

答案:

Deployment↓ 管理
ReplicaSet↓ 管理
Pod → 真正的容器

关系链:

  1. Deployment:声明式更新管理

    apiVersion: apps/v1
    kind: Deployment
    metadata:name: nginx-deployment
    spec:replicas: 3selector:matchLabels:app: nginx
    
  2. ReplicaSet:确保Pod副本数量

    • 由Deployment自动创建
    • 负责维护指定数量的Pod
  3. Pod:运行的实际容器

为什么需要三层?

  • Deployment:处理滚动更新、回滚
  • ReplicaSet:管理副本数量
  • Pod:运行应用

6. ConfigMap和Secret的区别和用法?

答案:

特性ConfigMapSecret
用途存储配置数据存储敏感信息
内容类型普通文本Base64编码
安全问题明文存储考虑加密
大小限制1MB1MB

ConfigMap示例:

apiVersion: v1
kind: ConfigMap
metadata:name: app-config
data:database_url: "mysql://localhost:3306"debug_mode: "true"
---
apiVersion: v1
kind: Pod
spec:containers:- name: appenvFrom:- configMapRef:name: app-config

Secret示例:

apiVersion: v1
kind: Secret
metadata:name: app-secret
type: Opaque
data:username: YWRtaW4=  # base64: adminpassword: cGFzc3dvcmQ=  # base64: password
---
apiVersion: v1
kind: Pod
spec:containers:- name: appenv:- name: DB_USERvalueFrom:secretKeyRef:name: app-secretkey: username

7. 什么是Service?有哪些类型?

答案:

Service定义了Pod的逻辑集合和访问策略。

Service类型:

  1. ClusterIP(默认)

    apiVersion: v1
    kind: Service
    spec:type: ClusterIP  # 仅集群内部访问ports:- port: 80
    
  2. NodePort

    spec:type: NodePortports:- port: 80nodePort: 30080  # 访问 <NodeIP>:30080
    
  3. LoadBalancer

    spec:type: LoadBalancer  # 云厂商负载均衡器
    
  4. ExternalName

    spec:type: ExternalNameexternalName: example.com  # DNS重定向
    

8. Namespace的作用是什么?

答案:

Namespace提供虚拟集群能力,用于资源隔离和管理。

作用:

# 查看所有Namespace
kubectl get namespaces# 创建Namespace
kubectl create namespace production# 在指定Namespace创建资源
kubectl create deployment nginx --image=nginx -n production

常用场景:

  • 环境隔离:dev、staging、production
  • 团队隔离:不同团队独立管理
  • 资源配额:限制Namespace资源使用

示例:

apiVersion: v1
kind: Namespace
metadata:name: production
---
# 创建带资源限制的Namespace
apiVersion: v1
kind: ResourceQuota
metadata:name: compute-quotanamespace: production
spec:hard:requests.cpu: "4"requests.memory: 8Gilimits.cpu: "8"limits.memory: 16Gi

9. Label和Selector的作用?

答案:

Label用于标识和组织资源,Selector用于选择资源。

Label示例:

apiVersion: v1
kind: Pod
metadata:name: nginxlabels:app: nginxenv: productiontier: frontendversion: v1.0
spec:containers:- name: nginximage: nginx:1.20

Selector示例:

apiVersion: apps/v1
kind: Deployment
spec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginx

查询示例:

# 通过Label选择Pod
kubectl get pods -l app=nginx
kubectl get pods -l env=production,tier=frontend# 不匹配选择
kubectl get pods -l 'app!=nginx'# 集合选择
kubectl get pods -l 'env in (production,staging)'

10. 什么是声明式管理和命令式管理?

答案:

命令式管理: 告诉系统"做什么"

kubectl create deployment nginx --image=nginx
kubectl scale deployment nginx --replicas=3
kubectl set image deployment nginx nginx=nginx:1.21

声明式管理: 描述"期望状态"

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx
spec:replicas: 3template:spec:containers:- name: nginximage: nginx:1.21

区别:

  • 命令式:执行具体操作
  • 声明式:描述目标状态,由系统保证

推荐:

  • 生产环境使用声明式(YAML文件)
  • 开发测试可使用命令式

二、核心组件篇

11. API Server的作用和特点?

答案:

API Server是Kubernetes集群的统一入口。

作用:

  1. 提供RESTful API接口
  2. 认证和授权
  3. 准入控制
  4. 数据验证
  5. 与etcd交互

特点:

# API Server地址
kubectl cluster-info# API Server端点
https://kubernetes.default.svc

工作流程:

用户请求 → kubectl → API Server↓验证(认证、授权、准入控制)↓存储到etcd↓通知相关组件(如Scheduler)

无状态设计:

  • 可以水平扩展
  • 不存储任何状态
  • 所有状态在etcd中

12. etcd的作用和工作原理?

答案:

etcd是Kubernetes的配置数据库。

作用:

# etcd存储的数据
- 所有资源定义(Pod、Service等)
- 集群状态
- 配置信息
- 服务发现信息

特点:

  • 分布式键值存储
  • 强一致性(Raft协议)
  • 高可用(3/5/7副本)

数据备份:

# 备份etcd数据
ETCDCTL_API=3 etcdctl snapshot save snapshot.db \--endpoints=https://127.0.0.1:2379 \--cacert=/etc/kubernetes/pki/etcd/ca.crt \--cert=/etc/kubernetes/pki/etcd/server.crt \--key=/etc/kubernetes/pki/etcd/server.key# 恢复etcd数据
etcdctl snapshot restore snapshot.db

重要提示:

  • etcd是Kubernetes的单点故障点
  • 必须定期备份
  • 生产环境需要多个etcd实例

13. Scheduler的工作原理和调度策略?

答案:

Scheduler负责将Pod调度到合适的节点。

工作流程:

1. Pod创建 → API Server
2. 写入etcd
3. Scheduler watch到新Pod
4. 过滤节点(Predicates)
5. 评分节点(Priorities)
6. 选择最优节点
7. 绑定节点(通过kubelet)

调度策略示例:

apiVersion: v1
kind: Pod
spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: disktypeoperator: Invalues:- ssd

常见调度策略:

  1. nodeSelector:节点选择
  2. nodeAffinity:节点亲和性
  3. podAffinity:Pod亲和性
  4. taint/toleration:污点和容忍
  5. 资源需求:CPU/内存限制

14. Controller Manager的功能?

答案:

Controller Manager包含多个控制器,维护期望状态。

主要控制器:

  1. Replication Controller
  2. ReplicaSet Controller
  3. Deployment Controller
  4. StatefulSet Controller
  5. DaemonSet Controller
  6. Job Controller
  7. CronJob Controller
  8. Node Controller
  9. Service Controller
  10. Endpoint Controller

工作流程:

for {// 1. 获取期望状态(Desired State)desired := getDesiredState()// 2. 获取当前状态(Current State)current := getCurrentState()// 3. 对比差异diff := compare(current, desired)// 4. 执行操作使当前状态接近期望状态execute(diff)// 5. 等待一段时间后循环time.Sleep(1 * time.Second)
}

示例:

# 查询控制器状态
kubectl get controllerrevisions
kubectl describe deployment nginx

15. kubelet的作用和职责?

答案:

kubelet是Node节点的代理,管理Pod生命周期。

职责:

  1. 从API Server获取Pod清单
  2. 启动/停止容器
  3. 监控容器健康状态
  4. 向Master报告状态
  5. 挂载存储卷
  6. 容器网络配置

命令示例:

# 查看kubelet状态
systemctl status kubelet# 查看kubelet日志
journalctl -u kubelet -f# kubelet配置
cat /var/lib/kubelet/config.yaml

工作流程:

API Server → kubelet → CRI → Container Runtime → 启动容器

16. kube-proxy如何实现负载均衡?

答案:

kube-proxy负责实现Service的负载均衡。

三种模式:

  1. userspace模式(早期)

    • 用户空间实现
    • 性能较差
  2. iptables模式(默认)

    # 查看iptables规则
    iptables -t nat -L KUBE-SERVICES# 工作原理
    # 生成iptables规则转发流量
    
  3. ipvs模式(推荐生产)

    # 启用ipvs
    kubeadm init --config kubeadm-config.yaml
    # 或修改kube-proxy配置
    

负载均衡算法:

  • Round Robin(轮询)
  • Session Affinity(会话保持)
  • Least Connection(最少连接)

17. Container Runtime的作用?

答案:

Container Runtime负责运行容器。

常见实现:

  • Docker(历史最早)
  • containerd(CNCF项目)
  • CRI-O(Red Hat)
  • gvisor(Google)

CRI接口:

Kubernetes → CRI → Container Runtime

切换Runtime示例:

# containerd
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

18. 解释Kubernetes的声明式API模型?

答案:

声明式API是Kubernetes的核心设计理念。

对比:

特性命令式API声明式API(Kubernetes)
操作“创建X”“X应该存在”
重复执行可能失败幂等性
状态追踪不追踪自动追踪

YAML示例:

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx
spec:replicas: 3  # 声明:期望3个副本selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.20

控制器保证:

# 无论如何操作,最终都是3个Pod
kubectl delete pod nginx-xxx  # 自动重建
kubectl scale deployment nginx --replicas=1  # 会恢复到3

19. Master节点高可用如何实现?

答案:

通过部署多个Master节点实现高可用。

架构:

LoadBalancer┌───────┼───────┐↓       ↓       ↓Master1 Master2 Master3└───────┼───────┘↓etcd集群(3节点)

组件高可用:

  1. API Server:无状态,支持负载均衡
  2. etcd:Raft协议,奇数节点(3/5/7)
  3. Scheduler/Controller:Leader选举机制

部署示例:

# 查看Master节点
kubectl get nodes -l node-role.kubernetes.io/master# etcd集群信息
etcdctl member list

20. Node节点的健康检查和状态?

答案:

kubelet定期向Master报告节点状态。

节点状态:

# 查看节点状态
kubectl get nodes# 查看详细状态
kubectl describe node <node-name># 节点条件(Conditions)
- Ready: 节点是否健康
- MemoryPressure: 内存压力
- DiskPressure: 磁盘压力
- PIDPressure: 进程ID压力

节点操作:

# 标记节点为不可调度
kubectl cordon <node-name># 驱逐节点上的Pod
kubectl drain <node-name> --ignore-daemonsets# 取消不可调度标记
kubectl uncordon <node-name># 删除节点
kubectl delete node <node-name>

三、Pod和容器篇

21. Pod的生命周期和状态转换?

答案:

Pod状态:

Pending → Running → Succeeded/Failed↓Unknown

状态说明:

  • Pending:调度中,等待被调度到节点
  • ContainerCreating:创建容器
  • Running:至少一个容器运行中
  • Succeeded:所有容器成功退出
  • Failed:至少一个容器失败退出
  • Unknown:无法获取Pod状态

示例:

# 查看Pod状态
kubectl get pods# 查看详细信息
kubectl describe pod <pod-name># 查看Pod事件
kubectl get events --field-selector involvedObject.name=<pod-name>

22. Init Container的作用和用法?

答案:

Init Container在应用容器启动前运行。

用途:

apiVersion: v1
kind: Pod
metadata:name: myapp-pod
spec:initContainers:# 等待数据库就绪- name: wait-dbimage: busyboxcommand: ['sh', '-c']args:- |until nc -z db 3306; doecho "waiting for db..."sleep 2done# 初始化数据- name: init-dataimage: init-toolscommand: ['/init.sh']containers:- name: appimage: myapp:latest

特点:

  • 按顺序执行
  • 必须成功退出
  • 应用容器启动前运行

23. Pod的健康检查机制?

答案:

Kubernetes提供三种探针。

探针类型:

apiVersion: v1
kind: Pod
spec:containers:- name: appimage: myapp:latest# 存活探针livenessProbe:httpGet:path: /healthport: 8080initialDelaySeconds: 30periodSeconds: 10timeoutSeconds: 5failureThreshold: 3# 就绪探针readinessProbe:httpGet:path: /readyport: 8080initialDelaySeconds: 5periodSeconds: 5# 启动探针startupProbe:httpGet:path: /startupport: 8080failureThreshold: 30periodSeconds: 10

区别:

探针失败后果用途
liveness重启容器检查应用是否存活
readiness从Service移除检查是否就绪接收流量
startup重启容器慢启动应用

24. Pod的资源限制如何设置?

答案:

通过requests和limits限制资源使用。

示例:

apiVersion: v1
kind: Pod
spec:containers:- name: appimage: myapp:latestresources:# 请求资源(调度参考)requests:memory: "64Mi"cpu: "250m"  # 0.25 CPU# 限制资源(运行限制)limits:memory: "128Mi"cpu: "500m"  # 0.5 CPU

说明:

  • requests:Pod调度所需资源
  • limits:Pod运行时限制

CPU单位:

  • 1 = 1 CPU核心
  • 500m = 0.5 CPU核心
  • 250m = 0.25 CPU核心

内存单位:

  • 64Mi = 64 Mebibyte
  • 1Gi = 1 Gibibyte

资源配额:

apiVersion: v1
kind: ResourceQuota
metadata:name: compute-quota
spec:hard:requests.cpu: "4"requests.memory: 8Gilimits.cpu: "8"limits.memory: 16Gi

25. 如何实现优雅关闭?

答案:

通过SIGTERM信号实现优雅关闭。

Pod配置:

apiVersion: v1
kind: Pod
metadata:name: graceful-shutdown
spec:containers:- name: appimage: myapp:latest# 优雅关闭等待时间(默认30秒)lifecycle:preStop:exec:command: ["/bin/sh", "-c", "sleep 15"]

工作流程:

1. 收到删除请求
2. Pod状态变为Terminating
3. 从Service移除Pod
4. 发送SIGTERM信号
5. 等待gracePeriodSeconds(默认30秒)
6. 强制终止(SIGKILL)

代码示例:

import signal
import sysdef signal_handler(sig, frame):print('收到SIGTERM,开始优雅关闭...')# 清理工作cleanup()sys.exit(0)signal.signal(signal.SIGTERM, signal_handler)if __name__ == '__main__':# 应用逻辑run_app()

26. Sidecar模式的应用场景?

答案:

Sidecar是在同一个Pod中运行的辅助容器。

场景示例:

apiVersion: v1
kind: Pod
metadata:name: app-with-sidecar
spec:containers:# 主容器- name: appimage: myapp:latestvolumeMounts:- name: shared-logmountPath: /var/log# Sidecar容器- name: log-agentimage: fluentd:latestvolumeMounts:- name: shared-logmountPath: /var/log- name: fluentd-configmountPath: /etc/fluentdvolumes:- name: shared-logemptyDir: {}- name: fluentd-configconfigMap:name: fluentd-config

常见Sidecar用途:

  1. 日志收集
  2. 监控指标采集
  3. 服务代理
  4. 配置热重载

27. 什么是Ephemeral Storage?

答案:

临时的本地存储。

用途:

apiVersion: v1
kind: Pod
spec:containers:- name: appimage: myapp:latestresources:requests:ephemeral-storage: "2Gi"limits:ephemeral-storage: "4Gi"volumeMounts:- name: scratchmountPath: /tmpvolumes:- name: scratchemptyDir:sizeLimit: 1Gi

特点:

  • Pod删除后丢失
  • 用于缓存、临时文件
  • 可设置大小限制

28. Pod安全策略(Security Context)?

答案:

配置Pod和容器的安全属性。

示例:

apiVersion: v1
kind: Pod
metadata:name: security-context-demo
spec:# Pod级别的安全上下文securityContext:runAsUser: 1000fsGroup: 2000containers:- name: demoimage: nginx# 容器级别的安全上下文securityContext:allowPrivilegeEscalation: falserunAsNonRoot: truerunAsUser: 1000capabilities:drop:- ALLadd:- NET_BIND_SERVICE

常用配置:

  • runAsNonRoot:非root运行
  • readOnlyRootFilesystem:只读文件系统
  • capabilities:Linux能力

四、网络和服务篇

29. Service的负载均衡原理?

答案:

通过Endpoints和iptables/ipvs实现。

工作流程:

客户端 → Service:80 → iptables/ipvs → Pod IP

查看Endpoints:

# Service选择Pod
kubectl get endpoints nginx-service# Endpoints内容
# nginx-service 10.244.1.2:80,10.244.1.3:80,10.244.2.1:80

iptables规则:

# 查看Service的iptables规则
iptables -t nat -L -n | grep KUBE-SVC# 负载均衡规则
-A KUBE-SVC-XXXXXXXX -m statistic --mode random --probability 0.333...
-A KUBE-SVC-XXXXXXXX -m statistic --mode random --probability 0.5 ...
-A KUBE-SVC-XXXXXXXX -m tcp -p tcp -j DNAT --to-destination <Pod IP>:80

30. Ingress的作用和配置?

答案:

Ingress提供HTTP/HTTPS路由。

示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: example-ingress
spec:ingressClassName: nginxrules:- host: app1.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: app1-serviceport:number: 80- host: app2.example.comhttp:paths:- path: /apipathType: Prefixbackend:service:name: app2-serviceport:number: 8080# HTTPS配置tls:- hosts:- app1.example.comsecretName: app1-tls

常见Ingress控制器:

  • NGINX Ingress
  • Traefik
  • HAProxy
  • Istio Gateway

31. Headless Service的用途?

答案:

无ClusterIP的Service。

示例:

apiVersion: v1
kind: Service
metadata:name: nginx-headless
spec:clusterIP: None  # Headless Serviceselector:app: nginxports:- port: 80

用途:

  1. StatefulSet
  2. 直接访问Pod IP
  3. 服务发现(如DNS查询)

DNS解析:

# 普通Service返回ClusterIP
nslookup nginx-service
# -> 返回一个IP# Headless Service返回所有Pod IP
nslookup nginx-headless
# -> 返回多个Pod IP

32. Network Policy的作用?

答案:

Network Policy实现Pod级别的网络隔离。

示例:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: test-network-policy
spec:podSelector:matchLabels:app: apipolicyTypes:- Ingress- Egressingress:# 允许来自特定Pod的入站流量- from:- podSelector:matchLabels:app: frontendports:- protocol: TCPport: 8080egress:# 允许出站到数据库- to:- podSelector:matchLabels:app: databaseports:- protocol: TCPport: 5432

前提条件:

  • 需要CNI插件支持(如Calico、Cilium)

33. 如何实现会话保持(Session Affinity)?

答案:

通过Service的sessionAffinity配置。

示例:

apiVersion: v1
kind: Service
metadata:name: myapp-service
spec:type: ClusterIPsessionAffinity: ClientIPsessionAffinityConfig:clientIP:timeoutSeconds: 10800  # 3小时selector:app: myappports:- port: 80targetPort: 8080

原理:

  • 基于客户端IP的会话保持
  • 同一IP的请求路由到同一Pod
  • 适合需要会话状态的应用

34. Service和Pod的DNS解析?

答案:

Kubernetes提供DNS服务(CoreDNS)。

DNS名称规则:

Service:    <service-name>.<namespace>.svc.cluster.local
Pod:         <pod-ip>.<namespace>.pod.cluster.local

示例:

# 同Namespace
ping nginx-service# 跨Namespace
ping nginx-service.production# 完整域名
ping nginx-service.production.svc.cluster.local

Pod的DNS配置:

apiVersion: v1
kind: Pod
spec:dnsPolicy: ClusterFirstdnsConfig:nameservers:- 8.8.8.8searches:- default.svc.cluster.localoptions:- name: ndotsvalue: "2"

五、存储管理篇

35. PV、PVC、StorageClass的关系?

答案:

StorageClass(存储类)↓ 自动创建
PV(持久化卷)↓ 绑定
PVC(持久化卷声明)↓ 使用
Pod

示例:

# 1. StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:type: gp2---
# 2. PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-pvc
spec:accessModes:- ReadWriteOncestorageClassName: fast-ssdresources:requests:storage: 100Gi---
# 3. Pod使用
apiVersion: v1
kind: Pod
spec:containers:- name: mysqlvolumeMounts:- name: mysql-storagemountPath: /var/lib/mysqlvolumes:- name: mysql-storagepersistentVolumeClaim:claimName: mysql-pvc

36. Volume的类型和使用?

答案:

emptyDir:临时存储

apiVersion: v1
kind: Pod
spec:containers:- name: appvolumeMounts:- name: cachemountPath: /cachevolumes:- name: cacheemptyDir:sizeLimit: 1Gi

hostPath:主机路径

volumes:
- name: host-datahostPath:path: /datatype: DirectoryOrCreate

secret/configMap:配置数据

volumes:
- name: configconfigMap:name: app-config
- name: secretsecret:secretName: app-secret

37. StatefulSet使用存储的特点?

答案:

StatefulSet需要持久化存储。

示例:

apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql
spec:serviceName: "mysql"replicas: 3template:spec:containers:- name: mysqlvolumeMounts:- name: datamountPath: /var/lib/mysqlvolumeClaimTemplates:- metadata:name: dataspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "fast-ssd"resources:requests:storage: 100Gi

特点:

  • 每个Pod有独立的PVC
  • 有序创建和删除
  • 稳定的网络标识

38. 如何备份和恢复PVC数据?

答案:

通过Velero或手动备份。

Velero示例:

# 安装Velero
velero install# 备份PVC
velero backup create mysql-backup \--include-namespaces production \--snapshot-volumes# 恢复
velero restore create \--from-backup mysql-backup

手动备份:

# 创建备份Pod
kubectl run backup-pod --image=restic/restic:latest \--restart=Never --rm -it \-v <pvc-name>:/data \-- sh# 在Pod内执行备份
# restic backup /data

六、调度和资源管理篇

39. Pod的调度过程?

答案:

创建Pod → API Server → etcd↓Scheduler监听↓过滤节点(Predicates)↓评分节点(Priorities)↓选择最优节点↓绑定到节点(kubelet)↓节点上创建容器

调度示例:

# 查看调度事件
kubectl get events --field-selector reason=FailedScheduling# 手动指定节点
apiVersion: v1
kind: Pod
spec:nodeName: node-1  # 直接指定节点

40. 节点亲和性和Pod亲和性?

答案:

Node Affinity:Pod与节点

apiVersion: v1
kind: Pod
spec:affinity:nodeAffinity:# 必须满足requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: node-typeoperator: Invalues:- gpu# 优选preferredDuringSchedulingIgnoredDuringExecution:- weight: 100preference:matchExpressions:- key: disk-typeoperator: Invalues:- ssd

Pod Affinity:Pod与Pod

apiVersion: v1
kind: Pod
spec:affinity:podAffinity:# 必须与app=redis部署在同一节点requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- redistopologyKey: kubernetes.io/hostname

41. Taint和Toleration的作用?

答案:

污点和容忍用于节点调度控制。

节点污点:

# 添加污点
kubectl taint nodes node1 key=value:NoSchedule# 删除污点
kubectl taint nodes node1 key=value:NoSchedule-# 查看污点
kubectl describe node node1

Pod容忍:

apiVersion: v1
kind: Pod
spec:tolerations:- key: "key"operator: "Equal"value: "value"effect: "NoSchedule"- key: "node.kubernetes.io/unschedulable"operator: "Exists"effect: "NoExecute"tolerationSeconds: 300

污点效果:

  • NoSchedule:不调度
  • PreferNoSchedule:尽量避免
  • NoExecute:驱逐已运行的Pod

42. HPA自动扩缩容?

答案:

HorizontalPodAutoscaler自动调整Pod数量。

示例:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: app-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: app-deploymentminReplicas: 2maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 70- type: Resourceresource:name: memorytarget:type: UtilizationaverageUtilization: 80

自定义指标:

metrics:
- type: Podspods:metric:name: packets-per-secondtarget:type: AverageValueaverageValue: "1k"

43. 资源配额和限制范围?

答案:

ResourceQuota:Namespace配额

apiVersion: v1
kind: ResourceQuota
metadata:name: compute-quota
spec:hard:requests.cpu: "4"requests.memory: 8Gilimits.cpu: "8"limits.memory: 16Gipersistentvolumeclaims: "4"pods: "10"

LimitRange:默认限制

apiVersion: v1
kind: LimitRange
metadata:name: mem-limit-range
spec:limits:- default:memory: "1Gi"cpu: "500m"defaultRequest:memory: "512Mi"cpu: "250m"type: Container

七、实战操作篇

44. 如何部署一个有状态应用?

答案:

使用StatefulSet部署有状态应用。

MySQL StatefulSet示例:

apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql
spec:serviceName: mysqlreplicas: 3selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:8.0env:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: passwordports:- containerPort: 3306volumeMounts:- name: datamountPath: /var/lib/mysql- name: configmountPath: /etc/mysql/conf.dvolumeClaimTemplates:- metadata:name: dataspec:accessModes:- ReadWriteOnceresources:requests:storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:name: mysql
spec:clusterIP: Noneselector:app: mysqlports:- port: 3306
---
apiVersion: v1
kind: ConfigMap
metadata:name: mysql-config
data:my.cnf: |[mysqld]server-id=1log-bin=mysql-binbinlog-format=ROW

45. 如何实现滚动更新和回滚?

答案:

滚动更新:

# 方式1:更新镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.21# 方式2:修改YAML
kubectl apply -f deployment.yaml# 查看更新状态
kubectl rollout status deployment/nginx-deployment# 查看更新历史
kubectl rollout history deployment/nginx-deployment

回滚:

# 回滚到上一版本
kubectl rollout undo deployment/nginx-deployment# 回滚到特定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2# 查看详细历史
kubectl rollout history deployment/nginx-deployment --revision=2

更新策略:

apiVersion: apps/v1
kind: Deployment
spec:strategy:type: RollingUpdaterollingUpdate:maxUnavailable: 25%  # 最多不可用25%maxSurge: 25%        # 最多多25%额外minReadySeconds: 30      # 就绪等待时间progressDeadlineSeconds: 600  # 超时时间

46. 如何使用ConfigMap和Secret?

答案:

创建ConfigMap:

# 从文件创建
kubectl create configmap app-config \--from-file=config.properties \--from-file=log4j.properties# 从字面量创建
kubectl create configmap app-config \--from-literal=key1=value1 \--from-literal=key2=value2

在Pod中使用:

apiVersion: v1
kind: Pod
spec:containers:- name: appimage: myapp:latest# 环境变量方式env:- name: DATABASE_URLvalueFrom:configMapKeyRef:name: app-configkey: database_url# 所有键值对envFrom:- configMapRef:name: app-config# 文件挂载volumeMounts:- name: configmountPath: /etc/configvolumes:- name: configconfigMap:name: app-config

创建Secret:

# 从文件创建
kubectl create secret generic app-secret \--from-file=username.txt \--from-file=password.txt# 从字面量创建
kubectl create secret generic app-secret \--from-literal=username=admin \--from-literal=password=secret123

47. 如何设置资源限制和配额?

答案:

Pod资源限制:

apiVersion: v1
kind: Pod
spec:containers:- name: appimage: myapp:latestresources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"

Namespace配额:

apiVersion: v1
kind: ResourceQuota
metadata:name: dev-quota
spec:hard:requests.cpu: "4"requests.memory: 8Gilimits.cpu: "8"limits.memory: 16Gipersistentvolumeclaims: "10"secrets: "20"configmaps: "20"

LimitRange默认限制:

apiVersion: v1
kind: LimitRange
metadata:name: mem-limit-range
spec:limits:- default:memory: "512Mi"cpu: "500m"defaultRequest:memory: "256Mi"cpu: "250m"max:memory: "2Gi"cpu: "2"min:memory: "128Mi"cpu: "100m"type: Container

48. 如何实现健康检查?

答案:

配置三种探针。

健康检查配置:

apiVersion: apps/v1
kind: Deployment
metadata:name: web-app
spec:template:spec:containers:- name: appimage: myapp:latestports:- containerPort: 8080# 存活探针livenessProbe:httpGet:path: /healthport: 8080initialDelaySeconds: 30periodSeconds: 10timeoutSeconds: 5failureThreshold: 3# 就绪探针readinessProbe:httpGet:path: /readyport: 8080initialDelaySeconds: 5periodSeconds: 5successThreshold: 1failureThreshold: 3# 启动探针startupProbe:httpGet:path: /startupport: 8080failureThreshold: 30periodSeconds: 10

探针类型:

# HTTP探针
livenessProbe:httpGet:path: /healthport: 8080scheme: HTTP# TCP探针
livenessProbe:tcpSocket:port: 8080# 命令探针
livenessProbe:exec:command:- cat- /tmp/healthyinitialDelaySeconds: 5periodSeconds: 5

49. 如何排查Pod问题?

答案:

系统化的排查步骤。

步骤1:查看Pod状态

# 基本信息
kubectl get pods# 详细信息
kubectl describe pod <pod-name># 查看YAML
kubectl get pod <pod-name> -o yaml

步骤2:查看日志

# 当前日志
kubectl logs <pod-name># 指定容器
kubectl logs <pod-name> -c <container-name># 跟踪日志
kubectl logs -f <pod-name># 之前容器的日志(已重启)
kubectl logs <pod-name> --previous

步骤3:进入容器调试

# 进入Pod
kubectl exec -it <pod-name> -- /bin/sh# 进入特定容器
kubectl exec -it <pod-name> -c <container-name> -- /bin/sh# 执行命令
kubectl exec <pod-name> -- env

步骤4:查看事件

# Pod事件
kubectl get events --field-selector involvedObject.name=<pod-name># 所有事件
kubectl get events --sort-by='.lastTimestamp'# 查看特定类型的事件
kubectl get events --field-selector type=Warning

步骤5:资源检查

# 节点资源
kubectl top nodes# Pod资源使用
kubectl top pods# 节点详细信息
kubectl describe node <node-name>

50. 如何扩容和缩容?

答案:

手动扩缩容:

# 扩容
kubectl scale deployment nginx --replicas=5# 缩容
kubectl scale deployment nginx --replicas=2# 查看扩容状态
kubectl get deployment nginx

自动扩缩容(HPA):

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: app-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: appminReplicas: 2maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 70

垂直扩缩容(VPA):

# 安装VPA
kubectl apply -f https://github.com/kubernetes/autoscaler/vertical-pod-autoscaler/releases/latest/download/vpa-release.yaml# 创建VPA
kubectl autoscale vpa app-vpa --min=2 --max=10

51. 如何备份和恢复集群?

答案:

etcd备份:

# 备份etcd
ETCDCTL_API=3 etcdctl snapshot save snapshot.db \--endpoints=https://127.0.0.1:2379 \--cacert=/etc/kubernetes/pki/etcd/ca.crt \--cert=/etc/kubernetes/pki/etcd/server.crt \--key=/etc/kubernetes/pki/etcd/server.key# 查看备份状态
etcdctl --write-out=table snapshot status snapshot.db

Velero备份(推荐):

# 安装Velero
velero install \--provider aws \--bucket velero-backup \--secret-file ./credentials-velero# 创建备份
velero backup create cluster-backup# 列出备份
velero backup get# 恢复
velero restore create --from-backup cluster-backup

手动备份资源:

# 导出所有资源
kubectl get all --all-namespaces -o yaml > backup.yaml# 导出特定资源
kubectl get deployment nginx -o yaml > nginx.yaml

52. 如何进行CI/CD集成?

答案:

Jenkins集成:

pipeline {agent anystages {stage('Build') {steps {sh 'docker build -t myapp:$BUILD_NUMBER .'sh 'docker push myapp:$BUILD_NUMBER'}}stage('Deploy to K8s') {steps {sh '''kubectl set image deployment/myapp \myapp=myapp:$BUILD_NUMBER'''}}}
}

GitLab CI集成:

.deploy:script:- kubectl set image deployment/app app=app:$CI_COMMIT_SHA- kubectl rollout status deployment/app

ArgoCD(GitOps):

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:name: myapp
spec:source:repoURL: https://github.com/example/repopath: k8sdestination:server: https://kubernetes.default.svcnamespace: production

八、故障排查篇

53. Pod一直处于Pending状态?

答案:

排查步骤:

1. 查看调度失败原因

kubectl describe pod <pod-name>
# 查看 Events 部分

常见原因:

  • 资源不足(CPU/内存)
  • 节点选择器不匹配
  • 污点未容忍
  • PV/PVC问题

2. 查看节点资源

kubectl top nodes
kubectl describe node <node-name>

3. 检查节点选择器

kubectl get nodes --show-labels
kubectl get pod <pod-name> -o yaml | grep nodeSelector

4. 查看调度事件

kubectl get events --field-selector \reason=FailedScheduling

54. Pod一直处于CrashLoopBackOff状态?

答案:

排查步骤:

# 1. 查看当前状态
kubectl get pod <pod-name># 2. 查看日志
kubectl logs <pod-name># 3. 查看之前容器的日志
kubectl logs <pod-name> --previous# 4. 查看详细信息
kubectl describe pod <pod-name># 5. 查看事件
kubectl get events --field-selector \involvedObject.name=<pod-name>

常见原因和解决:

  • 应用错误:修复代码
  • 配置错误:检查ConfigMap/Secret
  • 资源不足:增加资源限制
  • 健康检查失败:调整探针

55. Service无法访问Pod?

答案:

排查步骤:

1. 检查Service和Endpoints

kubectl get svc <service-name>
kubectl get endpoints <service-name>
# Endpoints应该包含Pod IP

2. 检查Pod选择器

kubectl get pods --show-labels
kubectl get svc <service-name> -o yaml
# 确保selector匹配Pod的labels

3. 检查端口映射

kubectl get svc <service-name> -o yaml | grep targetPort
# 确保端口正确

4. 测试Pod连通性

# 从另一个Pod测试
kubectl run test --image=busybox -it -- sh
wget -O- http://<service-name>:80

5. 检查Network Policy

kubectl get networkpolicies

56. 节点NotReady问题排查?

答案:

排查步骤:

1. 查看节点状态

kubectl get nodes
kubectl describe node <node-name>

2. 检查kubelet状态

# SSH到节点
ssh <node-name># 查看kubelet状态
systemctl status kubelet# 查看kubelet日志
journalctl -u kubelet -f

3. 检查常见问题

# 容器运行时
systemctl status docker
# 或
systemctl status containerd# 网络插件
kubectl get pods -n kube-system# 磁盘空间
df -h

4. 检查证书

# 证书是否过期
openssl x509 -in /var/lib/kubelet/pki/kubelet-client.crt \-noout -dates

57. PVC无法绑定?

答案:

排查步骤:

1. 查看PVC状态

kubectl get pvc
kubectl describe pvc <pvc-name>

2. 查看PV

kubectl get pv
kubectl describe pv <pv-name>

3. 检查StorageClass

kubectl get storageclass
kubectl describe storageclass <sc-name>

4. 常见问题:

  • StorageClass不存在
  • PV资源不足
  • accessModes不匹配
  • nodeAffinity限制

58. 集群性能问题排查?

答案:

1. 查看资源使用

# 节点资源
kubectl top nodes# Pod资源
kubectl top pods --all-namespaces# 查看资源限制
kubectl describe nodes | grep -A 5 "Allocated resources"

2. 查看慢查询

# etcd慢查询
etcdctl --endpoints=https://127.0.0.1:2379 \--cacert=/etc/kubernetes/pki/etcd/ca.crt \--cert=/etc/kubernetes/pki/etcd/server.crt \--key=/etc/kubernetes/pki/etcd/server.key \endpoint health

3. 检查DNS性能

# 测试DNS解析速度
kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup kubernetes.default

4. 监控指标

# 使用Prometheus/Grafana监控
# 或Metrics Server
kubectl top --help

59. 镜像拉取失败?

答案:

排查步骤:

1. 查看Pod状态

kubectl describe pod <pod-name>
# 查找 ImagePullBackOff 或 ErrImagePull

2. 检查镜像名称

# 确保镜像名称正确
kubectl get pod <pod-name> -o yaml | grep image:

3. 检查私有镜像

# 创建Secret
kubectl create secret docker-registry regcred \--docker-server=<registry> \--docker-username=<username> \--docker-password=<password># 在Pod中使用
apiVersion: v1
kind: Pod
spec:imagePullSecrets:- name: regcredcontainers:- name: appimage: private-registry.com/app:latest

4. 测试镜像拉取

# 在节点上测试
docker pull <image-name>

60. etcd数据损坏如何恢复?

答案:

备份恢复:

# 1. 停止所有etcd Pod(单Master或多Master)
kubectl get pods -n kube-system | grep etcd# 2. 备份当前数据(如果有)
kubectl cp <etcd-pod-name>:/etc/kubernetes/etcd.yaml ./backup/# 3. 恢复备份
ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \--name etcd-0 \--initial-cluster etcd-0=https://127.0.0.1:2380 \--initial-advertise-peer-urls https://127.0.0.1:2380# 4. 重启etcd
# 5. 重启kubelet
systemctl restart kubelet

🎯 面试准备总结

推荐学习路径

  1. 理论基础(1-2周)

    • 掌握核心概念
    • 理解架构原理
    • 学习资源对象
  2. 实践操作(2-3周)

    • 搭建K8s集群
    • 部署实际应用
    • 练习常用命令
  3. 进阶提升(1个月)

    • 学习运维技能
    • 掌握故障排查
    • 了解生态工具
  4. 面试准备(1周)

    • 刷题巩固知识
    • 模拟面试场景
    • 总结项目经验

面试注意事项

  1. 技术深度

    • 不要只背概念,要理解原理
    • 准备具体案例和项目经验
  2. 实操能力

    • 熟悉kubectl命令
    • 会写YAML配置文件
    • 能排查常见问题
  3. 沟通表达

    • 条理清晰地回答
    • 结合具体例子说明
    • 展示解决问题的能力

推荐资源

  • Kubernetes官方文档
  • Kubernetes官方教程
  • Awesome Kubernetes
  • Kubernetes训练营

祝面试顺利!🚀

http://www.dtcms.com/a/531864.html

相关文章:

  • 一篇文章理解LRC校验:
  • 石家庄免费网站建设百度收录入口提交查询
  • 专业提供网站建设服务培训学校 网站费用
  • 找做网站公司需要注意什么条件国外网站建设什么价格
  • 阮一峰《TypeScript 教程》学习笔记——tsconfig.json 文件
  • python如何做声音识别
  • 解决Docker磁盘空间不足导致MySQL启动失败
  • 【微服务组件】Springboot结合Dubbo实现RPC调用
  • One-Shot Federated Learning with Classifier-FreeDiffusion Models
  • powershell终端在ide里默认位置不对
  • 探索Linux进程:从理论到实践
  • 正则化机制解析:L2 的约束逻辑与 L1 的特征选择
  • 股票与期货战法理论发展路径
  • 用Python手写一个能识花的感知器模型——Iris分类实战详解
  • MySQL笔记16
  • gRPC通信流程学习
  • 百度站长平台有哪些功能网站做权重的好处
  • 数据科学复习题2025
  • 牛客网 AI题​(二)机器学习 + 深度学习
  • 拆解AI深度研究:从竞品分析到出海扩张,这是GTM的超级捷径
  • HarmonyOS 环境光传感器自适应:构建智能光线感知应用
  • 护肤品 网站建设策划shopex网站经常出错
  • 机器人描述文件xacro(urdf扩展)
  • AI决策平台怎么选?
  • 当 AI 视觉遇上现代 Web:DeepSeek-OCR 全栈应用深度剖析
  • 紫外工业相机入门介绍和工业检测核心场景
  • 商业求解器和开源求解器哪个更适合企业?
  • 比尤果网做的好的网站深圳网站设计精选刻
  • WPF 控件速查 PDF 笔记(可直接落地版)
  • Selenium+Unittest自动化测试框架