SRE-面试问答模拟-Linux与K8S

2024-09-07 15:30:20 浏览数 (3)

Linux 系统

1. grep、sed、awk、cut组合使用

grep:文本搜索工具,用于匹配正则表达式。

sed:流编辑器,用于文本替换和格式化。

awk:高级文本处理工具,支持复杂的文本解析和数据操作。

cut:从文本中按列或字符截取数据。

组合使用时,可用于复杂的文本处理和数据筛选。例如,结合 grep 查找关键字,awk 提取列数据,sed 替换内容。

2. HTTP错误码和原因

常见错误码:

404:资源未找到。

500:服务器内部误。

502:网关错误(通常是后端服务不可用或超时)。

403:无权限访问。

3. 长连接、短连接、WebSocket区别和使用场景

长连接:TCP连接在多次请求间持续保持。适用于实时通信,如数据库连接。

短连接:每次请求完成后断开连接,HTTP通常使用短连接。适用于HTTP请求等。

WebSocket:在单一连接上进行双向实时通信,适用于聊天室、股票行情等需要实时数据更新的场景。

4. nginx性能优化方式

调整worker_processes和worker_connections。

使用反向代理缓存。

开启gzip压缩。

使用keepalive保持连接。

5. LVS、nginx、haproxy区别和使用场景

LVS:四层负载均衡,基于IP和端口,适用于高性能需求。

nginx:七层负载均衡,基于HTTP协议,适用于应用层代理。

haproxy:支持四层和七层负载均衡,适合高并发场景。

6. 僵尸进程

子进程终止,但其父进程尚未读取其退出状态,导致进程占用资源但不工作。通过wait函数回收资源。

7. 进程、线程、协程区别

进程:系统分配资源的基本单位。

线程:进程中的执行单元,共享进程资源。

协程:用户态的轻量级线程,调度由程序本身控制。

8. nginx的异步非阻塞

nginx使用事件驱动机制,处理请求时不阻塞当前线程,通过异步方式处理I/O操作,提高并发处理能力。

9. Linux网络丢包排查

使用ping、traceroute排查网络路径。

查看ifconfig或ip命令下的接口错误和丢包信息。

使用tcpdump或wireshark抓包分析。

10. 常用的性能分析诊断命令

top、htop、vmstat、iostat、sar、strace、tcpdump、netstat、lsof等。

11. 进程中断、软中断、硬中断

进程中断:操作系统中断进程执行,调度其他任务。

软中断:处理异步事件,如网络包处理。

硬中断:由硬件触发,如外设请求CPU处理数据。

12. 不可中断进程

通常是处于等待I/O完成的进程,无法被杀死。

13. 栈内存和堆内存

栈内存:自动管理的内存,用于局部变量和函数调用。

堆内存:动态分配的内存,程序员手动管理。

14. top命令进程状态

状态包括R(运行)、S(睡眠)、D(不可中断)、Z(僵尸进程)、T(停止)。

15. /proc文件系统

虚拟文件系统,包含系统进程、内核、硬件信息,如/proc/cpuinfo、/proc/meminfo。

16. Load和CPU使用率区别

Load:系统负载,反映等待CPU执行的进程数量。

CPU使用率:CPU被使用的百分比,反映CPU忙碌程度。

17. MAC地址和IP地址的转换

MAC地址是网络接口的物理地址,IP地址是网络层的逻辑地址。ARP协议用于将IP地址转换为MAC地址。

18. 常见RAID类型和使用场景

RAID 0:条带化,性能高但无冗余。

RAID 1:镜像,数据冗余但性能一般。

RAID 5:带奇偶校验的条带化,兼顾性能和冗余。

RAID 10:条带化和镜像结合,性能和冗余兼具。

19. LVM的划分

使用pvcreate、vgcreate、lvcreate命令,创建物理卷、卷组和逻辑卷。

20. JVM内存查看和优化

使用jstat、jmap、jvisualvm查看内存使用情况,调整-Xmx、-Xms、-XX:PermSize等参数优化。

21. 内核参数管理

使用sysctl查看和修改内核参数。

22. 进程最大数、最大线程数、进程打开文件数调整

修改/etc/security/limits.conf或/etc/sysctl.conf调整。

23. du和df统计不一致原因

du统计文件和目录实际使用空间,df统计整个文件系统的使用情况,可能因文件未释放或被锁定导致不一致。

24. buffers与cached区别

buffers:缓存块设备数据。

cached:缓存文件系统数据。

25. lsof命令使用场景

查看打开的文件、网络连接、端口占用等信息,诊断资源泄漏。

26. Linux中的进程间通信方式

管道、消息队列、信号、共享内存、套接字等,用于不同的通信需求。以下是管道、消息队列、信号、共享内存和套接字的用途区别:

管道

管道主要用于具有亲缘关系的进程之间的通信。

用途:

通常在父子进程间传递数据。比如父进程生成一些数据,通过管道传递给子进程进行进一步处理。

适用于简单的数据传递场景,数据流向是单向的,若要实现双向通信,需要建立两个管道。

特点:

只能在有共同祖先的进程之间使用。

数据只能单向流动,如果需要双向通信,就需要建立两个管道。

管道的容量有限,一般为几 KB 到几 MB。

消息队列

消息队列是内核中的一个消息链表,由消息队列标识符标识。

用途:

用于在不同进程之间传递消息。多个进程可以向同一个消息队列发送消息,也可以从同一个消息队列接收消息。

适用于进程间需要异步通信的场景,发送进程可以在发送消息后继续执行其他任务,接收进程在需要的时候去读取消息。

特点:

消息队列可以实现多个进程之间的异步通信。

消息具有类型,可以按照类型接收特定的消息。

消息队列中的消息是有格式的,可以包含不同类型的数据。

信号

信号用于通知进程发生了某种事件。

用途:

用于异常情况的通知,例如非法内存访问、除零错误等。

也可以用于进程间的简单通信,比如一个进程向另一个进程发送特定的信号来触发某种行为。

特点:

信号是一种异步通信方式,发送信号的进程不知道接收信号的进程何时处理信号。

信号的种类有限,每种信号都有特定的含义。

信号处理可以被中断和恢复。

共享内存

共享内存是被多个进程共享的一块物理内存区域。

用途:

适用于需要高效数据共享的场景,多个进程可以同时读写共享内存中的数据,实现快速的数据交换。

常用于需要大量数据交互的应用,如科学计算、图像处理等。

特点:

共享内存的访问速度非常快,因为它直接在内存中进行操作。

需要进程自己进行同步控制,以避免数据冲突。

一旦创建,共享内存可以被多个进程同时访问。

套接字

套接字主要用于不同主机上的进程之间的通信。

用途:

在网络通信中广泛使用,实现不同计算机上的进程之间的数据传输。

可以用于实现各种网络应用,如客户端 - 服务器模式的应用程序。

特点:

支持不同主机之间的通信,通信范围广。

可以使用不同的协议,如 TCP、UDP 等。

提供了丰富的网络编程接口。

27. 进程优先级设置方法

使用nice和renice命令调整进程优先级。

28. 内存分页和分段

分页:将内存划分为固定大小的页。

分段:将内存划分为逻辑段,如代码段、数据段。

29. 自定义systemd服务

编写.service文件,定义服务启动、停止、重启的方式,放置于/etc/systemd/system/。

30. Linux内核模块加载与卸载

使用modprobe加载模块,rmmod卸载模块,模块信息在/lib/modules目录下。

31. Ansible roles使用场景

管理配置复杂的任务,如批量配置k8s集群。

Kubernetes

从基础架构到具体的技术细节和原理。以下是对每个问题的简要解答,可以作为面试前的快速参考。

1. Kubernetes (k8s) 理解

Kubernetes 是一个开源的容器编排平台,主要用于自动化部署、扩展和管理容器化应用程序。它支持多种容器运行时,并提供服务发现、负载均衡、自动扩展、健康检查等功能。

2. k8s 集群架构

典型的 Kubernetes 集群架构包括以下组件:

Master节点:负责集群的全局控制,包含 API Server、Scheduler、Controller Manager 和 etcd。

Worker节点:运行应用的 Pod,包含 kubelet、kube-proxy、Container Runtime。

Pod 创建过程:从 API Server 接收创建请求,Scheduler 为 Pod 分配节点,kubelet 在节点上启动 Pod 并运行容器。

3. Pod 删除流程

API Server 接收到删除请求,发出终止信号,Pod 进入 Terminating 状态,容器被优雅关闭,资源回收。

不同 node 上的 Pod 之间通信:通过 CNI 插件(如 Calico、Flannel)建立的 Overlay 网络进行通信,使用 Kubernetes 服务(Service)进行服务发现和负载均衡。

Pod 创建 Pending 状态的原因:资源不足、调度器未找到合适节点、网络或存储插件问题等。

4. Deployment 和 StatefulSet 区别:

Deployment 用于无状态应用,自动扩缩容,Pod 名称动态分配。

StatefulSet 用于有状态应用,支持稳定的网络标识和持久化存储。

5. kube-proxy 作用

负责实现 Kubernetes Service 的通信,维护 iptables 或 ipvs 规则以进行服务负载均衡。

修改 ipvs 规则:kube-proxy 通过动态生成 ipvs 规则,并通过 ipvsadm 工具查看或修改规则。

6. IPVS 比 iptables 效率高原因

PVS 使用的是内核态数据平面,专为负载均衡优化,性能和扩展性更强。

7. Pod 访问不通排查

检查 Network Policy、CNI 配置、iptables 或 IPVS 规则、节点间的网络连通性。

8. Network Policy 实现原理

通过定义流量规则,控制 Pod 之间及 Pod 与外部网络的通信,底层通过 CNI 插件实现。

探针和探测方法:Liveness、Readiness、Startup 探针,支持 HTTP、TCP 以及命令行方式检测 Pod 健康状态。

9. Pod 健康检查失败排查

检查探针定义、应用启动时间、网络连通性、日志输出,确保探测路径和端口正确。

10. Service 是什么

Service 是 Kubernetes 内的一个抽象,定义了一组提供相同服务的 Pod,并通过 ClusterIP、NodePort、LoadBalancer 等方式进行暴露。

11. metrics-server 采集数据链路

metrics-server 从 kubelet 收集节点和容器的资源使用信息,通过 API 提供给 HPA 等系统。

服务发现方式:通过 Service 或 DNS 解析,Headless Service 也可实现服务发现。

12. Pod 常用状态

Pending、Running、Succeeded、Failed、Unknown。

13. Pod 生命周期钩子函

PreStop 和 PostStart,允许在容器生命周期的特定时刻执行自定义操作。

14. Calico 和 Flannel 区别:

Calico:基于 BGP 的路由,实现 L3 网络,支持 Network Policy。

Flannel:Overlay 网络方案,主要用于 L2 网络,简单且开销较小。

Calico 组网原理:使用 BGP 或 IPIP 隧道实现跨节点通信,支持细粒度的网络策略。

15. Network Policy 使用场景

限制和允许特定 Pod 之间的流量或外部访问,增强集群的安全性。

16. kubectl exec 实现原理

通过 API Server 与 kubelet 通信,进入正在运行的容器,执行命令。

17. cgroup 限制 CPU 的方式

通过 cgroup 控制进程的 CPU 使用,设置 cpu.shares、cpu.cfs_quota_us 等参数。

18. kubeconfig 存放内容

集群信息、用户凭证、上下文,定义了如何访问集群。

19. Pod DNS 解析流程

通过 CoreDNS 或 kube-dns 服务解析域名,将服务名称转换为 IP 地址。

20. traefik 与 nginx ingress 对比

Traefik 提供更多现代化功能,如内置支持 Let’s Encrypt、动态配置、可观察性更强,而 Nginx 更加成熟、性能高。

21. Harbor 组件

包括核心服务 Core、Registry、ChartMuseum、Clair(安全扫描)、Notary(镜像签名)等。

22. Harbor 高可用实现

通过负载均衡、多实例部署、数据库和存储的高可用性方案实现。

23. ETCD 调优

关注 I/O 性能、网络延迟、数据压缩、定期备份、调整 snapshot 和 compaction 频率。

24. 千级集群注意事项

关注 etcd 性能、网络拓扑、负载均衡、资源配额、API Server 扩展、监控和日志收集。

25. 节点 NotReady 原因和影响

网络不通、kubelet 崩溃、磁盘空间不足等,影响服务可用性。

Service 与 Endpoints 关联

Service 根据 selector 选择 Pod,生成 Endpoints 对象,映射 IP 和端口。

26. ReplicaSet、Deployment 实现

通过控制器管理 Pod 副本数,Deployment 在此基础上提供滚动更新和回滚功能。

27. Scheduler 调度流程

接收 Pod 请求,过滤和评分节点,选择最佳节点分配 Pod。

28. HPA 实现

根据 metrics-server 提供的资源使用数据,自动调整 Pod 副本数。

29. request/limit 限制原理

通过 cgroup 和 Linux 内核对 CPU 和内存的分配进行限制。

30. Helm 原理

Helm 是 Kubernetes 的包管理工具,通过 Chart 定义应用,执行安装、升级、回滚等操作。

31. Helm rollback 实现

Helm 维护应用的版本记录,可以回滚到之前的状态。

32. Velero 备份与恢复流程

使用 velero backup 备份集群资源,velero restore 恢复到备份状态。

33. Docker 网络模式

Bridge、Host、None、Container 模式。

34. Docker 与 container 区别

Docker 是实现容器技术的工具,container 是操作系统级别的虚拟化技术。

35. 减少 Dockerfile 生成镜像体积

使用多阶段构建、尽量使用更小的基础镜像、清理缓存和临时文件。

36. k8s 日志采集方案

使用 Fluentd、Fluent Bit、Logstash、Loki 等工具采集日志。

37. Pause 容器作用

作为 Pod 中其他容器的“父”容器,负责管理网络和 PID 命名空间。

38. k8s 证书过期更新方法

使用 kubeadm certs renew 或手动生成新证书并更新集群。

39. K8S QoS 等级

Pod 根据资源请求和限制分为 Guaranteed、Burstable 和 BestEffort。

40. k8s 节点维护注意事项

优雅停止 Pod,Drain 节点,更新后重新加入集群。

41. Headless Service 与 ClusterIP 区别

Headless Service 不分配 ClusterIP,直接将流量路由到后端 Pod。

42. Linux 容器技术基础原理

基于 cgroup、namespace 和 chroot 提供的资源隔离和限制。

43. Pod 常见调度方式

资源请求、节点选择器、亲和性/反亲和性、污点和容忍。

44. Kubernetes Ingress 原理

通过 Ingress Controller 将外部请求路由到集群内部服务。

45. Kubernetes 模块与 API Server 通信方式

所有组件通过 REST API 与 API Server 通信。

46. kubelet 监控 Worker 节点

通过 kubelet 监控容器、Pod 的状态和资源使用。

47. 容器时区不一致解决方法

在容器中挂载主机的 /etc/localtime 或设置时区环境变量。

1 人点赞