1、ECS夯住了 排查方法和解决方案

当ECS实例出现“夯住”(hang)的情况,即系统无响应或响应极慢时,需要从操作系统内核、资源使用、存储I/O、网络等多个层面进行排查。

排查方法:

  • 系统层面:
    • 检查系统负载:使用 topuptime 命令查看 load average。如果1分钟、5分钟、15分钟的平均负载远高于CPU核心数,说明系统过载 。
    • 检查CPU使用率:在 top 命令中,观察 %us(用户空间)、%sy(内核空间)、%wa(等待I/O)的占比。如果 %wa 过高,说明存在I/O瓶颈;如果 %sy 过高,可能是内核态进程占用过多资源。
    • 检查内存使用:使用 free -h 命令。关注 available 列,如果可用内存极少,系统可能在进行频繁的内存交换(swap),这会导致性能急剧下降。
    • 检查磁盘I/O:使用 iostat -x 1 命令。关注 %util(设备利用率)和 await(平均I/O等待时间)。如果 %util 持续接近100%且 await 很高,说明磁盘是瓶颈。
    • 检查网络连接:使用 netstat -antp | grep ESTABLISHED | wc -l 查看连接数,或使用 ss -s 查看统计。连接数过多或存在大量 TIME_WAIT 连接可能导致端口耗尽或资源占用过高。
  • 进程层面:
    • 定位问题进程:使用 topps aux --sort=-%cpu / ps aux --sort=-%mem 找出消耗CPU或内存最高的进程。
    • 分析进程状态:使用 ps aux | grep <PID> 查看进程状态(STAT列)。D 状态(不可中断睡眠)通常意味着进程在等待I/O,可能是磁盘或网络问题。
  • 日志层面:
    • 检查系统日志dmesg -T | tail -50 查看最新的内核日志,寻找OOM(内存溢出)、硬件错误、文件系统错误等信息。
    • 检查应用日志:定位到具体应用后,检查其日志文件,如 /var/log/messages/var/log/syslog 或应用自身的日志目录。

解决方案:

  • 临时恢复:
    • 终止问题进程:如果找到导致夯住的进程,尝试使用 kill -9 <PID> 强制终止。
    • 重启服务:重启占用资源过高的服务。
    • 重启实例:如果无法定位或终止进程,可通过阿里云控制台或API重启ECS实例,这是最直接但非根治的方法。
  • 根本解决:
    • 资源扩容:如果长期负载过高,应考虑升级ECS实例规格(增加vCPU和内存)。
    • 优化应用:分析并优化高资源消耗的应用代码或配置。
    • 存储优化:如果I/O是瓶颈,考虑升级云盘类型(如从高效云盘升级为SSD云盘)或使用性能更好的存储方案。
    • 内核参数调优:根据业务类型,调整如 net.ipv4.tcp_max_tw_buckets(TIME_WAIT连接数)、vm.swappiness(交换倾向)等内核参数。

2、pod的亲和性和反亲和性在k8s中的实际应用

Pod的亲和性(Affinity)与反亲和性(Anti-affinity)是Kubernetes调度的高级规则,用于控制Pod被调度到哪些节点上,或与其他Pod的部署关系。

核心概念:

  • 节点亲和性(Node Affinity):基于节点标签(如 zone, instance-type, gpu)来吸引Pod调度到特定节点。
  • Pod亲和性(Pod Affinity):基于已运行Pod的标签,吸引Pod调度到与这些Pod“在一起”的节点上。
  • Pod反亲和性(Pod Anti-affinity):基于已运行Pod的标签,排斥Pod调度到与这些Pod“在一起”的节点上。

实际应用场景:

场景类型 目的 配置示例(YAML片段)
高可用部署 将同一服务的多个Pod实例分散到不同的故障域(如节点、可用区),避免单点故障。 使用 Pod反亲和性,要求同一服务的Pod不要调度到同一节点。
亲密性部署 使需要频繁通信或共享本地存储的Pod(如Web服务器与缓存)部署在同一节点,降低网络延迟。 使用 Pod亲和性,基于对方Pod的标签进行调度。
硬件专享 将需要GPU或特定CPU型号的应用调度到拥有相应硬件的节点。 使用 节点亲和性,匹配节点的 node-type: gpu 等标签。
租户/环境隔离 将生产环境和测试环境的Pod强制调度到不同的节点集。 使用 节点亲和性节点选择器(nodeSelector) 结合。
避免资源竞争 避免多个高计算或高I/O的Pod挤在同一节点,导致相互干扰。 使用 Pod反亲和性,基于资源类型标签进行排斥。

示例YAML(Pod反亲和性实现高可用):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-web
  template:
    metadata:
      labels:
        app: my-web
    spec:
      affinity:
        podAntiAffinity: #  使用Pod反亲和性确保Pod分散
          requiredDuringSchedulingIgnoredDuringExecution: # 硬性要求
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - my-web
            topologyKey: kubernetes.io/hostname # 拓扑域为节点主机名,即不能在同一节点
      containers:
      - name: web
        image: nginx:latest

注释:此配置确保标签为 app: my-web 的Pod不会被调度到同一个节点(topologyKey: kubernetes.io/hostname)上,从而实现实例级别的高可用 。

3、用户从互联网访问k8s应用后端流量走向

用户从互联网访问一个典型的、通过Ingress暴露的Kubernetes应用,其流量走向是一个清晰的链式过程。下图清晰地展示了这一完整路径:

flowchart TD A[互联网用户] --> B[云服务商<br>负载均衡器 SLB] B --> C[Ingress Controller Pod<br>(例如 nginx-ingress)] C --> D[Kubernetes Ingress 资源<br>(定义路由规则)] D --> E[Service<br>(ClusterIP类型)] E --> F[后端 Pod 1] E --> G[后端 Pod 2] E --> H[后端 Pod ...]

各环节详解:

  1. 负载均衡器 (SLB/ALB/NLB)

    • 用户通过域名发起请求,DNS解析到云服务商提供的负载均衡器(在阿里云可能是SLB)的公网IP。
    • 负载均衡器是流量的入口,负责接收所有外部HTTP/HTTPS流量。
  2. Ingress Controller

    • 负载均衡器根据预先配置的监听规则(通常指向Kubernetes集群中所有或部分Node节点的某个NodePort),将流量转发到运行在集群内的 Ingress Controller Pod(如Nginx Ingress Controller、ALB Ingress Controller)。
    • Ingress Controller 是一个常驻的Pod,它监听Kubernetes API,动态感知Ingress资源的变化。
  3. Ingress 资源

    • Ingress Controller 读取用户定义的 Ingress 资源(一个K8s API对象)。该资源定义了具体的路由规则,例如将 www.example.com 的流量路由到后端名为 my-service 的Service 。
    • Ingress Controller 根据这些规则,动态更新自己的负载均衡配置(如Nginx的 nginx.conf)。
  4. Service

    • Ingress Controller 根据路由规则,将流量转发到对应的 Service(通常是ClusterIP类型)。Service是Kubernetes内部的服务发现和负载均衡抽象,它通过 selector 选择一组具有特定标签的Pod 。
    • Service 有一个虚拟IP(ClusterIP),在集群内可达。但Ingress Controller通常直接通过Service的名称进行解析和转发。
  5. Pod

    • Service 通过 kube-proxy 组件维护的iptables或IPVS规则,将到达ClusterIP的流量负载均衡到后端一个健康的Pod(Endpoint)上 。
    • 最终,请求到达目标业务Pod,由Pod内的容器处理请求并返回响应,响应沿原路返回给用户。

关键点:

  • 会话保持:若需要会话保持(Session Affinity),可以在Ingress注解(如 nginx.ingress.kubernetes.io/affinity: "cookie")或Service的 spec.sessionAffinity: ClientIP 字段进行配置,确保同一用户请求落到同一后端Pod 。
  • 网络模型:整个过程中,流量穿越了集群网络(如Flannel、Calico等CNI插件提供的Overlay或Underlay网络),确保了Pod间跨节点通信的透明性 。

4、物理机装系统的方法 黑屏操作步骤

这里以使用U盘安装CentOS 7为例,描述在物理服务器“黑屏”(命令行界面)下的主要操作步骤。

前期准备:

  1. 下载CentOS 7 ISO镜像文件。
  2. 使用工具(如 dd 命令或Rufus)将ISO镜像写入U盘,制作可启动安装介质。
  3. 将U盘插入服务器,接通服务器电源和显示器。

黑屏安装步骤:

  1. 进入BIOS/UEFI设置:开机后,根据提示按特定键(如F2、F10、DEL、ESC)进入BIOS/UEFI设置界面。
  2. 修改启动顺序
    • 在“Boot”或“启动”菜单中,将 “USB HDD” 或你的U盘设备调整到启动顺序的第一位。
    • 保存设置并退出(通常按F10),服务器将重启并从U盘启动。
  3. 启动安装程序
    • 重启后,会进入CentOS安装引导界面。通常直接按 Enter 键开始图形化或文本安装。如果屏幕无显示,可以尝试在引导界面输入 linux text 后回车,进入文本安装模式。
  4. 选择安装语言和键盘:使用键盘方向键选择语言(如中文)和键盘布局(如美国英语式),然后按 Tab 键切换到“继续”,回车。
  5. 配置安装源:在“安装位置”界面,选择要安装操作系统的磁盘。这是关键步骤,需谨慎选择以免误删数据。
    • 选择“我要配置分区”,点击“完成”进入手动分区。
    • 常见分区方案(以200G磁盘为例):
      • /boot:1G (标准分区, ext4)
      • swap:物理内存的1-2倍,例如16G (标准分区, swap)
      • /:剩余所有空间 (LVM, xfs)
    • 创建分区后,点击“完成”并接受更改。
  6. 开始安装:分区完成后,返回主界面,点击“开始安装”。
  7. 设置root密码和创建用户
    • 在安装过程中,设置 root用户的密码
    • 可以同时创建一个普通用户,并可选地将其设为管理员。
  8. 等待安装完成:安装进程会自动进行。完成后,提示“重启”。
  9. 首次启动配置:重启后,拔出U盘。系统首次启动会进行一些初始化设置,同意许可协议,完成即可进入登录界面。使用第7步设置的用户名密码登录。

5、raid 阵列的几种方法 以及对应的原理效果

RAID(独立磁盘冗余阵列)通过将多个物理磁盘组合起来,实现性能提升、容量增大或数据冗余。

常见RAID级别对比:

RAID级别 最少磁盘数 原理简述 优点 缺点 适用场景
RAID 0 2 条带化。数据被分割成块,交替写入多个磁盘。 读写性能最高,容量利用率100%(总容量为各磁盘之和)。 无冗余,任何一块磁盘损坏将导致所有数据丢失。 对性能要求极高、数据可临时或可再生的场景,如视频编辑缓存、科学计算临时存储。
RAID 1 2 镜像。相同的数据同时写入两块磁盘。 数据安全性高,读性能有提升。允许损坏任意一块磁盘。 容量利用率低(仅50%),写性能无提升。成本高。 对数据安全性要求极高、容量需求不大的场景,如操作系统盘、数据库日志文件。
RAID 5 3 条带化+分布式奇偶校验。数据与校验信息(Parity)交替存储在所有磁盘上。 兼顾性能、容量和安全性。读性能好,允许损坏任意一块磁盘。容量利用率为 (N-1)/N。 写性能较差(需计算校验位)。重建阵列时对剩余磁盘压力大。 适用于读多写少、对成本和性能有平衡要求的场景,如文件服务器、中小型数据库。
RAID 6 4 条带化+双分布式奇偶校验。类似RAID 5,但有两份独立的校验信息。 允许同时损坏两块磁盘,数据安全性更高。 写性能比RAID 5更差,容量利用率更低 (N-2)/N。成本更高。 对数据安全性要求极高、允许较大容量损失的场景,如关键业务归档、大型存储阵列。
RAID 10 (1+0) 4 先镜像,后条带。先将磁盘两两组成RAID 1镜像对,再将多个镜像对组成RAID 0条带。 兼具高读写性能和高可靠性。读性能优秀,写性能良好。允许每个镜像对中坏一块磁盘。 成本最高,容量利用率仅为50%。 对性能和可靠性要求都极高的核心业务,如数据库、虚拟化平台、高交易网站。

原理与效果补充:

  • 校验位(Parity):RAID 5/6 中用于数据恢复的冗余信息。当一块磁盘失效时,可以通过剩余磁盘上的数据和校验位计算出丢失的数据。
  • 重建(Rebuild):冗余阵列中某块磁盘故障更换后,系统利用冗余数据在新盘上恢复数据的过程。期间阵列性能下降,且存在另一块磁盘也故障的风险(尤其是RAID 5)。
  • 热备盘(Hot Spare):预先安装在阵列中但不使用的磁盘。当阵列中某块磁盘故障时,控制器会自动使用热备盘进行重建,缩短系统脆弱期。

参考来源

 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐