EKS 故障排查和诊断

常见问题分类

问题类型概览

EKS 故障分类:

1. 集群访问问题
   ├─ kubectl 无法连接集群
   ├─ API Server 不可达
   ├─ 认证/授权失败
   └─ 网络连接问题

2. 节点问题
   ├─ 节点未加入集群
   ├─ 节点 NotReady 状态
   ├─ 节点资源耗尽
   └─ 节点网络问题

3. Pod 调度问题
   ├─ Pod Pending 状态
   ├─ Pod 无法调度
   ├─ 资源不足
   └─ 污点和容忍度问题

4. Pod 运行问题
   ├─ Pod CrashLoopBackOff
   ├─ Pod ImagePullBackOff
   ├─ Pod OOMKilled
   └─ 容器启动失败

5. 网络问题
   ├─ Pod 间无法通信
   ├─ Pod 无法访问外网
   ├─ Service 无法访问
   └─ Ingress 不工作

6. 存储问题
   ├─ PVC Pending 状态
   ├─ 卷挂载失败
   ├─ 存储性能问题
   └─ 数据持久化问题

7. 权限问题
   ├─ RBAC 权限不足
   ├─ IRSA 配置错误
   ├─ Service Account 问题
   └─ IAM 角色问题

集群访问问题

kubectl 无法连接集群

症状:

$ kubectl get nodes
Unable to connect to the server: dial tcp: lookup xxx.eks.amazonaws.com: no such host

诊断步骤:

#!/bin/bash
# diagnose-cluster-access.sh

echo "================================================"
echo "诊断 EKS 集群访问问题"
echo "================================================"

# 1. 检查 kubeconfig
echo "1. 检查 kubeconfig 配置..."
kubectl config current-context
kubectl config view

# 2. 检查 AWS 凭证
echo ""
echo "2. 检查 AWS 凭证..."
aws sts get-caller-identity

# 3. 检查集群状态
echo ""
echo "3. 检查集群状态..."
CLUSTER_NAME="production-eks-cluster"
REGION="us-east-1"

aws eks describe-cluster \
  --name $CLUSTER_NAME \
  --region $REGION \
  --query 'cluster.status' \
  --output text

# 4. 检查 API Server 端点
echo ""
echo "4. 检查 API Server 端点..."
ENDPOINT=$(aws eks describe-cluster \
  --name $CLUSTER_NAME \
  --region $REGION \
  --query 'cluster.endpoint' \
  --output text)

echo "   端点: $ENDPOINT"

# 测试端点连通性
curl -k $ENDPOINT/version

# 5. 检查端点访问配置
echo ""
echo "5. 检查端点访问配置..."
aws eks describe-cluster \
  --name $CLUSTER_NAME \
  --region $REGION \
  --query 'cluster.resourcesVpcConfig.{PublicAccess:endpointPublicAccess,PrivateAccess:endpointPrivateAccess,PublicCIDRs:publicAccessCidrs}'

echo ""
echo "================================================"
echo "诊断完成"
echo "================================================"

常见解决方案:

# 方案 1:更新 kubeconfig
aws eks update-kubeconfig \
  --name production-eks-cluster \
  --region us-east-1

# 方案 2:检查公网访问限制
# 如果你的 IP 不在白名单中
aws eks update-cluster-config \
  --name production-eks-cluster \
  --resources-vpc-config \
    endpointPublicAccess=true,\
    publicAccessCidrs="YOUR_IP/32" \
  --region us-east-1

# 方案 3:使用 VPN 或 Bastion
# 如果仅启用了私有端点
ssh -L 8443:API_ENDPOINT:443 bastion-host
# 然后修改 kubeconfig 使用 localhost:8443

# 方案 4:检查 IAM 权限
# 确保 IAM 用户/角色有访问 EKS 的权限
aws iam list-attached-user-policies --user-name YOUR_USER

认证失败问题

症状:

$ kubectl get nodes
error: You must be logged in to the server (Unauthorized)

诊断和解决:

#!/bin/bash
# fix-authentication.sh

echo "================================================"
echo "修复 EKS 认证问题"
echo "================================================"

# 1. 检查 aws-auth ConfigMap
echo "1. 检查 aws-auth ConfigMap..."
kubectl get configmap aws-auth -n kube-system -o yaml

# 2. 如果 ConfigMap 不存在或配置错误,重新创建
echo ""
echo "2. 更新 aws-auth ConfigMap..."

ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
NODE_ROLE_ARN="arn:aws:iam::${ACCOUNT_ID}:role/eks-node-role"

cat > aws-auth-configmap.yaml << EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  mapRoles: |
    - rolearn: $NODE_ROLE_ARN
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes
  mapUsers: |
    - userarn: arn:aws:iam::${ACCOUNT_ID}:user/admin
      username: admin
      groups:
        - system:masters
EOF

kubectl apply -f aws-auth-configmap.yaml
rm -f aws-auth-configmap.yaml

echo ""
echo "================================================"
echo "aws-auth ConfigMap 已更新"
echo "================================================"

节点问题

节点未加入集群

症状:

$ kubectl get nodes
No resources found

诊断步骤:

#!/bin/bash
# diagnose-node-join.sh

echo "================================================"
echo "诊断节点加入问题"
echo "================================================"

# 1. 检查节点组状态
echo "1. 检查节点组状态..."
aws eks describe-nodegroup \
  --cluster-name production-eks-cluster \
  --nodegroup-name general-nodes \
  --region us-east-1 \
  --query 'nodegroup.{Status:status,Health:health}'

# 2. 检查 Auto Scaling Group
echo ""
echo "2. 检查 Auto Scaling Group..."
ASG_NAME=$(aws eks describe-nodegroup \
  --cluster-name production-eks-cluster \
  --nodegroup-name general-nodes \
  --region us-east-1 \
  --query 'nodegroup.resources.autoScalingGroups[0].name' \
  --output text)

aws autoscaling describe-auto-scaling-groups \
  --auto-scaling-group-names $ASG_NAME \
  --region us-east-1 \
  --query 'AutoScalingGroups[0].{DesiredCapacity:DesiredCapacity,MinSize:MinSize,MaxSize:MaxSize,Instances:Instances[*].InstanceId}'

# 3. 检查 EC2 实例状态
echo ""
echo "3. 检查 EC2 实例状态..."
INSTANCE_IDS=$(aws autoscaling describe-auto-scaling-groups \
  --auto-scaling-group-names $ASG_NAME \
  --region us-east-1 \
  --query 'AutoScalingGroups[0].Instances[*].InstanceId' \
  --output text)

for instance in $INSTANCE_IDS; do
  echo "   实例 $instance:"
  aws ec2 describe-instances \
    --instance-ids $instance \
    --region us-east-1 \
    --query 'Reservations[0].Instances[0].{State:State.Name,AZ:Placement.AvailabilityZone,Type:InstanceType}'
done

# 4. 检查安全组
echo ""
echo "4. 检查安全组规则..."
NODE_SG=$(aws eks describe-nodegroup \
  --cluster-name production-eks-cluster \
  --nodegroup-name general-nodes \
  --region us-east-1 \
  --query 'nodegroup.resources.remoteAccessSecurityGroup' \
  --output text)

aws ec2 describe-security-groups \
  --group-ids $NODE_SG \
  --region us-east-1 \
  --query 'SecurityGroups[0].IpPermissions'

# 5. 检查实例系统日志(查找错误)
echo ""
echo "5. 检查实例系统日志..."
for instance in $INSTANCE_IDS; do
  echo "   实例 $instance 日志:"
  aws ec2 get-console-output \
    --instance-id $instance \
    --region us-east-1 \
    --query 'Output' \
    --output text | tail -50
done

echo ""
echo "================================================"
echo "诊断完成"
echo "================================================"

常见原因和解决方案:

原因 1:IAM 角色权限不足
解决:检查节点 IAM 角色是否有正确的策略
aws iam list-attached-role-policies --role-name eks-node-role

原因 2:安全组配置错误
解决:确保节点可以访问集群 API Server (443端口)
aws ec2 authorize-security-group-ingress \
  --group-id CLUSTER_SG \
  --source-group NODE_SG \
  --protocol tcp \
  --port 443

原因 3:子网路由配置错误
解决:确保私有子网有到 NAT Gateway 的路由
aws ec2 describe-route-tables \
  --filters "Name=association.subnet-id,Values=SUBNET_ID"

原因 4:VPC CNI 插件问题
解决:检查并重启 VPC CNI DaemonSet
kubectl rollout restart daemonset aws-node -n kube-system

原因 5:用户数据脚本错误
解决:检查启动模板的用户数据
aws ec2 describe-launch-template-versions \
  --launch-template-id lt-xxxxx

节点 NotReady 状态

症状:

$ kubectl get nodes
NAME                          STATUS     ROLES    AGE   VERSION
ip-10-0-11-100.ec2.internal   NotReady   <none>   10m   v1.28.0

诊断和修复:

#!/bin/bash
# diagnose-node-notready.sh

NODE_NAME="ip-10-0-11-100.ec2.internal"

echo "================================================"
echo "诊断节点 NotReady 问题"
echo "================================================"

# 1. 检查节点详情
echo "1. 检查节点详情..."
kubectl describe node $NODE_NAME

# 2. 检查节点条件
echo ""
echo "2. 检查节点条件..."
kubectl get node $NODE_NAME -o json | jq '.status.conditions'

# 3. 检查节点事件
echo ""
echo "3. 检查节点事件..."
kubectl get events --field-selector involvedObject.name=$NODE_NAME --sort-by='.lastTimestamp'

# 4. 检查节点上的 Pod
echo ""
echo "4. 检查节点上的 Pod..."
kubectl get pods --all-namespaces --field-selector spec.nodeName=$NODE_NAME -o wide

# 5. 检查 kubelet 日志(需要 SSM 或 SSH)
echo ""
echo "5. 检查 kubelet 日志..."
echo "   使用 SSM 连接到节点:"
echo "   INSTANCE_ID=\$(kubectl get node $NODE_NAME -o json | jq -r '.spec.providerID' | cut -d'/' -f5)"
echo "   aws ssm start-session --target \$INSTANCE_ID"
echo ""
echo "   然后执行:"
echo "   sudo journalctl -u kubelet -f"

# 6. 常见问题检查
echo ""
echo "6. 常见问题检查..."

# 磁盘空间
echo "   检查磁盘空间(需要在节点上执行):"
echo "   df -h"

# 内存
echo "   检查内存(需要在节点上执行):"
echo "   free -m"

# CNI 插件
echo "   检查 CNI 插件:"
kubectl get pods -n kube-system -l k8s-app=aws-node -o wide | grep $NODE_NAME

echo ""
echo "================================================"
echo "诊断完成"
echo "================================================"

常见解决方案:

# 方案 1:重启 kubelet
INSTANCE_ID=$(kubectl get node $NODE_NAME -o json | jq -r '.spec.providerID' | cut -d'/' -f5)
aws ssm send-command \
  --instance-ids $INSTANCE_ID \
  --document-name "AWS-RunShellScript" \
  --parameters 'commands=["sudo systemctl restart kubelet"]'

# 方案 2:重启 CNI 插件
kubectl delete pod -n kube-system -l k8s-app=aws-node --field-selector spec.nodeName=$NODE_NAME

# 方案 3:清理磁盘空间
aws ssm send-command \
  --instance-ids $INSTANCE_ID \
  --document-name "AWS-RunShellScript" \
  --parameters 'commands=["sudo docker system prune -af","sudo journalctl --vacuum-time=1d"]'

# 方案 4:替换节点
kubectl drain $NODE_NAME --ignore-daemonsets --delete-emptydir-data
aws ec2 terminate-instances --instance-ids $INSTANCE_ID
# Auto Scaling Group 会自动启动新节点

Pod 调度问题

Pod Pending 状态

症状:

$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
myapp-5d7c9b8f4f-abc12   0/1     Pending   0          5m

诊断脚本:

#!/bin/bash
# diagnose-pod-pending.sh

POD_NAME="myapp-5d7c9b8f4f-abc12"
NAMESPACE="default"

echo "================================================"
echo "诊断 Pod Pending 问题"
echo "================================================"

# 1. 检查 Pod 详情
echo "1. 检查 Pod 详情..."
kubectl describe pod $POD_NAME -n $NAMESPACE

# 2. 检查 Pod 事件
echo ""
echo "2. 检查 Pod 事件..."
kubectl get events -n $NAMESPACE --field-selector involvedObject.name=$POD_NAME --sort-by='.lastTimestamp'

# 3. 检查资源请求
echo ""
echo "3. 检查 Pod 资源请求..."
kubectl get pod $POD_NAME -n $NAMESPACE -o json | jq '.spec.containers[].resources'

# 4. 检查节点资源
echo ""
echo "4. 检查节点可用资源..."
kubectl describe nodes | grep -A 5 "Allocated resources"

# 5. 检查污点和容忍度
echo ""
echo "5. 检查节点污点..."
kubectl get nodes -o json | jq '.items[] | {name:.metadata.name, taints:.spec.taints}'

echo ""
echo "6. 检查 Pod 容忍度..."
kubectl get pod $POD_NAME -n $NAMESPACE -o json | jq '.spec.tolerations'

# 7. 检查 PVC
echo ""
echo "7. 检查 PVC 状态..."
kubectl get pvc -n $NAMESPACE
kubectl describe pvc -n $NAMESPACE

echo ""
echo "================================================"
echo "诊断完成"
echo "================================================"

常见原因和解决方案:

# 原因 1:资源不足
# Pod 事件显示:0/3 nodes are available: insufficient cpu/memory
# 解决:增加节点或减少资源请求

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - name: app
        resources:
          requests:
            cpu: 100m      # 降低 CPU 请求
            memory: 128Mi  # 降低内存请求

---
# 原因 2:节点选择器不匹配
# Pod 事件显示:0/3 nodes are available: node(s) didn't match node selector
# 解决:修复节点选择器或添加标签

# 检查节点标签
kubectl get nodes --show-labels

# 修复 Pod
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      nodeSelector:
        role: general  # 确保节点有此标签

---
# 原因 3:污点和容忍度不匹配
# Pod 事件显示:0/3 nodes are available: node(s) had taint that the pod didn't tolerate
# 解决:添加容忍度

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      tolerations:
      - key: spot
        operator: Equal
        value: "true"
        effect: NoSchedule

---
# 原因 4:PVC Pending
# Pod 等待 PVC 绑定
# 解决:检查 StorageClass 和 PV

# 检查 PVC
kubectl get pvc
kubectl describe pvc my-pvc

# 检查 StorageClass
kubectl get storageclass
kubectl describe storageclass gp3

---
# 原因 5:亲和性规则不满足
# Pod 事件显示:0/3 nodes are available: pod affinity rules not satisfied
# 解决:调整亲和性规则或添加节点

# 检查亲和性
kubectl get pod $POD_NAME -o yaml | grep -A 20 affinity

Pod 运行问题

CrashLoopBackOff

症状:

$ kubectl get pods
NAME                     READY   STATUS             RESTARTS   AGE
myapp-5d7c9b8f4f-abc12   0/1     CrashLoopBackOff   5          5m

诊断和修复:

#!/bin/bash
# diagnose-crashloop.sh

POD_NAME="myapp-5d7c9b8f4f-abc12"
NAMESPACE="default"

echo "================================================"
echo "诊断 CrashLoopBackOff"
echo "================================================"

# 1. 查看 Pod 日志
echo "1. 查看当前容器日志..."
kubectl logs $POD_NAME -n $NAMESPACE

# 2. 查看上一次容器日志
echo ""
echo "2. 查看上一次容器日志..."
kubectl logs $POD_NAME -n $NAMESPACE --previous

# 3. 查看 Pod 事件
echo ""
echo "3. 查看 Pod 事件..."
kubectl describe pod $POD_NAME -n $NAMESPACE | tail -30

# 4. 检查容器探针
echo ""
echo "4. 检查健康检查配置..."
kubectl get pod $POD_NAME -n $NAMESPACE -o json | jq '.spec.containers[].{livenessProbe,readinessProbe,startupProbe}'

# 5. 检查资源限制
echo ""
echo "5. 检查资源限制..."
kubectl get pod $POD_NAME -n $NAMESPACE -o json | jq '.spec.containers[].resources'

# 6. 交互式调试(临时创建调试容器)
echo ""
echo "6. 创建调试容器..."
kubectl debug $POD_NAME -n $NAMESPACE -it --image=busybox --share-processes

echo ""
echo "================================================"
echo "诊断完成"
echo "================================================"

常见原因:

# 原因 1:应用启动失败
# 查看日志找到错误原因
kubectl logs POD_NAME --tail=100

# 原因 2:健康检查失败
# 调整探针配置
spec:
  containers:
  - name: app
    livenessProbe:
      httpGet:
        path: /health
        port: 8080
      initialDelaySeconds: 30  # 增加初始延迟
      periodSeconds: 10
      timeoutSeconds: 5
      failureThreshold: 3      # 增加失败阈值

# 原因 3:资源不足(OOMKilled)
# 增加内存限制
spec:
  containers:
  - name: app
    resources:
      limits:
        memory: 1Gi  # 增加内存限制
      requests:
        memory: 512Mi

# 原因 4:配置错误
# 检查环境变量和 ConfigMap
kubectl get pod POD_NAME -o yaml | grep -A 20 env
kubectl get configmap
kubectl describe configmap MY_CONFIGMAP

# 原因 5:依赖服务不可用
# 检查服务依赖
kubectl get svc
kubectl get endpoints

ImagePullBackOff

症状和解决:

#!/bin/bash
# diagnose-imagepull.sh

POD_NAME="myapp-5d7c9b8f4f-abc12"
NAMESPACE="default"

echo "================================================"
echo "诊断 ImagePullBackOff"
echo "================================================"

# 1. 查看 Pod 详情
echo "1. 查看 Pod 详情..."
kubectl describe pod $POD_NAME -n $NAMESPACE | grep -A 10 "Events:"

# 2. 检查镜像名称
echo ""
echo "2. 检查镜像配置..."
kubectl get pod $POD_NAME -n $NAMESPACE -o json | jq '.spec.containers[].image'

# 3. 检查 ImagePullSecrets
echo ""
echo "3. 检查 ImagePullSecrets..."
kubectl get pod $POD_NAME -n $NAMESPACE -o json | jq '.spec.imagePullSecrets'

# 4. 验证镜像存在
echo ""
echo "4. 验证 ECR 镜像..."
IMAGE=$(kubectl get pod $POD_NAME -n $NAMESPACE -o json | jq -r '.spec.containers[0].image')
aws ecr describe-images --repository-name $(echo $IMAGE | cut -d'/' -f2 | cut -d':' -f1) --region us-east-1

# 5. 测试拉取镜像
echo ""
echo "5. 在节点上测试拉取镜像..."
NODE_NAME=$(kubectl get pod $POD_NAME -n $NAMESPACE -o json | jq -r '.spec.nodeName')
echo "   节点:$NODE_NAME"
echo "   在节点上执行:docker pull $IMAGE"

echo ""
echo "================================================"
echo "常见解决方案:"
echo "================================================"
echo ""
echo "1. ECR 权限问题:"
echo "   确保节点 IAM 角色有 ECR 读取权限"
echo "   aws iam list-attached-role-policies --role-name eks-node-role"
echo ""
echo "2. 私有仓库认证:"
echo "   创建 ImagePullSecret"
echo "   kubectl create secret docker-registry ecr-secret \\"
echo "     --docker-server=ACCOUNT.dkr.ecr.REGION.amazonaws.com \\"
echo "     --docker-username=AWS \\"
echo "     --docker-password=\$(aws ecr get-login-password)"
echo ""
echo "3. 镜像不存在:"
echo "   检查镜像名称和标签"
echo "   aws ecr list-images --repository-name REPO_NAME"
echo ""
echo "4. 网络问题:"
echo "   检查 NAT Gateway 和路由表"
echo "   aws ec2 describe-nat-gateways"
echo "================================================"

网络问题

Pod 无法访问外网

诊断脚本:

#!/bin/bash
# diagnose-pod-connectivity.sh

POD_NAME="myapp-5d7c9b8f4f-abc12"
NAMESPACE="default"

echo "================================================"
echo "诊断 Pod 网络连接"
echo "================================================"

# 1. 测试 DNS 解析
echo "1. 测试 DNS 解析..."
kubectl exec $POD_NAME -n $NAMESPACE -- nslookup google.com

# 2. 测试外网连接
echo ""
echo "2. 测试外网连接..."
kubectl exec $POD_NAME -n $NAMESPACE -- curl -I https://www.google.com

# 3. 检查 Pod IP
echo ""
echo "3. 检查 Pod IP..."
kubectl get pod $POD_NAME -n $NAMESPACE -o json | jq '.status.podIP'

# 4. 检查节点和子网
echo ""
echo "4. 检查节点和子网..."
NODE_NAME=$(kubectl get pod $POD_NAME -n $NAMESPACE -o json | jq -r '.spec.nodeName')
kubectl get node $NODE_NAME -o json | jq '{nodeName:.metadata.name,instanceID:.spec.providerID}'

INSTANCE_ID=$(kubectl get node $NODE_NAME -o json | jq -r '.spec.providerID' | cut -d'/' -f5)
aws ec2 describe-instances --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].SubnetId' --output text

# 5. 检查路由表
echo ""
echo "5. 检查子网路由表..."
SUBNET_ID=$(aws ec2 describe-instances --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].SubnetId' --output text)
aws ec2 describe-route-tables --filters "Name=association.subnet-id,Values=$SUBNET_ID" --query 'RouteTables[0].Routes'

# 6. 检查 NAT Gateway
echo ""
echo "6. 检查 NAT Gateway 状态..."
aws ec2 describe-nat-gateways --filter "Name=state,Values=available" --query 'NatGateways[*].{ID:NatGatewayId,SubnetId:SubnetId,State:State}'

# 7. 检查网络策略
echo ""
echo "7. 检查 NetworkPolicy..."
kubectl get networkpolicy -n $NAMESPACE

# 8. 检查安全组
echo ""
echo "8. 检查节点安全组..."
SG_IDS=$(aws ec2 describe-instances --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].SecurityGroups[*].GroupId' --output text)
for sg in $SG_IDS; do
  echo "   安全组 $sg:"
  aws ec2 describe-security-groups --group-ids $sg --query 'SecurityGroups[0].IpPermissionsEgress'
done

echo ""
echo "================================================"
echo "诊断完成"
echo "================================================"

调试工具集

常用调试命令

#!/bin/bash
# eks-debug-toolkit.sh

echo "================================================"
echo "EKS 调试工具集"
echo "================================================"

# 1. 集群信息
echo "1. 集群信息"
kubectl cluster-info
kubectl version --short

# 2. 节点信息
echo ""
echo "2. 节点信息"
kubectl get nodes -o wide
kubectl top nodes

# 3. Pod 信息
echo ""
echo "3. Pod 信息"
kubectl get pods --all-namespaces -o wide
kubectl top pods --all-namespaces

# 4. 服务信息
echo ""
echo "4. 服务信息"
kubectl get svc --all-namespaces
kubectl get endpoints --all-namespaces

# 5. 存储信息
echo ""
echo "5. 存储信息"
kubectl get pv
kubectl get pvc --all-namespaces
kubectl get storageclass

# 6. 事件
echo ""
echo "6. 最近事件"
kubectl get events --all-namespaces --sort-by='.lastTimestamp' | tail -20

# 7. 组件状态
echo ""
echo "7. 核心组件状态"
kubectl get pods -n kube-system

# 8. 日志
echo ""
echo "8. 系统组件日志"
kubectl logs -n kube-system -l k8s-app=aws-node --tail=50
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=50

echo ""
echo "================================================"
echo "调试工具集完成"
echo "================================================"

kubectl debug 使用

# 1. 创建临时调试容器
kubectl debug POD_NAME -it --image=busybox

# 2. 在节点上调试
kubectl debug node/NODE_NAME -it --image=ubuntu

# 3. 复制 Pod 进行调试
kubectl debug POD_NAME -it --copy-to=debug-pod --container=app

# 4. 使用特定工具镜像
kubectl debug POD_NAME -it --image=nicolaka/netshoot

# 5. 共享进程命名空间
kubectl debug POD_NAME -it --image=busybox --share-processes

故障排查最佳实践

系统化排查流程:

1. 确认问题范围
   ├─ 单个 Pod 还是全部?
   ├─ 单个节点还是全部?
   ├─ 特定命名空间还是全集群?
   └─ 何时开始出现?

2. 收集信息
   ├─ kubectl describe
   ├─ kubectl logs
   ├─ kubectl get events
   └─ AWS 控制台/CLI

3. 检查配置
   ├─ YAML 配置
   ├─ 环境变量
   ├─ ConfigMap/Secret
   └─ RBAC 权限

4. 检查资源
   ├─ CPU/内存使用
   ├─ 磁盘空间
   ├─ 网络带宽
   └─ IP 地址池

5. 检查网络
   ├─ 安全组规则
   ├─ 路由表
   ├─ NAT Gateway
   └─ DNS 解析

6. 查看日志
   ├─ 应用日志
   ├─ Kubelet 日志
   ├─ CloudWatch Logs
   └─ AWS 服务日志

7. 测试和验证
   ├─ 手动测试
   ├─ 隔离问题
   ├─ 逐步恢复
   └─ 记录结果

8. 预防措施
   ├─ 监控告警
   ├─ 定期巡检
   ├─ 备份策略
   └─ 文档更新

常用诊断清单:

✅ kubectl get pods --all-namespaces
✅ kubectl get nodes
✅ kubectl get events --sort-by='.lastTimestamp'
✅ kubectl describe pod POD_NAME
✅ kubectl logs POD_NAME --previous
✅ kubectl top nodes
✅ kubectl top pods
✅ aws eks describe-cluster --name CLUSTER_NAME
✅ aws eks describe-nodegroup --cluster-name CLUSTER_NAME --nodegroup-name GROUP_NAME
✅ aws ec2 describe-nat-gateways
✅ aws ec2 describe-security-groups

EKS 故障排查章节完成!现在更新导航配置。