EKS Default 命名空间删除事件响应指南
📅 撰写日期: 2025-01-07 | 修改日期: 2026-02-14 | ⏱️ 阅读时间: 约 10 分钟
1. 概述 (TL;DR)
在 EKS 集群中删除 default 命名空间会阻止所有对控制平面的访问。kubectl 命令将失败,且无法通过 Velero 或 etcd 备份进行恢复。default 命名空间是必须受到保护的关键集群资源,强烈建议使用 Admission Controller 或其他访问控制机制来谨慎管理此资源。
- 根因: 删除
default命名空间会移除kubernetesService - 影响范围: API Server 访问失败 → 集群全面管理失败 → 服务中断(若持续时间较长)
- 恢复方法: 必须提交 AWS Support 工单(严重级别:Critical)
提交 Critical 级别的 AWS Support 工单,并将您的 Account Team 和 WWSO Specialist 作为参考联系人添加,以请求快速恢复。
2. 根因分析
2.1 Default 命名空间的角色
default 命名空间不仅仅是用户工作负载的基本空间。此命名空间中存在关键的集群资源。
default 命名空间中的关键资源:
kubernetes Service 是从集群内部访问 API Server 的唯一路径。如果此 Service 被删除,所有 Kubernetes 组件都将失去与控制平面的连接。
2.2 事件产生机制
让我们来分析删除 default 命名空间时的级联故障过程。
事件序列:
- 执行命名空间删除命令:
kubectl delete namespace default - 级联删除: 命名空间中的所有资源被一并删除
- kubernetes Service 删除: API Server 端点消失
- 连接中断: 集群内部组件无法与 API Server 通信
- 管理不可能: 无法执行任何 kubectl 命令
Worker Node 的影响
API Server 端点的长时间丢失会对 Worker Node 产生级联影响。
节点状态随时间变化:
在这种情况下,控制平面本身不可访问,因此 Node Controller 实际上无法更新节点状态或添加污点。结果是,整个集群进入"冻结"状态,现有 Pod 继续运行,但新的调度和状态变更变得不可能。
冻结状态下的服务影响
当集群进入冻结 状态时,现有工作负载会短暂继续运行,但服务退化会随时间增加。
即时影响:
- ❌ 新 Pod 调度不可能
- ❌ Pod 重启/重新部署不可能
- ❌ ConfigMap 和 Secret 变更无法反映
- ❌ HPA (Horizontal Pod Autoscaler) 扩缩容不可能
随时间推移的服务影响:
- 当 DNS 缓存过期或 TLS 证书过期时,服务发现失败,通信变得不可能
- 如果 Pod 因 OOMKilled 或崩溃,无法重启
- 如果节点发生故障,该节点上的所有工作负载将丢失
- ALB/NLB Target Group 更新失败,导致流量路由故障
随着时间推移,事件影响范围会扩大,因此请尽快联系 AWS Support。
3. 事件响应流程
步骤 1: 确认事件情况
如果怀疑事件是由 default 命名空间删除引起的,首先验证集群状态。
1-1. 测试 kubectl 访问
首先,验证 kubectl 命令是否正常工作。
# 尝试获取集群信息
kubectl cluster-info
# 预期错误信息
# Unable to connect to the server: dial tcp: lookup kubernetes on 10.100.0.10:53: no such host
# or
# The connection to the server <cluster-endpoint> was refused
如果看到上述错误,说明 kubernetes Service 已被删除,API Server 不可访问。
1-2. 通过 AWS CLI 检查集群状态
即使 kubectl 失败,仍可使用 AWS CLI 检查 EKS 集群状态。
# 检查集群状态
aws eks describe-cluster \
--name <cluster-name> \
--query 'cluster.{Name:name,Status:status,Endpoint:endpoint,Version:version}' \
--output table
# 预期输出(集群本身为 ACTIVE)
# -------------------------------------------------------------------
# | DescribeCluster |
# +----------+------------------------------------------------------+
# | Name | my-eks-cluster |
# | Status | ACTIVE |
# | Endpoint| https://XXXXX.gr7.ap-northeast-2.eks.amazonaws.com |
# | Version | 1.31 |
# +----------+------------------------------------------------------+
# 检查节点组状态
aws eks list-nodegroups --cluster-name <cluster-name>
aws eks describe-nodegroup \
--cluster-name <cluster-name> \
--nodegroup-name <nodegroup-name> \
--query 'nodegroup.{Name:nodegroupName,Status:status,DesiredSize:scalingConfig.desiredSize}' \
--output table
1-3. 事件情况评估标准
如果集群在 AWS 控制台或 CLI 中显示为 ACTIVE,但 kubectl 命令完全失败,请怀疑 default 命名空间被删除。
✅ 检查点: 如果确认上述症状,请立即进入步骤 2: 提交 AWS Support 工单。
步骤 2: 提交 AWS Support 工单
default 命名空间删除 事件只能通过 AWS Support 恢复。请立即提交工单。
2-1. 工单提交信息
2-2. 工单正文模板
将以下模板复制粘贴到工单正文中。
[URGENT] EKS Cluster Control Plane Access Failure Due to Default Namespace Deletion
■ Cluster Information
- Cluster Name: <Cluster Name>
- Region: <Region>
- Account ID: <AWS Account ID>
- Cluster Version: <Kubernetes Version>
■ Incident Situation
- Incident Time: <YYYY-MM-DD HH:MM UTC>
- Symptoms: kubectl commands fail after default namespace deletion
- Impact Scope: Entire cluster management impossible
■ Confirmed Details
- Cluster status via AWS CLI: ACTIVE
- kubectl cluster-info result: Connection failed
- kubectl get ns default result: Connection failed
■ Request
Please restore the default namespace and kubernetes Service.
Urgent recovery is needed for production environment.
■ Contact Information
- Contact Person: <Name>
- Phone: <Phone Number>
- Email: <Email>
2-3. 在 AWS 控制台中提交工单的方法
- 访问 AWS Support Center
- 点击 Create case
- 选择 Technical
- Service: 选择 Elastic Kubernetes Service (EKS)
- Category: 选择 Cluster Issue
- Severity: 选择 Critical - Business-critical system down(仅限 Enterprise Support 计划)
- 将上述模板粘贴到正文中
- 联系选项: 选择 Phone(响应更快)
- 点击 Submit
提交后记录工单 ID。联系 Account Team 和 WWSO Specialist 时需要使用。
步骤 3: 联系 Account Team/WWSO Specialist
在提交 AWS Support 工单的同时,联系您的 Account Team 和 WWSO (Worldwide Specialist Organization) Specialist 以加快恢复速度。
3-1. 将参考联系人添加到工单
将 Account Team 和 WWSO Specialist 作为参考联系人添加到您的 AWS Support 工单中。
- 导航到已提交工单的 Correspondence 部分
- 点击 Reply 按钮
- 添加以下内容以请求参考
CC Request:
- AWS Account Team: <Account Manager Name/Email>
- WWSO EKS Specialist: <Specialist Name/Email (if known)>
Urgent recovery needed for production environment.
Please support this case with Account Team and EKS Specialist.
3-2. 直接联系 Account Team
除 AWS Support 工单外,直接联系您的 Account Team。
邮件模板:
Subject: [URGENT] EKS Cluster Incident - Support Case #<Case ID>
Hello,
I am contacting you regarding an urgent incident in our production EKS cluster.
■ Incident Summary
- Cluster: <Cluster Name>
- Symptoms: Control Plane access failure due to default namespace deletion
- Support Case ID: <Case ID>
■ Request
Please escalate this case and connect with an EKS Specialist.
Thank you,
<Your Name>
<Phone Number>
Slack/SMS 消息(如可用):
🚨 [URGENT] EKS Cluster Incident
- Account: <Account ID>
- Cluster: <Cluster Name>
- Issue: Control Plane access failure - default namespace deleted
- Support Case: #<Case ID>
Production environment - urgent support needed.
3-3. 联系 WWSO Specialist
如果您认识 WWSO EKS Specialist,请直接联系。直接联系专家可通过内部管线路由工单,提升重要性并直接分配给负责的工程师。
3-4. 联系检查清单
步骤 4: 恢复后验证
在 AWS Support 恢复 default 命名空间后,验证集群是否正常运行。
4-1. 基本连接验证
# 1. 验证集群连接
kubectl cluster-info
# 预期输出:
# Kubernetes control plane is running at https://XXXXX.gr7.ap-northeast-2.eks.amazonaws.com
# CoreDNS is running at https://XXXXX.gr7.ap-northeast-2.eks.amazonaws.com/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
# 2. 验证 default 命名空间存在
kubectl get namespace default
# 预期输出:
# NAME STATUS AGE
# default Active <hours>
# 3. 验证 kubernetes Service
kubectl get svc kubernetes -n default
# 预期输出:
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# kubernetes ClusterIP 10.100.0.1 <none> 443/TCP <hours>
4-2. 关键组件状态验证
# 4. 检查节点状态
kubectl get nodes
# 验证所有节点为 Ready
# 5. 检查系统 Pod 状态
kubectl get pods -n kube-system
# 验证所有 Pod 为 Running
# 特别验证 coredns、kube-proxy、aws-node
# 6. 检查所有命名空间
kubectl get namespaces
# 验证 default、kube-system、kube-public、kube-node-lease 存在
4-3. API Server 功能验证
# 7. 测试 API 资源获取
kubectl api-resources | head -20
# 8. 简单资源创建/删除测试(可选)
kubectl run test-pod --image=nginx --restart=Never -n default
kubectl get pod test-pod -n default
kubectl delete pod test-pod -n default
✅ 验证检查清单:
步骤 5: 工作负载检查
恢复后,检查现有工作负载是否正常运行。
5-1. 工作负载状态检查
# 1. 检查所有命名空间的 Pod 状态
kubectl get pods --all-namespaces | grep -v Running | grep -v Completed
# 找出不在 Running 或 Completed 状态的 Pod
# 2. 检查 Deployment 状态
kubectl get deployments --all-namespaces
# 验证 READY 列显示期望的副本数
# 3. 检查 StatefulSet 状态
kubectl get statefulsets --all-namespaces
# 4. 检查 DaemonSet 状态
kubectl get daemonsets --all-namespaces
# 验证 DESIRED 和 READY 数量匹配
5-2. 服务连接检查
# 5. 验证 Service 和 Endpoint
kubectl get svc --all-namespaces
kubectl get endpoints --all-namespaces
# 验证 Endpoint 有 IP 分配
# 6. 检查 Ingress 状态(如使用)
kubectl get ingress --all-namespaces
5-3. 存储检查
# 7. 检查 PersistentVolumeClaim 状态
kubectl get pvc --all-namespaces
# 验证所有 PVC 为 Bound
# 8. 检查 PersistentVolume 状态
kubectl get pv
# 验证所有 PV 为 Bound
5-4. 事件和日志检查
# 9. 检查最近的 Warning 事件
kubectl get events --all-namespaces --field-selector type=Warning --sort-by='.lastTimestamp' | tail -20
# 10. 检查有问题的 Pod 日志
kubectl logs <pod-name> -n <namespace> --tail=100
5-5. 工作负载检查清单
在事件期间可能有失败的 Job 或 CronJob。如有必要请手动重新运行。
# 检查失败的 Job
kubectl get jobs --all-namespaces --field-selector status.successful=0
✅ 最终检查点: 当所有工作负载验证正常时,事件响应完成。之后请查看预防措施。
4. 关键资源列表
4.1 关键命名空间
除 default 命名空间外,还有一些系统命名空间,如果被删除将对集群产生严重影响。这些命名空间绝不能删除。
default 和 kube-system 命名空间如果被删除,kubectl 访问本身将变得不可能,因此无法手动恢复。恢复必须通过 AWS Support 完成。
各命名空间的详细角色:
default:
kubernetesService:从集群内部访问 API Server 的端点defaultServiceAccount:未指定 ServiceAccount 时 Pod 的默认认证主体
kube-system:
- 所有集群运行所需的基本系统组件部署的命名空间
- EKS Add-on(CoreDNS、kube-proxy、VPC CNI)和控制器所在位置
kube-public:
- 存储未认证用户也可读取的公共信息
cluster-infoConfigMap 包含集群 CA 证书和 API Server 地址
kube-node-lease:
- 每个节点的 Lease 对象存储在此处,作为心跳信号
- Node Controller 根据此信息判断节点状态
4.2 kube-system 关键组件
kube-system 命名空间包含集群运行所必需的组件。单独删除或修改这些组件可能导致严重故障。
EKS 关键 Add-on
EKS 存储组件
网络和负载均衡组件
作为 EKS Add-on 管理的组件(CoreDNS、kube-proxy、VPC CNI、EBS CSI Driver)可以从 AWS 控制台或 CLI 重新安装 Add-on 来恢复。
# 检查 EKS Add-on 状态
aws eks list-addons --cluster-name <cluster-name>
# 重新安装 Add-on 示例(CoreDNS)
aws eks create-addon \
--cluster-name <cluster-name> \
--addon-name coredns \
--resolve-conflicts OVERWRITE
上述恢复方法仅在 kube-system 命名空间存在且 kubectl 访问可用时有效。如果命名空间本身被删除,则需要 AWS Support。
4.3 集群级别资源
不属于任何命名空间的集群级别资源,如果被删除或修改,也可能影响整个集群。
RBAC 相关资源
system:node/system:nodebinding:删除会导致所有节点失去与 API Server 的通信system:kube-controller-manager:删除会导致 Controller Manager 停止system:kube-scheduler:删除会导致 Pod 调度停止
CRD (Custom Resource Definition)
删除 CRD 会级联删除从该 CRD 创建的所有 Custom Resource。例如,删除 Cert-Manager 的 Certificate CRD 会删除集群中所有的 Certificate 资源。
存储相关资源
节点和网络相关资源
EKS 特有资源
在修改或删除集群级别资源之前,务必先创建备份。
# ClusterRole 备份示例
kubectl get clusterrole <role-name> -o yaml > clusterrole-backup.yaml
# 备份所有 ClusterRole
kubectl get clusterroles -o yaml > all-clusterroles-backup.yaml
# 备份 CRD(不含 CR)
kubectl get crd <crd-name> -o yaml > crd-backup.yaml
5. 预防策略
5.1 通过 Admission Controller 保护资源
Kubernetes Admission Controller 可以防止关键资源被意外删除。这里介绍使用 Kyverno 的示例。
使用 Kyverno 防止关键命名空间删除
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: protect-critical-namespaces
spec:
validationFailureAction: Enforce
background: false
rules:
- name: block-critical-namespace-deletion
match:
any:
- resources:
kinds:
- Namespace
names:
- default
- kube-system
- kube-public
- kube-node-lease
exclude:
any:
- clusterRoles:
- cluster-admin
validate:
message: "Deletion of critical namespace '{{request.object.metadata.name}}' is blocked."
deny:
conditions:
all:
- key: "{{request.operation}}"
operator: Equals
value: DELETE
使用此策略后,非 cluster-admin 用户尝试删除关键命名空间时,其请求将被拒绝。
替代 Admission Controller 选项
除 Kyverno 外,还可以使用各种 Admission Controller。
根据您团队的技术栈和策略复杂度进行选择。对于简单的资源保护策略,Kyverno 可以快速部署。
5.2 基于 GitOps 和 KRMOps 的运维
采用 GitOps 和 KRMOps(Kubernetes Resource Model Operations)方法可以实现声明式资源管理,并从意外变更中快速恢复。