2024运维面试题大全最新版

231 阅读42分钟

K8S 常见面试题

1. 谈谈你对K8s的理解

Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。它提供了一个由多个机器(节点)组成的集群环境,能够管理和调度容器,确保应用的高可用性和可扩展性。K8s的核心功能包括:

  • 自动化部署和回滚:K8s可以自动部署应用,并在需要时回滚到以前的版本。
  • 负载均衡和服务发现:K8s可以自动将流量分配到多个容器上,并提供服务发现机制。
  • 自我修复:K8s可以自动重启失败的容器,替换被删除的容器,以及在节点失效时重新调度容器。
  • 自动伸缩:K8s可以根据负载自动扩展或缩减容器数量。

2. K8s集群架构是什么

K8s集群架构主要由以下组件组成:

  • Master节点:负责管理整个集群,主要组件包括:

    • API Server:集群控制的入口,所有的操作都通过API Server进行。
    • etcd:分布式键值存储,用于保存集群的所有数据。
    • Controller Manager:负责执行集群的各种控制器,确保集群的状态与预期一致。
    • Scheduler:负责将新创建的Pod分配到合适的工作节点(Node)上。
  • Worker节点(Node):负责运行应用容器,主要组件包括:

    • kubelet:负责与Master节点通信,执行分配给本节点的任务。
    • kube-proxy:负责网络代理和负载均衡,确保Pod之间的通信。
    • Container Runtime:负责运行容器,常用的有Docker、containerd等。

3. 简述Pod创建过程

Pod是K8s中最小的部署单元,通常包含一个或多个容器。Pod的创建过程如下:

  1. 用户提交Pod定义:用户通过kubectl或其他方式提交Pod的定义(YAML或JSON格式)到API Server。
  2. API Server处理请求:API Server接收请求并将Pod定义存储到etcd中。
  3. Scheduler调度:Scheduler监视etcd中的Pod定义,并将未调度的Pod分配到合适的Node上。
  4. kubelet创建Pod:目标Node上的kubelet接收到调度指令,拉取容器镜像并创建容器。
  5. Pod启动:kubelet启动容器,并定期报告Pod的状态到API Server。

4. 简述删除一个Pod流程

删除Pod的过程如下:

  1. 用户提交删除请求:用户通过kubectl或其他方式提交删除Pod的请求到API Server。
  2. API Server处理请求:API Server接收请求并更新etcd中的Pod状态为"Terminating"。
  3. kubelet终止Pod:目标Node上的kubelet接收到终止指令,停止Pod中的所有容器。
  4. 清理资源:kubelet清理Pod相关的资源,并从Node中删除Pod信息。
  5. API Server更新状态:API Server从etcd中删除Pod的定义,完成删除过程。

5. 不同Node上的Pod之间的通信过程

不同Node上的Pod之间的通信主要通过以下方式实现:

  • Pod IP:每个Pod在创建时都会分配一个唯一的IP地址,Pod之间可以直接通过IP地址进行通信。
  • Service:K8s中的Service为一组Pod提供统一的访问入口,Service有一个固定的IP地址(ClusterIP)和DNS名称,Pod可以通过Service进行通信。
  • kube-proxy:kube-proxy在每个Node上运行,负责维护Service的网络规则,确保流量能够正确地路由到目标Pod。
  • 网络插件(CNI):K8s支持多种网络插件(如Calico、Flannel等),这些插件负责在不同Node之间创建虚拟网络,使得Pod之间的通信无缝进行。

6. Pod创建Pending状态的原因

Pod处于Pending状态通常是因为以下原因:

  • 资源不足:集群中没有足够的资源(CPU、内存等)来调度这个Pod。
  • 调度策略限制:Pod定义中的调度策略(如节点选择器、污点和容忍度等)限制了Pod的调度。
  • 网络问题:网络插件未正确配置或网络连接问题导致Pod无法分配到Node上。
  • 镜像拉取失败:kubelet无法从镜像仓库拉取Pod所需的容器镜像。
  • 集群配置问题:API Server、Scheduler或etcd等组件出现问题,导致Pod无法正确调度。

好的,我们继续解答以下问题:

7. Deployment和StatefulSet区别

DeploymentStatefulSet都是Kubernetes中用于管理Pod的控制器,但它们有不同的应用场景和特点:

  • Deployment

    • 主要用于无状态应用。
    • 支持滚动更新和回滚。
    • Pod是相互独立的,没有固定的标识。
    • Pod的启动顺序和终止顺序不重要。
  • StatefulSet

    • 主要用于有状态应用。
    • 每个Pod都有一个唯一的标识(例如,Pod-0、Pod-1)。
    • Pod的启动顺序和终止顺序是有序的(例如,先启动Pod-0,再启动Pod-1)。
    • 支持持久化存储,每个Pod可以有自己的持久化存储卷。

8. kube-proxy有什么作用

kube-proxy是Kubernetes中的一个网络代理,它在每个节点上运行,主要负责以下任务:

  • 维护网络规则:kube-proxy根据Service的定义,维护iptables或ipvs规则,以便将流量正确地路由到后端Pod。
  • 负载均衡:kube-proxy实现了Service的负载均衡,将流量分配到多个Pod。
  • 服务发现:kube-proxy通过监听Kubernetes API Server,动态更新网络规则,以支持Service的创建、更新和删除。

9. kube-proxy怎么修改ipvs规则

kube-proxy可以通过以下步骤修改ipvs规则:

  1. 配置kube-proxy使用ipvs模式
    • 在kube-proxy的配置文件中,设置--proxy-mode=ipvs
  2. 修改ipvs规则
    • kube-proxy会自动根据Service的定义和后端Pod的状态,动态更新ipvs规则。
    • 可以通过ipvsadm命令查看和手动修改ipvs规则。例如:
      ipvsadm -L -n
      ipvsadm -A -t 10.0.0.1:80 -s rr
      ipvsadm -a -t 10.0.0.1:80 -r 192.168.1.2:80 -m
      

10. Pod之间访问不通怎么排查

排查Pod之间访问不通的问题,可以按以下步骤进行:

  1. 检查Pod状态:确保Pod处于Running状态。

    kubectl get pods -o wide
    
  2. 检查网络配置:确保网络插件(如Calico、Flannel)正常运行。

    kubectl get pods -n kube-system
    
  3. 检查Service和Endpoints:确保Service正确配置,并且有对应的Endpoints。

    kubectl get svc
    kubectl get endpoints
    
  4. 检查网络规则:检查kube-proxy的iptables或ipvs规则。

    iptables -L -n
    ipvsadm -L -n
    
  5. 检查网络连通性:使用pingcurl命令测试Pod之间的网络连通性。

    kubectl exec -it <pod-name> -- ping <target-pod-ip>
    kubectl exec -it <pod-name> -- curl <target-pod-ip>:<port>
    
  6. 检查日志:查看相关Pod和kube-proxy的日志,查找错误信息。

    kubectl logs <pod-name>
    kubectl logs -n kube-system <kube-proxy-pod-name>
    

11. K8s中Network Policy的设计原理和实现方式

Network Policy是Kubernetes中用于控制Pod之间网络流量的资源,通过定义Network Policy,可以实现细粒度的网络隔离和安全控制。其设计原理和实现方式如下:

  • 设计原理

    • 基于标签选择器:Network Policy通过标签选择器定义要应用的Pod集合。
    • 基于规则:通过Ingress和Egress规则定义允许的流量方向和来源/目标。
    • 默认拒绝:如果没有定义Network Policy,则默认允许所有流量;一旦定义了Network Policy,未明确允许的流量将被拒绝。
  • 实现方式

    • 创建Network Policy资源,定义允许的流量规则。
    • 网络插件(如Calico、Cilium等)负责实现和执行Network Policy。

示例Network Policy:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-specific-ingress
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 3306

12. 探针有哪些?探测方法有哪些?

Kubernetes中有两种主要的探针(Probes)用于检测Pod的健康状态:

  • Liveness Probe:用于检测Pod是否存活,如果探测失败,Kubernetes会重启该容器。
  • Readiness Probe:用于检测Pod是否准备好接收流量,如果探测失败,Pod将从Service的Endpoints中移除。

探测方法有三种:

  1. HTTP GET:通过HTTP GET请求探测容器的某个端点。

    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 3
      periodSeconds: 3
    
  2. TCP Socket:通过尝试建立TCP连接探测容器的某个端口。

    readinessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 3
      periodSeconds: 3
    
  3. Exec Command:通过执行命令探测容器的健康状态。

    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5
    

13. Pod健康检查失败可能的原因和排查思路

Pod健康检查失败可能由以下原因引起:

  • 探针配置错误:探针的配置(如路径、端口、命令等)不正确。
  • 应用启动时间过长:应用需要较长时间启动,但探针的initialDelaySeconds设置过短。
  • 应用内部错误:应用内部出现错误,导致探针检查失败。
  • 资源不足:Pod所在节点资源不足,导致应用无法正常运行。

排查思路:

  1. 检查探针配置:确保探针配置正确。

    kubectl describe pod <pod-name>
    
  2. 查看Pod日志:检查Pod的日志,查找错误信息。

    kubectl logs <pod-name>
    
  3. 手动执行探针:手动在Pod中执行探针命令,检查是否成功。

    kubectl exec -it <pod-name> -- <probe-command>
    
  4. 检查资源使用情况:检查节点和Pod的资源使用情况。

    kubectl top nodes
    kubectl top pods
    

14. K8s的Service是什么

Service是Kubernetes中的一个抽象,用于定义一组Pod的访问策略。Service提供了一个稳定的访问入口(ClusterIP、NodePort或LoadBalancer),并通过标签选择器将流量路由到后端Pod。

Service类型:

  • ClusterIP:默认类型,只能在集群内部访问。
  • NodePort:在每个节点上开放一个端口,通过该端口可以从外部访问Service。
  • LoadBalancer:使用云提供商的负载均衡器,将流量分发到节点上的Service。

Service示例:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376
  type: ClusterIP

15. metrics-server采集指标数据链路

metrics-server是Kubernetes中的一个聚合层,用于收集集群中各个节点和Pod的资源使用情况(如CPU、内存)。其数据采集链路如下:

  1. kubelet:每个节点上的kubelet负责收集本节点和Pod的资源使用情况。
  2. metrics-server:metrics-server从各个节点的kubelet中收集资源使用数据。
  3. API Server:metrics-server将收集到的数据提供给Kubernetes API Server。
  4. kubectl top:用户可以通过kubectl top命令查看资源使用情况。

16. K8s服务发现有哪些方式?

Kubernetes中的服务发现主要有以下几种方式:

  • 环境变量:Pod启动时,Kubernetes会将Service的相关信息(如ClusterIP、端口等)注入到Pod的环境变量中。
  • DNS:Kubernetes内置的DNS服务(如CoreDNS)会为每个Service创建一个DNS记录,Pod可以通过Service的DNS名称进行访问。
  • API查询:Pod可以通过调用Kubernetes API Server查询Service和Endpoints信息。

17. Pod几种常用状态

Pod的常用状态包括:

  • Pending:Pod已被提交,但尚未被调度到节点上。
  • Running:Pod已被调度到节点上,并且至少有一个容器在运行。
  • Succeeded:Pod中的所有容器都已成功终止。
  • Failed:Pod中的所有容器都已终止,并且至少有一个容器以非零状态终止。
  • Unknown:由于无法与Pod所在节点通信,Pod的状态未知。

18. Pod生命周期的钩子函数

Pod生命周期中的钩子函数(Lifecycle Hooks)包括:

  • PostStart:容器启动后立即执行的命令或脚本。
  • PreStop:容器终止前执行的命令或脚本。

示例:

lifecycle:
  postStart:
    exec:
      command: ["sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
  preStop:
    exec:
      command: ["sh", "-c", "echo Goodbye from the preStop handler > /usr/share/message"]

19. ipvs为什么比iptables效率高

ipvs(IP Virtual Server)比iptables效率高的原因主要有以下几点:

  • 连接跟踪:ipvs具有内置的连接跟踪机制,可以更高效地处理大量并发连接。
  • 负载均衡算法:ipvs支持多种负载均衡算法(如轮询、最少连接等),并且在内核态实现,性能更高。
  • 状态同步:ipvs支持状态同步,可以在多节点之间共享连接状态,提高高可用性。
  • 低开销:ipvs在处理网络包时的开销更低,因为它在内核态直接进行处理,而iptables需要在用户态和内核态之间频繁切换。

20. Calico和Flannel的区别

CalicoFlannel都是Kubernetes中常用的网络插件,它们在设计和实现上有一些关键区别:

  • Calico

    • 基于路由:Calico使用BGP(边界网关协议)来进行路由,直接在IP层进行通信,无需覆盖网络。
    • 网络策略:Calico支持Kubernetes的Network Policy,可以实现细粒度的网络安全控制。
    • 性能:由于直接使用路由,Calico的网络性能较高,延迟较低。
    • 复杂性:配置和管理相对复杂,需要对BGP和路由有一定了解。
  • Flannel

    • 覆盖网络:Flannel使用覆盖网络技术(如VXLAN、Host-GW)来实现跨节点的Pod通信。
    • 简单易用:Flannel的配置和管理相对简单,适合入门和小规模集群。
    • 网络策略:Flannel本身不支持Network Policy,需要结合其他插件(如Calico)来实现。
    • 性能:由于使用覆盖网络,Flannel的网络性能和延迟相对较低。

21. Calico网络原理、组网方式

Calico的网络原理和组网方式如下:

  • 网络原理

    • BGP路由:Calico使用BGP协议在节点之间分发路由信息,每个节点都成为一个BGP peer。
    • IPIP隧道:在跨子网的情况下,Calico可以使用IPIP隧道来封装和转发数据包。
    • 网络策略:Calico支持Kubernetes的Network Policy,可以定义细粒度的网络访问控制规则。
  • 组网方式

    • 无覆盖网络模式:在同一子网内,Calico直接使用路由表进行通信,无需额外的封装。
    • IPIP模式:在不同子网之间,Calico使用IPIP隧道进行数据包封装和转发。
    • BGP模式:Calico的每个节点都作为BGP peer,通过BGP协议交换路由信息。

22. Network Policy使用场景

Network Policy的使用场景包括:

  • 安全隔离:在多租户环境中,通过Network Policy实现租户之间的网络隔离。
  • 访问控制:限制Pod之间的网络访问,确保只有授权的Pod可以访问特定服务。
  • 流量管理:控制流量的进出方向,防止未经授权的外部流量进入集群。
  • 合规性要求:满足企业或行业的安全合规性要求,通过细粒度的网络策略确保数据安全。

23. kubectl exec实现的原理

kubectl exec命令用于在Pod中的容器内执行命令,其实现原理如下:

  1. API Serverkubectl exec通过Kubernetes API Server发起请求。
  2. kubelet:API Server将请求转发给目标节点上的kubelet。
  3. 容器运行时:kubelet通过容器运行时(如Docker、containerd)在目标容器内执行命令。
  4. 数据传输:执行结果通过WebSocket或SPDY协议返回给kubectl客户端。

24. cgroup中限制CPU的方式有哪些

在cgroup中,可以通过以下方式限制CPU的使用:

  • cpu.shares:设置相对CPU权重,值越大,分配的CPU时间越多。

    echo 1024 > /sys/fs/cgroup/cpu/mygroup/cpu.shares
    
  • cpu.cfs_period_uscpu.cfs_quota_us:设置CPU时间配额,定义一个周期内可以使用的CPU时间。

    echo 100000 > /sys/fs/cgroup/cpu/mygroup/cpu.cfs_period_us
    echo 50000 > /sys/fs/cgroup/cpu/mygroup/cpu.cfs_quota_us
    
  • cpu.rt_runtime_uscpu.rt_period_us:设置实时任务的CPU时间配额。

    echo 1000000 > /sys/fs/cgroup/cpu/mygroup/cpu.rt_period_us
    echo 950000 > /sys/fs/cgroup/cpu/mygroup/cpu.rt_runtime_us
    

25. kubeconfig存放内容

kubeconfig文件存放Kubernetes集群的配置信息,包括:

  • clusters:集群信息,包括名称、API Server地址和证书信息。
  • users:用户信息,包括名称、证书、令牌等认证信息。
  • contexts:上下文信息,包括集群、用户和命名空间的关联。
  • current-context:当前使用的上下文。

示例kubeconfig文件:

apiVersion: v1
kind: Config
clusters:
- cluster:
    server: https://my-cluster.example.com
    certificate-authority: /path/to/ca.crt
  name: my-cluster
users:
- name: my-user
  user:
    client-certificate: /path/to/client.crt
    client-key: /path/to/client.key
contexts:
- context:
    cluster: my-cluster
    user: my-user
    namespace: my-namespace
  name: my-context
current-context: my-context

26. Pod DNS解析流程

Pod的DNS解析流程如下:

  1. DNS配置:Pod启动时,Kubernetes会将DNS服务器的IP地址配置到Pod的/etc/resolv.conf文件中。
  2. DNS查询:应用程序发起DNS查询请求,DNS请求首先发送到Pod的DNS服务器(通常是CoreDNS)。
  3. CoreDNS解析:CoreDNS根据Service和Pod的DNS记录进行解析,如果是外部域名,则转发给上游DNS服务器。
  4. 返回结果:CoreDNS将解析结果返回给Pod,应用程序获得解析后的IP地址。

27. Traefik对比Nginx Ingress优点

Traefik对比Nginx Ingress的优点包括:

  • 动态配置:Traefik支持动态配置,无需重启即可应用新的配置。
  • 自动发现:Traefik自动发现Kubernetes中的服务和Ingress资源,简化配置管理。
  • 多协议支持:Traefik支持HTTP/2、gRPC、WebSocket等多种协议。
  • 内置监控:Traefik内置Prometheus指标和Dashboard,方便监控和管理。
  • 插件支持:Traefik支持中间件插件,可以灵活扩展功能。

28. Harbor有哪些组件

Harbor是一个企业级的容器镜像仓库,主要组件包括:

  • Core:Harbor的核心服务,处理镜像管理、用户管理、权限控制等功能。
  • Registry:Docker镜像仓库,负责存储和分发容器镜像。
  • UI:Web用户界面,提供图形化的管理界面。
  • Database:用于存储Harbor的元数据,如用户、项目、镜像等。
  • Job Service:处理镜像复制、垃圾回收等后台任务。
  • Notary:镜像签名和验证服务,确保镜像的完整性和安全性。
  • ChartMuseum:Helm Chart仓库,支持存储和分发Helm Chart。

29. Harbor高可用怎么实现

Harbor高可用的实现方式包括:

  • 数据库高可用:使用MySQL/MariaDB的主从复制或Galera Cluster实现数据库高可用。
  • Redis高可用:使用Redis Sentinel或Redis Cluster实现Redis高可用。
  • Registry高可用:使用分布式存储(如Ceph、MinIO)或共享存储(如NFS)实现Registry的高可用。
  • 负载均衡:使用负载均衡器(如HAProxy、Nginx)分发流量到多个Harbor实例,实现服务高可用。
  • 容器编排:使用Kubernetes或Docker Swarm编排Harbor服务,实现自动扩展和故障恢复。

30. ETCD调优

ETCD调优的关键点包括:

  • 硬件配置:使用SSD存储和高性能网络,确保ETCD的读写性能。
  • 集群规模:根据集群规模调整ETCD的副本数,通常3个或5个副本。
  • 快照和压缩:定期进行快照和压缩,减少ETCD的数据存储量和磁盘空间占用。
    etcdctl snapshot save <snapshot-file>
    etcdctl compaction <revision>
    
  • 资源限制:设置ETCD的内存和CPU限制,防止资源耗尽。
    --quota-backend-bytes=<size>
    --max-snapshot-count=<count>
    
  • 网络优化:优化网络配置,降低网络延迟和抖动。
  • 监控和报警:使用Prometheus等监控ETCD的性能指标,并设置报警规则。

31. 假设K8s集群规模上千,需要注意的问题有哪些?

在大规模K8s集群(上千节点)中,需要注意以下问题:

  • 控制平面性能:确保API Server、ETCD、Controller Manager等控制平面的性能和高可用性。
  • 网络性能:优化网络插件的性能,确保跨节点通信的稳定性和低延迟。
  • 调度性能:优化调度器的性能,确保Pod的快速调度和分配。
  • 监控和日志:部署高效的监控和日志系统,及时发现和处理问题。
  • 资源管理:合理分配和管理集群资源,防止资源耗尽和瓶颈。
  • 安全性:加强集群的安全性,包括访问控制、网络策略、镜像安全等。
  • 自动化运维:使用自动化工具和脚本,简化集群的管理和维护。

32. 节点NotReady可能的原因?会导致哪些问题?

节点NotReady的可能原因包括:

  • 节点宕机:节点硬件故障或操作系统崩溃。
  • 网络问题:节点与控制平面之间的网络通信中断。
  • kubelet故障:kubelet进程崩溃或资源耗尽。
  • 磁盘空间不足:节点磁盘空间耗尽,导致kubelet无法正常工作。
  • 资源耗尽:节点的CPU、内存等资源耗尽,导致Pod无法调度。

节点NotReady会导致以下问题:

  • Pod调度失败:新的Pod无法调度到NotReady节点上。
  • 服务中断:运行在NotReady节点上的Pod可能无法正常工作,导致服务中断。
  • 数据丢失:如果NotReady节点上有状态应用(如数据库),可能导致数据丢失。

33. Service和Endpoints是如何关联的?

在Kubernetes中,Service和Endpoints通过标签选择器关联:

  1. Service定义:Service通过标签选择器定义要选择的Pod集合。
  2. Endpoints创建:Kubernetes自动创建与Service关联的Endpoints资源,包含符合标签选择器的Pod的IP地址和端口。
  3. 流量转发:Service将流量转发到Endpoints中的Pod,实现负载均衡。

示例:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

34. ReplicaSet、Deployment功能是怎么实现的?

ReplicaSetDeployment的功能实现如下:

  • ReplicaSet

    • 目标:确保指定数量的Pod副本在集群中运行。
    • 控制器:ReplicaSet控制器监控Pod的状态,创建或删除Pod以达到期望的副本数。
    • 标签选择器:通过标签选择器选择管理的Pod。
  • Deployment

    • 目标:管理应用的生命周期,包括滚动更新、回滚等。
    • 控制器:Deployment控制器管理ReplicaSet,确保应用的期望状态。
    • 滚动更新:Deployment通过创建新的ReplicaSet和逐步替换旧的ReplicaSet实现滚动更新。
    • 回滚:Deployment支持回滚到以前的版本,通过保存历史版本的ReplicaSet实现。

35. Scheduler调度流程

Kubernetes调度器的调度流程如下:

  1. 调度循环:调度器不断循环检查未绑定节点的Pod。
  2. 预选阶段:调度器根据预选规则筛选出符合条件的节点(如资源要求、亲和性等)。
  3. 优选阶段:调度器根据优选规则为符合条件的节点打分,选择得分最高的节点。
  4. 绑定节点:调度器将Pod绑定到选定的节点。
  5. 通知kubelet:调度器通过API Server通知目标节点上的kubelet启动Pod。

36. HPA怎么实现的

Horizontal Pod Autoscaler(HPA)通过自动调整Pod的副本数来实现应用的自动伸缩。其实现流程如下:

  1. 监控指标:HPA通过metrics-server或自定义指标收集应用的资源使用情况(如CPU、内存)。
  2. 计算需求:根据设定的目标值和当前指标,计算所需的Pod副本数。
  3. 调整副本数:HPA通过更新Deployment或ReplicaSet的副本数来调整Pod的数量。
  4. 滚动更新:Kubernetes根据新的副本数进行滚动更新,增加或减少Pod。

示例:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: my-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-deployment
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

37. Request Limit底层是怎么限制的

在Kubernetes中,Request和Limit是通过cgroups(控制组)和Linux内核的资源限制机制来实现的:

  • CPU限制

    • Request:设置cpu.shares来定义相对CPU权重,确保Pod在资源竞争时获得一定比例的CPU时间。
    • Limit:设置cpu.cfs_quota_uscpu.cfs_period_us来定义CPU时间配额,限制Pod在指定周期内的CPU使用时间。
  • 内存限制

    • Request:设置memory.soft_limit_in_bytes来定义软限制,当系统内存充足时,Pod可以使用超过Request的内存。
    • Limit:设置memory.limit_in_bytes来定义硬限制,防止Pod使用超过Limit的内存。

38. Helm工作原理是什么?

Helm是Kubernetes的包管理工具,工作原理如下:

  1. Chart:Helm Chart是一个包含Kubernetes资源定义的包,描述了应用的所有组件及其配置。
  2. Repository:Helm Chart存储在仓库中,可以通过Helm命令行工具下载和安装。
  3. Release:Helm通过helm install命令将Chart部署到Kubernetes集群中,创建一个Release。
  4. Tiller(Helm 2):在Helm 2中,Tiller是集群内的服务,负责与API Server通信,创建和管理资源。Helm 3移除了Tiller,直接通过客户端与API Server通信。
  5. 模板引擎:Helm使用Go模板引擎处理Chart中的模板文件,生成具体的Kubernetes资源定义。

39. Helm Chart Rollback实现过程是什么?

Helm Chart的回滚过程如下:

  1. 获取历史版本:Helm记录每次Release的历史版本,使用helm history <release_name>命令查看。
  2. 选择版本:确定要回滚到的历史版本号。
  3. 执行回滚:使用helm rollback <release_name> <revision>命令执行回滚。
  4. 更新资源:Helm根据指定的历史版本重新生成Kubernetes资源定义,并更新集群中的资源。

40. Velero备份与恢复流程是什么?

Velero是Kubernetes的备份和恢复工具,其流程如下:

  • 备份流程

    1. 安装Velero:在集群中安装Velero。
    2. 配置存储:配置备份存储位置(如S3、GCS)。
    3. 创建备份:使用velero backup create <backup_name>命令创建备份,包含指定的命名空间、资源等。
    4. 存储备份:Velero将备份数据存储到配置的存储位置。
  • 恢复流程

    1. 列出备份:使用velero backup get命令查看可用备份。
    2. 创建恢复:使用velero restore create --from-backup <backup_name>命令创建恢复任务。
    3. 恢复资源:Velero从备份中恢复资源到集群中。

41. Docker网络模式

Docker提供以下几种网络模式:

  • Bridge:默认模式,Docker创建一个桥接网络,容器通过虚拟网卡连接到桥接网络。
  • Host:容器与宿主机共享网络命名空间,使用宿主机的网络接口。
  • None:容器没有网络接口,完全隔离。
  • Container:容器与另一个容器共享网络命名空间。
  • Overlay:用于Swarm模式,跨主机创建虚拟网络。
  • Macvlan:容器直接连接到宿主机的物理网络接口,具有独立的MAC地址。

42. Docker和Container区别

Docker是一个容器管理平台,而Container是Docker管理的单位:

  • Docker

    • 提供容器的创建、管理、编排、网络、存储等功能。
    • 包含Docker Engine、Docker CLI、Docker Compose等组件。
    • 支持镜像构建、分发和运行。
  • Container

    • 基于Linux容器技术(如cgroups、namespaces)实现的轻量级虚拟化单位。
    • 独立运行的进程,具有隔离的文件系统、网络、资源等。
    • 由Docker管理和运行。

43. 如何减小Dockerfile生成镜像体积?

减小Docker镜像体积的方法包括:

  • 使用多阶段构建:在Dockerfile中使用多阶段构建,只保留最终运行所需的文件。

    FROM golang:alpine AS builder
    WORKDIR /app
    COPY . .
    RUN go build -o myapp
    
    FROM alpine
    COPY --from=builder /app/myapp /myapp
    CMD ["/myapp"]
    
  • 选择基础镜像:选择体积小的基础镜像,如alpine

  • 清理临时文件:在构建过程中清理临时文件和缓存。

    RUN apt-get update && apt-get install -y \
        build-essential \
        && rm -rf /var/lib/apt/lists/*
    
  • 合并RUN指令:合并多个RUN指令,减少镜像层数。

    RUN apt-get update && apt-get install -y \
        curl \
        && rm -rf /var/lib/apt/lists/*
    
  • 使用.dockerignore文件:排除不必要的文件,减少镜像上下文大小。

44. K8s日志采集方案

Kubernetes日志采集方案包括:

  • Fluentd:通过DaemonSet部署Fluentd,收集节点上的容器日志,并转发到日志存储系统(如Elasticsearch、S3)。
  • Logstash:使用Logstash收集和处理日志数据,并存储到Elasticsearch等系统。
  • Filebeat:通过DaemonSet部署Filebeat,收集容器日志并发送到Logstash或Elasticsearch。
  • Promtail:与Loki配合使用,通过DaemonSet部署Promtail,收集容器日志并发送到Loki。
  • Kubernetes Events:收集Kubernetes事件日志,监控集群状态和故障。

45. Pause容器的用途

Pause容器的用途包括:

  • Pod基础容器:作为Pod中所有容器的基础容器,提供共享的网络命名空间。
  • 保持网络命名空间:Pause容器保持网络命名空间的生命周期,确保Pod中的其他容器可以重启而不影响网络配置。
  • 健康检查:Pause容器作为Pod的健康检查目标,确保Pod的整体健康状态。

46. K8s证书过期怎么更新

更新Kubernetes证书的步骤如下:

  1. 备份证书:备份现有的证书和配置文件。

  2. 生成新证书:使用kubeadmcfssl等工具生成新的证书。

    kubeadm alpha certs renew all
    
  3. 替换证书:将新的证书替换到相应的目录中(如/etc/kubernetes/pki)。

  4. 重启组件:重启使用新证书的Kubernetes组件(如API Server、Controller Manager、Scheduler)。

  5. 验证:验证新的证书是否生效,并确保集群正常运行。

47. K8S QoS等级

Kubernetes中的QoS(Quality of Service)等级包括:

  • Guaranteed:Pod中的所有容器都设置了相同的Request和Limit,确保资源分配。
  • Burstable:Pod中的容器设置了Request和Limit,但不是所有容器都设置相同的Request和Limit。
  • BestEffort:Pod中的容器没有设置Request和Limit,资源分配没有保证。

48. K8s节点维护注意事项

Kubernetes节点维护注意事项包括:

  • 驱逐Pod:在维护节点之前,使用kubectl drain命令驱逐节点上的Pod。

    kubectl drain <node_name> --ignore-daemonsets
    
  • 标记不可调度:使用kubectl cordon命令标记节点为不可调度状态。

    kubectl cordon <node_name>
    
  • 备份数据:备份节点上的重要数据和配置文件。

  • 更新软件:更新节点上的操作系统和Kubernetes组件。

  • 重新加入集群:维护完成后,使用kubectl uncordon命令重新加入节点到集群。

    kubectl uncordon <node_name>
    

49. Headless Service和ClusterIP区别

  • ClusterIP

    • 默认类型,分配一个虚拟IP地址,用于负载均衡和服务发现。
    • 通过虚拟IP地址访问服务,Kube-proxy负责流量转发。
  • Headless Service

    • 不分配虚拟IP地址,直接返回Pod的IP地址列表。
    • 通过DNS记录(A记录或SRV记录)访问服务,实现客户端负载均衡。

50. Linux容器技术的基础原理

Linux容器技术的基础原理包括:

  • cgroups(控制组):限制和隔离容器的资源使用(CPU、内存、网络等)。
  • namespaces:隔离容器的系统资源(进程、网络、文件系统、IPC等)。
  • UnionFS:联合文件系统,支持容器的分层文件系统(如AUFS、OverlayFS)。
  • 容器镜像:容器的文件系统和应用程序打包成镜像,通过镜像仓库分发和管理。

51. Kubernetes Pod的常见调度方式

Kubernetes Pod的常见调度方式包括:

  • 默认调度:Kubernetes调度器根据预选和优选规则选择节点。

  • 节点选择器:通过nodeSelector指定Pod运行的节点。

    spec:
      nodeSelector:
        disktype: ssd
    
  • 节点亲和性:通过nodeAffinity定义更复杂的节点选择规则。

    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: disktype
                operator: In
                values:
                - ssd
    
  • Pod亲和性和反亲和性:通过podAffinitypodAntiAffinity定义Pod之间的调度规则。

    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - myapp
            topologyKey: "kubernetes.io/hostname"
    
  • 污点和容忍度:通过taintstolerations控制Pod是否可以调度到带有污点的节点。

    spec:
      tolerations:
      - key: "key1"
        operator: "Equal"
        value: "value1"
        effect: "NoSchedule"
    

52. Kubernetes Ingress原理

Kubernetes Ingress的工作原理如下:

  1. 定义Ingress资源:用户定义Ingress资源,描述HTTP和HTTPS路由规则。
  2. Ingress Controller:集群中部署Ingress Controller(如NGINX、Traefik),监控Ingress资源的变化。
  3. 配置负载均衡器:Ingress Controller根据Ingress资源配置负载均衡器,创建相应的路由规则。
  4. 流量转发:Ingress Controller接收外部流量,并根据路由规则将流量转发到对应的Service。

53. Kubernetes各模块如何与API Server通信

Kubernetes各模块通过以下方式与API Server通信:

  • kubelet:节点上的kubelet通过API Server注册节点信息、获取Pod定义、报告节点状态等。
  • kube-proxy:通过API Server获取Service和Endpoints信息,配置网络规则。
  • Controller Manager:通过API Server监控资源状态,执行控制逻辑(如ReplicaSet、Deployment等)。
  • Scheduler:通过API Server获取未绑定节点的Pod信息,执行调度决策。
  • kubectl:客户端工具通过API Server与集群进行交互,执行管理操作。

54. kubelet监控worker节点如何实现

kubelet通过以下方式监控worker节点:

  • 节点状态:定期向API Server报告节点的状态(如CPU、内存、磁盘、网络等)。
  • Pod状态:监控节点上运行的Pod和容器的状态,报告给API Server。
  • 健康检查:执行节点和Pod的健康检查,确保正常运行。
  • 资源管理:管理节点上的资源分配和使用,确保Pod的资源需求得到满足。

55. 容器时区不一致如何解决?

解决容器时区不一致的方法包括:

  • 设置容器时区:在容器启动时设置时区环境变量。

    docker run -e TZ=Asia/Shanghai myimage
    
  • 挂载宿主机时区文件:将宿主机的时区文件挂载到容器中。

    docker run -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro myimage
    
  • 修改Dockerfile:在Dockerfile中设置时区。

    FROM ubuntu
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
    

这些方法可以确保容器与宿主机或指定的时区保持一致。

56.容器和虚拟机的区别

容器和虚拟机是两种不同的虚拟化技术,主要区别如下:

  • 架构

    • 虚拟机:虚拟机运行在Hypervisor(虚拟机监控器)上,每个虚拟机包含自己的操作系统内核、库和应用程序。虚拟机提供完整的硬件虚拟化。
    • 容器:容器共享宿主机操作系统内核,通过操作系统级虚拟化运行。每个容器包含应用程序及其依赖的库,但不包含操作系统内核。
  • 资源开销

    • 虚拟机:由于每个虚拟机运行独立的操作系统内核,资源开销较大(CPU、内存、存储等)。
    • 容器:容器共享宿主机内核,资源开销较小,启动速度快。
  • 启动时间

    • 虚拟机:启动时间较长,需要引导操作系统。
    • 容器:启动时间较短,通常在几秒钟内即可启动。
  • 隔离性

    • 虚拟机:提供更强的隔离性,因为每个虚拟机运行独立的操作系统。
    • 容器:隔离性较弱,因为容器共享宿主机内核,但通过cgroups和namespaces实现资源隔离。
  • 适用场景

    • 虚拟机:适用于需要强隔离性、安全性和运行不同操作系统的场景。
    • 容器:适用于微服务架构、快速部署和高密度计算的场景。

57.K8S为何弃用Docker使用containerd

Kubernetes弃用Docker,转而使用containerd,主要原因如下:

  1. 简化架构:Docker包含多个组件(如Docker Engine、Docker CLI、Docker Daemon等),而containerd是一个轻量级的容器运行时,专注于核心功能,简化了架构。

  2. 标准化:containerd是CNCF(Cloud Native Computing Foundation)项目,符合OCI(Open Container Initiative)标准,Kubernetes通过CRI(Container Runtime Interface)与containerd集成,标准化了容器运行时接口。

  3. 性能优化:containerd更轻量级,启动速度快,占用资源少,有助于提高集群性能和资源利用率。

  4. 减少依赖:Kubernetes与Docker的集成需要通过dockershim(一个适配层),增加了复杂性。使用containerd可以直接通过CRI接口与Kubernetes集成,减少了依赖和维护负担。

  5. 社区支持:containerd由多个云原生社区和公司支持,获得了广泛的社区支持和贡献,有助于持续改进和发展。

58.K8s的备份迁移怎么实现

Kubernetes的备份和迁移可以通过以下步骤实现:

备份

  1. 备份Etcd数据:Etcd是Kubernetes的分布式键值存储,保存了集群的所有状态数据。

    ETCDCTL_API=3 etcdctl snapshot save /path/to/backup.db --endpoints=<etcd-endpoint> --cacert=<ca-file> --cert=<cert-file> --key=<key-file>
    
  2. 备份Kubernetes资源:使用kubectl命令导出Kubernetes资源定义。

    kubectl get all --all-namespaces -o yaml > all-resources.yaml
    
  3. 备份持久化存储:备份使用的持久化存储卷(如PVC、PV),确保数据完整。

  4. 使用备份工具:使用专门的备份工具(如Velero)进行备份。

    velero backup create <backup-name> --include-namespaces <namespace>
    

迁移

  1. 恢复Etcd数据:在目标集群中恢复Etcd快照。

    ETCDCTL_API=3 etcdctl snapshot restore /path/to/backup.db --data-dir=/path/to/etcd-data
    
  2. 恢复Kubernetes资源:使用kubectl命令导入资源定义。

    kubectl apply -f all-resources.yaml
    
  3. 恢复持久化存储:在目标集群中创建并恢复持久化存储卷。

  4. 使用恢复工具:使用备份工具(如Velero)进行恢复。

    velero restore create --from-backup <backup-name>
    
  5. 验证恢复:验证恢复后的资源和数据是否正常运行,确保迁移成功。

Linux 常见面试题

1. grepsedawkcut的组合使用

这些命令是Linux文本处理的强大工具,组合使用可以实现复杂的数据处理任务。

示例:

假设有一个文件 data.txt,内容如下:

1,John,Doe,25,Engineer
2,Jane,Smith,30,Doctor
3,Emily,Jones,22,Designer

需求:提取姓氏为Doe的人的名字和职业。

# 使用grep查找姓氏为Doe的行
grep 'Doe' data.txt | 

# 使用cut提取名字和职业(假设字段用逗号分隔)
cut -d ',' -f 2,5

组合使用示例

grep 'Doe' data.txt | cut -d ',' -f 2,5

输出:

John,Engineer

2. HTTP错误码和原因

  • 1xx:信息响应
    • 100 Continue:继续发送请求的剩余部分。
  • 2xx:成功
    • 200 OK:请求成功。
  • 3xx:重定向
    • 301 Moved Permanently:资源已永久移动到新位置。
  • 4xx:客户端错误
    • 404 Not Found:请求的资源不存在。
  • 5xx:服务器错误
    • 500 Internal Server Error:服务器内部错误。

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

  • 长连接:TCP连接建立后,保持连接状态,适用于频繁通信,如数据库连接。
  • 短连接:每次请求都建立一次新的连接,适用于不频繁通信,如HTTP请求。
  • WebSocket:在单个TCP连接上进行全双工通信,适用于实时应用,如聊天、游戏。

4. Nginx性能优化方式

  • 使用缓存:启用缓存以减少后端服务器负载。
  • 负载均衡:均衡请求到多个后端服务器。
  • 压缩传输:启用Gzip压缩减少传输数据量。
  • 连接复用:使用keep-alive保持长连接。
  • 优化配置:调整worker_processes和worker_connections参数。

5. LVS、Nginx、HAProxy区别和使用场景

  • LVS(Linux Virtual Server):基于IP层的四层负载均衡,适用于高性能、低延迟场景。
  • Nginx:基于应用层的七层负载均衡,适用于需要处理HTTP/HTTPS请求的场景。
  • HAProxy:支持四层和七层负载均衡,性能高,适用于需要复杂负载均衡策略的场景。

6. 僵尸进程是什么

僵尸进程是已经终止但其父进程尚未调用wait()waitpid()获取其终止状态的进程。它占用进程表项,但不占用系统资源。

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

  • 进程:独立的内存空间,进程间通信开销大。
  • 线程:共享进程的内存空间,线程间通信开销小。
  • 协程:用户态的轻量级线程,切换开销小,适用于高并发场景。

8. 什么是Nginx的异步非阻塞

Nginx使用异步非阻塞I/O模型,通过事件驱动机制处理大量并发连接,避免阻塞,提高性能。

9. Linux网络丢包怎么排查

  • 检查网络接口:使用ifconfigip a查看网络接口状态。
  • 使用ping:检测网络连通性。
    ping -c 10 <destination>
    
  • 使用traceroute:跟踪数据包路径。
    traceroute <destination>
    
  • 使用tcpdump:捕获和分析网络流量。
    tcpdump -i <interface> -w capture.pcap
    
  • 检查防火墙规则:查看和调整防火墙规则。

10. 性能分析诊断

  • CPU使用情况:使用tophtop查看CPU使用情况。
  • 内存使用情况:使用free -m查看内存使用情况。
  • 磁盘I/O:使用iostat查看磁盘I/O。
  • 网络性能:使用iftopnload查看网络带宽使用情况。
  • 应用性能:使用straceperf分析应用性能。

11. 什么是进程中断

进程中断是指在进程执行过程中,由于硬件或软件事件(如系统调用、外部设备请求)导致CPU暂时停止当前进程的执行,转而处理中断事件。处理完中断后,CPU会恢复进程的执行。中断机制是现代操作系统实现多任务处理和实时响应的重要手段。

12. 什么是软中断、硬中断

  • 硬中断:由硬件设备(如键盘、网卡等)触发的中断,立即响应,通常用于处理紧急任务。硬中断处理程序运行在中断上下文中,不能被其他中断打断。
  • 软中断:由软件触发的中断,用于延迟处理一些不紧急的任务。软中断通常在硬中断处理完成后,由内核根据优先级调度执行。

13. 什么是不可中断进程

不可中断进程(通常状态为D)是指由于等待某些资源(如I/O操作)而无法被中断的进程。此类进程通常在等待硬件设备响应时进入不可中断状态,以避免数据损坏或不一致。

14. 什么是栈内存和堆内存

  • 栈内存:用于存储函数调用的局部变量、参数和返回地址。栈内存由操作系统自动管理,分配和释放速度快,但空间有限。
  • 堆内存:用于动态分配内存,程序员通过mallocfree(C语言)或newdelete(C++)等函数手动管理。堆内存空间较大,但分配和释放速度较慢。

15. top命令里面可以看到进程哪些状态

top命令可以显示以下进程状态:

  • R(Running):运行中
  • S(Sleeping):睡眠中
  • D(Uninterruptible Sleep):不可中断睡眠
  • Z(Zombie):僵尸进程
  • T(Stopped):停止
  • I(Idle):空闲

16. Linux系统中/proc是做什么的

/proc是一个虚拟文件系统,提供系统信息和进程信息。它包含内核数据结构的实时视图,允许用户和应用程序读取系统和进程状态。常见的子目录和文件有:

  • /proc/cpuinfo:CPU信息
  • /proc/meminfo:内存信息
  • /proc/<pid>:特定进程信息

17. Load和CPU使用率区别

  • Load:表示系统的平均负载,通常以1分钟、5分钟和15分钟的平均值显示。它表示正在等待CPU处理的任务数量,包括正在运行和等待I/O的任务。
  • CPU使用率:表示CPU的使用情况,通常以百分比显示。它表示CPU在特定时间段内用于用户进程、系统进程和空闲的时间比例。

18. MAC地址和IP地址如何转换

MAC地址和IP地址之间的转换通常通过ARP(Address Resolution Protocol)和RARP(Reverse ARP)实现。

  • ARP:用于将IP地址转换为MAC地址。执行arp -a命令可以查看ARP缓存。
  • RARP:用于将MAC地址转换为IP地址,但RARP已被DHCP等协议取代。

19. 常见的RAID有哪些,使用场景是什么

  • RAID 0:条带化,无冗余,提高性能。适用于对性能要求高但不需要数据冗余的场景。
  • RAID 1:镜像,数据冗余,提高可靠性。适用于需要高数据安全性的场景。
  • RAID 5:条带化和奇偶校验,提供冗余和性能。适用于需要平衡性能和数据安全的场景。
  • RAID 6:双重奇偶校验,提供更高冗余。适用于需要更高数据安全性的场景。
  • RAID 10:条带化和镜像的结合,提供高性能和冗余。适用于需要高性能和高数据安全性的场景。

20. LVM有哪些概念

  • Physical Volume (PV):物理卷,物理存储设备(如硬盘、分区)。
  • Volume Group (VG):卷组,由一个或多个PV组成,提供存储池。
  • Logical Volume (LV):逻辑卷,从VG中分配的存储空间,可以创建文件系统。
  • Physical Extent (PE):物理扩展,PV中的最小分配单元。
  • Logical Extent (LE):逻辑扩展,LV中的最小分配单元。

21. JVM内存如何查看

可以使用以下工具和命令查看JVM内存:

  • jstat:监控JVM内存使用情况。
    jstat -gc <pid>
    
  • jmap:生成堆转储,查看详细内存分配。
    jmap -heap <pid>
    
  • jconsole:图形化工具,监控JVM内存和性能。
  • VisualVM:综合监控和分析工具,查看JVM内存使用情况。

22. 如何管理和优化内核参数

可以通过修改/etc/sysctl.conf文件或使用sysctl命令管理和优化内核参数。

  • 查看当前内核参数
    sysctl -a
    
  • 临时修改内核参数
    sysctl -w net.ipv4.ip_forward=1
    
  • 永久修改内核参数:编辑/etc/sysctl.conf文件,添加或修改参数,然后重新加载。
    echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
    sysctl -p
    
  • 常见优化参数
    • vm.swappiness:控制交换分区的使用。
    • fs.file-max:系统允许打开的最大文件数。
    • net.core.somaxconn:监听队列的最大长度。

23. 什么是进程最大数、最大线程数、进程打开的文件数,怎么调整

  • 进程最大数:系统允许的最大进程数。可以通过/proc/sys/kernel/pid_max查看和调整。

    cat /proc/sys/kernel/pid_max
    echo 4194304 > /proc/sys/kernel/pid_max
    

    或编辑/etc/sysctl.conf文件:

    echo "kernel.pid_max = 4194304" >> /etc/sysctl.conf
    sysctl -p
    
  • 最大线程数:受限于进程最大数和系统资源。可以通过ulimit命令设置用户级别的最大线程数。

    ulimit -u 16384  # 设置最大线程数为16384
    
  • 进程打开的文件数:可以通过ulimit命令查看和调整。

    ulimit -n 4096  # 设置进程最大打开文件数为4096
    

    或编辑/etc/security/limits.conf文件:

    * soft nofile 4096
    * hard nofile 8192
    

24. dudf统计不一致原因

  • du:统计文件和目录实际使用的磁盘空间。
  • df:统计文件系统的整体使用情况。

差异可能原因:

  • 删除文件但仍被进程占用。
  • 磁盘配额限制。
  • 文件系统损坏或不一致。
  • 磁盘保留空间(如ext4文件系统保留5%给root用户)。

25. bufferscached的区别

  • Buffers:用于缓冲区缓存,主要用于块设备I/O操作。
  • Cached:用于页面缓存,主要用于文件系统读取操作。

查看方法:

free -m

26. lsof命令使用场景

lsof(List Open Files)用于列出系统中打开的文件。常见使用场景:

  • 查看某进程打开的文件:
    lsof -p <pid>
    
  • 查看某文件被哪些进程打开:
    lsof <filename>
    
  • 查看某端口占用情况:
    lsof -i :80
    

27. Linux中的进程间通信的方式及其使用场景

  • 管道(Pipe):父子进程间的通信。
  • 命名管道(FIFO):无亲缘关系进程间通信。
  • 信号(Signal):简单的进程间通知机制。
  • 消息队列(Message Queue):消息传递,适用于复杂通信。
  • 共享内存(Shared Memory):高效的数据共享。
  • 信号量(Semaphore):同步和互斥控制。
  • 套接字(Socket):网络通信和本地进程间通信。

28. Linux中的进程优先级与设置方法

  • 优先级范围:-20(最高优先级)到19(最低优先级)。
  • 查看优先级
    ps -eo pid,ni,comm
    
  • 设置优先级
    • 启动新进程:
      nice -n -10 <command>
      
    • 修改运行中进程:
      renice -n -10 -p <pid>
      

29. 什么是内存分页和分段

  • 分页(Paging):将内存分为固定大小的页,简化内存管理,减少碎片。
  • 分段(Segmentation):将内存分为不同大小的段,按逻辑分割内存,支持更灵活的内存管理。

30. 如何创建和管理自定义systemd服务

  • 创建服务文件:在/etc/systemd/system/目录下创建一个.service文件。

    [Unit]
    Description=My Custom Service
    After=network.target
    
    [Service]
    ExecStart=/usr/bin/my-custom-service
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    
  • 启动服务

    systemctl start my-custom-service.service
    
  • 启用开机自启动

    systemctl enable my-custom-service.service
    
  • 查看服务状态

    systemctl status my-custom-service.service
    

31. Linux内核模块的加载与卸载过程

  • 加载模块

    modprobe <module_name>
    

    insmod <module_file.ko>
    
  • 卸载模块

    modprobe -r <module_name>
    

    rmmod <module_name>
    

32. Ansible playbook使用场景,现在有多台机器需要批量加入集群,怎么实现

Ansible是一种自动化工具,用于配置管理和应用程序部署。

  • 创建Inventory文件

    [webservers]
    server1.example.com
    server2.example.com
    
  • 编写Playbook

    - name: Add servers to cluster
      hosts: webservers
      become: yes
      tasks:
        - name: Install necessary packages
          apt:
            name: "{{ item }}"
            state: present
          loop:
            - package1
            - package2
    
        - name: Configure cluster membership
          template:
            src: /path/to/cluster_config.j2
            dest: /etc/cluster/config
    
        - name: Restart cluster service
          service:
            name: cluster_service
            state: restarted
    
  • 运行Playbook

    ansible-playbook -i inventory_file playbook.yml
    

希望对你有所帮助。最终预祝面试顺利,万事大吉!