Skip to content

Amazon EKS 升级测验

本测验用于检验你对 Amazon EKS cluster(集群)升级流程、最佳实践、故障排查以及相关注意事项的理解。

测验概览

  • EKS cluster 升级规划
  • control plane(控制平面)升级
  • node group(节点组)升级
  • add-on(附加组件)和组件升级
  • 升级测试与验证
  • 升级故障排查

选择题

1. 规划 Amazon EKS cluster 升级时,最重要的第一步是什么?

A. 立即执行 control plane 升级 B. 一次性升级所有 workload(工作负载) C. 审查升级兼容性并制定测试计划 D. 同时升级所有 node group

显示答案

答案:C. 审查升级兼容性并制定测试计划

说明: 规划 Amazon EKS cluster 升级时,最重要的第一步是审查升级兼容性并制定测试计划。此步骤有助于识别升级过程中可能出现的问题,最大限度减少 workload 中断,并为成功升级奠定基础。

升级兼容性审查和测试规划的关键组成部分:

  1. 版本兼容性审查

    • 检查 Kubernetes 版本之间的 API 变更
    • 审查正在使用的 API 版本和功能的支持状态
    • 识别已弃用或已移除的 API
  2. workload 兼容性评估

    • 审查应用程序 manifest 中的 API 版本
    • 验证正在使用的 controller 和 operator 的兼容性
    • 审查 Custom Resource Definition (CRD) 和 webhook 兼容性
  3. add-on 和工具兼容性验证

    • CNI、CoreDNS、kube-proxy 版本兼容性
    • Ingress controller、service mesh 兼容性
    • 监控、日志记录、备份工具兼容性
  4. 测试计划制定

    • 在非生产环境中进行升级测试
    • 关键 workload 功能测试计划
    • 回滚程序和标准定义

实施方法:

  1. 审查升级路径和兼容性

    bash
    # Check current EKS cluster version
    aws eks describe-cluster --name my-cluster --query "cluster.version"
    
    # Check available EKS versions
    aws eks describe-addon-versions --kubernetes-version 1.28
    
    # Check deprecated API usage
    kubectl get --raw /metrics | grep "deprecated_api_requests_total"
    
    # Review API versions in use
    kubectl get deployment,statefulset,daemonset,cronjob,job -A -o json | jq '.items[].apiVersion' | sort | uniq
  2. 使用 workload 兼容性检查工具

    bash
    # Check deprecated API versions using pluto
    pluto detect-helm --output wide
    pluto detect-kubectl --output wide
    
    # Use kube-no-trouble
    kubectl-no-trouble
  3. 创建测试 cluster 并测试升级

    bash
    # Create test cluster
    eksctl create cluster \
      --name test-upgrade \
      --version 1.27 \
      --region us-west-2 \
      --nodegroup-name standard-workers \
      --node-type m5.large \
      --nodes 2
    
    # Upgrade test cluster
    eksctl upgrade cluster \
      --name test-upgrade \
      --version 1.28 \
      --approve
  4. 创建升级计划文档

    markdown
    # EKS Cluster Upgrade Plan
    
    ## Current State
    - Cluster version: 1.27
    - Node groups: 3 (system: 1.27, app: 1.27, batch: 1.27)
    - Key add-ons: AWS VPC CNI 1.12.0, CoreDNS 1.8.7, kube-proxy 1.27.1
    
    ## Target State
    - Cluster version: 1.28
    - Node groups: 3 (system: 1.28, app: 1.28, batch: 1.28)
    - Key add-ons: AWS VPC CNI 1.13.0, CoreDNS 1.9.3, kube-proxy 1.28.1
    
    ## Compatibility Review Results
    - Deprecated APIs: batch/v1beta1 CronJob -> batch/v1 CronJob
    - Add-on compatibility: All compatible
    - Custom resources: No updates needed
    
    ## Upgrade Steps
    1. Upgrade and test non-production environment
    2. Upgrade control plane
    3. Upgrade add-ons
    4. Sequentially upgrade node groups
    5. Validation and monitoring
    
    ## Rollback Plan
    - Rollback criteria: Critical workload failure
    - Rollback procedure: Create new node group (previous version), migrate workloads

升级兼容性审查的关键领域:

  1. API 变更

    • Kubernetes 1.22:移除了许多 beta API
    • Kubernetes 1.25:移除了 PodSecurityPolicy
    • Kubernetes 1.26:移除了 HorizontalPodAutoscaler v2beta2
    • Kubernetes 1.27:FlowSchema 和 PriorityLevelConfiguration API 变更
    • Kubernetes 1.28:移除并更改了一些 beta API
  2. Node 组件兼容性

    • kubelet 版本最多可比 control plane 落后 2 个次要版本
    • 建议 kube-proxy 与 control plane 版本一致
    • 验证 container runtime 兼容性
  3. add-on 兼容性

    • CNI plugin 版本兼容性
    • CoreDNS 版本兼容性
    • Ingress controller、service mesh 兼容性

其他选项的问题:

  • A. 立即执行 control plane 升级:未进行兼容性审查和测试就升级,可能导致意外问题,并带来较高的 workload 中断风险。
  • B. 一次性升级所有 workload:这是一种有风险的方法;如果出现问题,可能影响整个系统。分阶段方法更安全。
  • D. 同时升级所有 node group:同时升级所有 node 会带来中断所有 workload 的风险,并且在出现问题时使回滚变得困难。

2. 升级 Amazon EKS cluster 的 control plane 时,正确的方法是什么?

A. 先升级 node group,然后升级 control plane B. 先升级 control plane,然后升级 node group C. 同时升级 control plane 和 node group D. 创建新 cluster 并迁移 workload,而不进行升级

显示答案

答案:B. 先升级 control plane,然后升级 node group

说明: 升级 Amazon EKS cluster 的 control plane 时,正确的方法是先升级 control plane,然后升级 node group。此方法遵循 Kubernetes 版本兼容性模型,并最大限度减少升级过程中可能出现的问题。

先升级 control plane 的原因:

  1. Kubernetes 版本兼容性模型

    • control plane 最多可比 node 领先 2 个次要版本
    • node 不能领先于 control plane
    • 此模型确保向后兼容性
  2. API Server 兼容性

    • 新版本 API server 可以与旧版本 kubelet 通信
    • 相反,新版本 kubelet 可能与旧版本 API server 存在兼容性问题
  3. 支持渐进式升级

    • control plane 升级后,可以逐步升级 node group
    • 限制影响范围,并在出现问题时便于回滚

实施方法:

  1. control plane 升级

    bash
    # Control plane upgrade using AWS CLI
    aws eks update-cluster-version \
      --name my-cluster \
      --kubernetes-version 1.28
    
    # Check upgrade status
    aws eks describe-update \
      --name my-cluster \
      --update-id <update-id>
    bash
    # Control plane upgrade using eksctl
    eksctl upgrade cluster \
      --name my-cluster \
      --version 1.28 \
      --approve
  2. 验证 control plane 升级完成

    bash
    # Check cluster version
    aws eks describe-cluster \
      --name my-cluster \
      --query "cluster.version" \
      --output text
    
    # Check cluster status
    kubectl get componentstatuses
    kubectl get nodes
  3. 准备 node group 升级

    bash
    # Check current node groups
    aws eks list-nodegroups \
      --cluster-name my-cluster
    
    # Check node group version
    aws eks describe-nodegroup \
      --cluster-name my-cluster \
      --nodegroup-name my-nodegroup \
      --query "nodegroup.version" \
      --output text

control plane 升级流程:

  1. 升级前准备

    • 验证 cluster 状态
    • 执行备份
    • 验证关键 workload
  2. 启动升级

    • 使用 AWS Management Console、AWS CLI 或 eksctl
    • 监控升级进度
  3. 升级期间监控

    • control plane endpoint 可用性
    • 系统 workload 状态
    • 日志和事件监控
  4. 升级后验证

    • 验证 control plane 组件状态
    • 测试 API server 功能
    • 确认系统 workload 正常运行

control plane 升级注意事项:

  1. 升级时间

    • 通常需要 20-30 分钟
    • 会因 cluster 规模和复杂度而异
    • 建议在维护窗口期间执行
  2. 升级期间的 API Server 可用性

    • 升级期间可能出现临时 API server 中断
    • 现有 workload 会继续运行
    • 新 Deployment 和配置更改可能会延迟
  3. 升级失败响应

    • 联系 AWS support team
    • 收集 cluster 状态和日志
    • 执行替代计划

最佳实践:

  1. 升级前验证 cluster 状态

    bash
    # Check cluster status
    kubectl get nodes
    kubectl get pods --all-namespaces
    kubectl get componentstatuses
    
    # Check events
    kubectl get events --all-namespaces --sort-by='.lastTimestamp'
    
    # Check resource usage
    kubectl top nodes
    kubectl top pods --all-namespaces
  2. 升级前备份 etcd

    bash
    # etcd backup (for self-managed clusters)
    ETCDCTL_API=3 etcdctl snapshot save snapshot.db
    
    # For EKS, backup key resources
    kubectl get all --all-namespaces -o yaml > all-resources.yaml
  3. 规划渐进式 node group 升级

    bash
    # Node group upgrade plan
    # 1. Start with less critical node groups
    # 2. Upgrade one node group at a time
    # 3. Validate after each node group upgrade
  4. 升级后验证系统组件

    bash
    # Check system pod status
    kubectl get pods -n kube-system
    
    # Check CoreDNS status
    kubectl get pods -n kube-system -l k8s-app=kube-dns
    
    # Check CNI plugin status
    kubectl get pods -n kube-system -l k8s-app=aws-node

其他选项的问题:

  • A. 先升级 node group,然后升级 control plane:这违反了 Kubernetes 版本兼容性模型,kubelet 版本领先于 API server 版本可能导致兼容性问题。
  • C. 同时升级 control plane 和 node group:同时升级风险较高;如果出现问题,可能影响整个 cluster。也难以进行渐进式验证。
  • D. 创建新 cluster 并迁移 workload,而不进行升级:这种方法可行,但存在资源重复、迁移流程复杂以及额外成本等问题,因此不建议用于典型升级。

3. 升级 Amazon EKS node group 的最安全且最有效的方法是什么?

A. 同时终止所有 node,并替换为新版本 B. 使用 managed node group 升级或 blue/green deployment 策略 C. 仅升级 control plane,不升级 node group D. 在每个 node 上手动升级 kubelet 版本

显示答案

答案:B. 使用 managed node group 升级或 blue/green deployment 策略

说明: 升级 Amazon EKS node group 的最安全且最有效的方法是使用 managed node group 升级功能,或实施 blue/green deployment 策略。这些方法可以在最大限度减少 workload 中断的同时安全地升级 node。

managed node group 升级和 blue/green deployment 的主要优势:

  1. managed node group 升级

    • AWS 托管的 rolling upgrade 流程
    • 遵守 Pod Disruption Budgets (PDB)
    • 自动 drain 和 cordon
    • 升级失败时自动回滚
  2. blue/green deployment 策略

    • 创建新版本 node group
    • 渐进式 workload 迁移
    • 验证后移除旧 node group
    • 出现问题时可快速回滚

实施方法:

  1. managed node group 升级

    bash
    # Managed node group upgrade using AWS CLI
    aws eks update-nodegroup-version \
      --cluster-name my-cluster \
      --nodegroup-name my-nodegroup \
      --kubernetes-version 1.28
    
    # Check upgrade status
    aws eks describe-update \
      --name my-cluster \
      --nodegroup-name my-nodegroup \
      --update-id <update-id>
    bash
    # Managed node group upgrade using eksctl
    eksctl upgrade nodegroup \
      --cluster my-cluster \
      --name my-nodegroup \
      --kubernetes-version 1.28
  2. blue/green deployment 策略

    bash
    # Create new node group
    eksctl create nodegroup \
      --cluster my-cluster \
      --name my-nodegroup-v2 \
      --node-type m5.large \
      --nodes 3 \
      --nodes-min 3 \
      --nodes-max 6 \
      --node-labels "kubernetes.io/role=worker,environment=production,version=v2" \
      --node-ami auto \
      --kubernetes-version 1.28
    
    # Workload migration (using node affinity)
    kubectl apply -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-app
    spec:
      replicas: 3
      template:
        spec:
          affinity:
            nodeAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 100
                preference:
                  matchExpressions:
                  - key: version
                    operator: In
                    values:
                    - v2
    EOF
    
    # Remove old node group
    eksctl delete nodegroup \
      --cluster my-cluster \
      --name my-nodegroup-v1

node group 升级流程:

  1. managed node group 升级流程

    • 设置最大不可用 node 数
    • 创建新 node 并加入 cluster
    • drain 并终止现有 node
    • 重复直到所有 node 都完成升级
  2. blue/green deployment 流程

    • 创建新版本 node group
    • 将测试 workload 部署到新 node group
    • 逐步迁移 workload
    • 所有 workload 迁移后移除旧 node group

node group 升级注意事项:

  1. 配置 Pod Disruption Budget (PDB)

    yaml
    apiVersion: policy/v1
    kind: PodDisruptionBudget
    metadata:
      name: app-pdb
    spec:
      minAvailable: 2  # or maxUnavailable: 1
      selector:
        matchLabels:
          app: my-app
  2. 设置 Node Affinity 和 Anti-affinity

    yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-app
    spec:
      template:
        spec:
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
              - labelSelector:
                  matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - my-app
                topologyKey: "kubernetes.io/hostname"
  3. 利用 Taints 和 Tolerations

    yaml
    # Apply taint to new node group
    eksctl create nodegroup \
      --cluster my-cluster \
      --name my-nodegroup-v2 \
      --node-labels "version=v2" \
      --taints "upgrade=v2:NoSchedule" \
      --kubernetes-version 1.28
    
    # Apply toleration to specific workloads
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-app
    spec:
      template:
        spec:
          tolerations:
          - key: "upgrade"
            operator: "Equal"
            value: "v2"
            effect: "NoSchedule"

最佳实践:

  1. 升级前准备

    bash
    # Check node status
    kubectl get nodes
    
    # Check pod distribution
    kubectl get pods -o wide --all-namespaces
    
    # Check resource usage
    kubectl top nodes
    kubectl top pods --all-namespaces
  2. 渐进式升级

    • 一次升级一个 node group
    • 从不太关键的 workload 开始
    • 每一步后进行验证
  3. 升级期间增强监控

    • 监控 node 状态
    • 监控 pod 事件
    • 监控应用程序性能和可用性
  4. 制定回滚计划

    • 定义明确的回滚标准
    • 记录回滚程序
    • 为快速回滚做好准备

其他选项的问题:

  • A. 同时终止所有 node,并替换为新版本:此方法会同时中断所有 workload,严重影响 Service 可用性。
  • C. 仅升级 control plane,不升级 node group:不升级 node group 会阻止充分利用新的 Kubernetes 功能,并且随着版本差异增大,可能出现兼容性问题。
  • D. 在每个 node 上手动升级 kubelet 版本:此方法不建议用于 EKS managed node,出错可能性高,并且难以保持一致性。

4. Amazon EKS cluster 升级期间进行 add-on 管理的正确方法是什么?

A. 忽略 add-on 升级 B. 在 control plane 升级前升级所有 add-on C. 在 control plane 升级后,将 add-on 升级到兼容版本 D. 移除所有 add-on 并重新安装

显示答案

答案:C. 在 control plane 升级后,将 add-on 升级到兼容版本

说明: Amazon EKS cluster 升级期间进行 add-on 管理的正确方法是在 control plane 升级后,将 add-on 升级到兼容版本。此方法可确保 Kubernetes 版本与 add-on 之间的兼容性,最大限度减少升级过程中可能出现的问题。

在 control plane 之后升级 add-on 的主要优势:

  1. 版本兼容性保证

    • 为每个 Kubernetes 版本选择兼容的 add-on 版本
    • 防止 control plane API 与 add-on 之间出现兼容性问题
    • 提供稳定的升级路径
  2. 支持分阶段升级

    • 验证 control plane 升级后再升级 add-on
    • 出现问题时易于隔离原因
    • 支持逐步验证
  3. 利用 EKS Managed Add-ons

    • AWS 托管的 add-on 生命周期
    • 提供已验证的兼容版本
    • 自动安全补丁和更新

实施方法:

  1. 升级 EKS Managed Add-ons

    bash
    # Check available add-on versions
    aws eks describe-addon-versions \
      --addon-name vpc-cni \
      --kubernetes-version 1.28
    
    # Upgrade add-on
    aws eks update-addon \
      --cluster-name my-cluster \
      --addon-name vpc-cni \
      --addon-version v1.13.0-eksbuild.1 \
      --resolve-conflicts PRESERVE
  2. 升级关键 EKS add-on

    bash
    # Upgrade VPC CNI
    aws eks update-addon \
      --cluster-name my-cluster \
      --addon-name vpc-cni \
      --addon-version v1.13.0-eksbuild.1
    
    # Upgrade CoreDNS
    aws eks update-addon \
      --cluster-name my-cluster \
      --addon-name coredns \
      --addon-version v1.9.3-eksbuild.3
    
    # Upgrade kube-proxy
    aws eks update-addon \
      --cluster-name my-cluster \
      --addon-name kube-proxy \
      --addon-version v1.28.1-eksbuild.1
  3. 升级 self-managed add-on

    bash
    # Upgrade add-ons using Helm
    helm repo update
    helm upgrade --install metrics-server metrics-server/metrics-server \
      --namespace kube-system \
      --version 3.8.2 \
      --set apiService.create=true

关键 EKS add-on 及兼容性:

  1. Amazon VPC CNI

    • 网络接口管理
    • Pod IP 分配
    • 版本兼容性很重要
  2. CoreDNS

    • cluster 内 DNS Service
    • Service discovery
    • 每个 Kubernetes 版本都有推荐版本
  3. kube-proxy

    • 网络代理
    • Service IP 路由
    • 建议与 control plane 版本一致
  4. 其他常见 add-on

    • Cluster Autoscaler
    • Metrics Server
    • AWS Load Balancer Controller
    • External DNS

add-on 升级注意事项:

  1. 冲突解决策略

    • OVERWRITE:覆盖现有设置
    • PRESERVE:保留现有自定义设置
    • NONE:发生冲突时升级失败
  2. 升级顺序

    • 根据重要性和依赖关系确定顺序
    • 通常为 CNI -> CoreDNS -> kube-proxy -> 其他 add-on
  3. 升级验证

    • 每次 add-on 升级后验证功能
    • 监控日志和事件
    • 验证对 workload 的影响

最佳实践:

  1. 验证 add-on 版本兼容性

    bash
    # Check compatible add-on versions for each Kubernetes version
    aws eks describe-addon-versions \
      --kubernetes-version 1.28 \
      --query "addons[].{Name:addonName,LatestVersion:addonVersions[0].addonVersion}"
  2. 升级前验证 add-on 状态

    bash
    # Check current add-on status
    aws eks describe-addon \
      --cluster-name my-cluster \
      --addon-name vpc-cni
    
    # Check add-on pod status
    kubectl get pods -n kube-system -l k8s-app=aws-node
  3. 分阶段 add-on 升级

    • 一次升级一个 add-on
    • 每次升级后进行验证
    • 为出现问题时的回滚做好准备
  4. 备份自定义设置

    bash
    # Backup add-on configuration
    kubectl get configmap aws-node -n kube-system -o yaml > vpc-cni-configmap-backup.yaml

其他选项的问题:

  • A. 忽略 add-on 升级:不升级 add-on 可能导致与 Kubernetes 版本的兼容性问题,也不会应用安全补丁或 bug fix。
  • B. 在 control plane 升级前升级所有 add-on:在 control plane 升级前升级 add-on,可能导致新版本 add-on 与旧版本 control plane 不兼容。
  • D. 移除所有 add-on 并重新安装:此方法不必要地复杂且有风险,add-on 配置和设置可能会丢失。

5. 对 Amazon EKS cluster 升级期间可能出现的问题进行故障排查时,最有效的方法是什么?

A. 立即创建新 cluster B. 发生问题时只依赖 AWS support team C. 使用系统化故障排查方法和日志分析 D. 忽略升级问题

显示答案

答案:C. 使用系统化故障排查方法和日志分析

说明: 对 Amazon EKS cluster 升级期间可能出现的问题进行故障排查时,最有效的方法是使用系统化故障排查方法和日志分析。此方法有助于识别根本原因、应用适当解决方案,并防止类似问题再次发生。

系统化故障排查方法的关键组成部分:

  1. 问题识别和定义

    • 识别症状和影响范围
    • 确认问题发生的时间和条件
    • 识别与正常运行的差异
  2. 信息收集和分析

    • 收集日志和事件
    • 验证资源状态和配置
    • 分析错误消息和模式
  3. 假设形成和验证

    • 识别可能原因
    • 测试并验证假设
    • 确认根本原因
  4. 解决方案实施和验证

    • 应用适当的解决方案
    • 验证解决方案有效性
    • 采取措施防止复发

实施方法:

  1. 升级问题诊断

    bash
    # Check cluster status
    aws eks describe-cluster \
      --name my-cluster \
      --query "cluster.status"
    
    # Check upgrade status
    aws eks describe-update \
      --name my-cluster \
      --update-id <update-id>
    
    # Check control plane logs
    aws eks update-cluster-config \
      --name my-cluster \
      --logging '{"clusterLogging":[{"types":["api","audit","authenticator","controllerManager","scheduler"],"enabled":true}]}'
    
    # Check logs in CloudWatch Logs
    aws logs filter-log-events \
      --log-group-name /aws/eks/my-cluster/cluster \
      --filter-pattern "Error"
  2. node group 问题诊断

    bash
    # Check node group status
    aws eks describe-nodegroup \
      --cluster-name my-cluster \
      --nodegroup-name my-nodegroup
    
    # Check node status
    kubectl get nodes
    kubectl describe node <node-name>
    
    # Check node logs
    kubectl logs -n kube-system <node-agent-pod>
  3. add-on 问题诊断

    bash
    # Check add-on status
    aws eks describe-addon \
      --cluster-name my-cluster \
      --addon-name vpc-cni
    
    # Check add-on pod status
    kubectl get pods -n kube-system -l k8s-app=aws-node
    kubectl describe pod -n kube-system <addon-pod-name>
    kubectl logs -n kube-system <addon-pod-name>

常见升级问题和解决方案:

  1. control plane 升级失败

    • 症状:升级状态显示 “Failed”
    • 原因:API server 配置问题、资源约束、网络问题
    • 解决方案
      • 检查升级错误消息
      • 联系 AWS support team
      • 提供 cluster 状态和日志
  2. node group 升级失败

    • 症状:node 未变为 Ready,Pod 调度失败
    • 原因:Instance 启动问题、kubelet 配置错误、CNI 问题
    • 解决方案
      • 检查 node 日志
      • 验证 Instance 状态
      • 验证 security group 和 IAM 权限
  3. add-on 升级问题

    • 症状:add-on Pod 处于 CrashLoopBackOff 或 Error 状态
    • 原因:版本兼容性问题、配置冲突、资源约束
    • 解决方案
      • 检查 Pod 日志
      • 解决配置冲突
      • 使用兼容版本重试
  4. workload 兼容性问题

    • 症状:应用程序 Pod 启动失败、API 错误
    • 原因:使用已弃用的 API、不兼容的功能
    • 解决方案
      • 更新 manifest
      • 检查应用程序日志
      • 解决兼容性问题

最佳实践:

  1. 收集用于故障排查的日志

    bash
    # Collect cluster information
    kubectl cluster-info dump > cluster-info.txt
    
    # Collect node information
    kubectl describe nodes > nodes-info.txt
    
    # Collect system pod logs
    kubectl logs -n kube-system -l k8s-app=aws-node > vpc-cni-logs.txt
    kubectl logs -n kube-system -l k8s-app=kube-dns > coredns-logs.txt
    kubectl logs -n kube-system -l k8s-app=kube-proxy > kube-proxy-logs.txt
    
    # Collect events
    kubectl get events --all-namespaces --sort-by='.lastTimestamp' > events.txt
  2. 准备回滚程序

    bash
    # Node group rollback (create new node group)
    eksctl create nodegroup \
      --cluster my-cluster \
      --name rollback-nodegroup \
      --node-type m5.large \
      --nodes 3 \
      --nodes-min 3 \
      --nodes-max 6 \
      --node-ami auto \
      --kubernetes-version 1.27  # previous version
    
    # Workload migration
    kubectl cordon -l eks.amazonaws.com/nodegroup=problematic-nodegroup
    kubectl drain --ignore-daemonsets --delete-emptydir-data -l eks.amazonaws.com/nodegroup=problematic-nodegroup
  3. 记录故障排查过程

    markdown
    # Upgrade Troubleshooting Report
    
    ## Problem Description
    - Symptom: CoreDNS pods in CrashLoopBackOff state after node group upgrade
    - Impact: Service discovery failure, application connection issues
    - Occurrence time: 2023-07-15 14:30 UTC, immediately after node group upgrade
    
    ## Investigation Process
    1. Check CoreDNS pod status
    2. Analyze CoreDNS logs
    3. Verify node status and resources
    4. Review network policies
    
    ## Findings
    - Configuration error found in CoreDNS pod logs
    - CoreDNS ConfigMap incorrectly modified during upgrade
    
    ## Resolution
    1. Restore CoreDNS ConfigMap
    2. Restart CoreDNS pods
    3. Verify service connectivity
    
    ## Preventive Measures
    1. Backup critical configurations before upgrade
    2. Implement automated validation tests
    3. Improve phased upgrade process
  4. 与 AWS support team 有效协作

    • 提供清晰的问题描述
    • 共享相关日志和错误消息
    • 说明已执行的故障排查步骤

其他选项的问题:

  • A. 立即创建新 cluster:这是一种极端方法,会消耗大量时间和资源,却无法解决根本原因。
  • B. 发生问题时只依赖 AWS support team:AWS support team 是重要资源,但先执行基本故障排查步骤可以缩短解决时间。
  • D. 忽略升级问题:忽略升级问题可能对 cluster 稳定性、安全性和性能产生长期影响。

6. Amazon EKS cluster 升级后进行验证的最全面方法是什么?

A. 只验证 node 数量 B. 只验证 cluster 版本 C. 执行多阶段验证,包括系统组件、workload 功能和性能指标 D. 升级后不验证,立即在生产环境中使用

显示答案

答案:C. 执行多阶段验证,包括系统组件、workload 功能和性能指标

说明: Amazon EKS cluster 升级后进行验证的最全面方法是执行多阶段验证,包括系统组件、workload 功能和性能指标。此方法有助于验证升级已成功完成,并且 cluster 正按预期运行。

多阶段验证的关键组成部分:

  1. 系统组件验证

    • control plane 组件状态
    • node 状态和版本
    • 系统 Pod 和 add-on 状态
  2. workload 功能验证

    • 应用程序 Deployment 和扩缩容
    • Service 连接和路由
    • Storage 和 volume 功能
  3. 性能指标验证

    • 资源使用率和效率
    • 延迟和吞吐量
    • 错误率和可用性

实施方法:

  1. 系统组件验证

    bash
    # Check cluster version
    aws eks describe-cluster \
      --name my-cluster \
      --query "cluster.version" \
      --output text
    
    # Check control plane component status
    kubectl get componentstatuses
    
    # Check node status and versions
    kubectl get nodes -o wide
    
    # Check system pod status
    kubectl get pods -n kube-system
  2. workload 功能验证

    bash
    # Create test deployment
    kubectl create deployment nginx-test --image=nginx
    
    # Scale deployment
    kubectl scale deployment nginx-test --replicas=3
    
    # Create service and test connectivity
    kubectl expose deployment nginx-test --port=80 --type=ClusterIP
    kubectl run -it --rm --restart=Never busybox --image=busybox -- wget -O- nginx-test
    
    # Test volume functionality
    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: test-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    EOF
    
    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Pod
    metadata:
      name: volume-test
    spec:
      containers:
      - name: volume-test
        image: busybox
        command: ["sh", "-c", "echo 'test' > /data/test.txt && sleep 3600"]
        volumeMounts:
        - name: data
          mountPath: /data
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: test-pvc
    EOF
  3. 性能指标验证

    bash
    # Check node resource usage
    kubectl top nodes
    
    # Check pod resource usage
    kubectl top pods --all-namespaces
    
    # Perform load test
    kubectl run -it --rm --restart=Never loadtest --image=busybox -- sh -c "while true; do wget -q -O- http://nginx-test; done"

验证领域和清单:

  1. control plane 验证

    • API server 响应能力
    • etcd 状态和性能
    • Controller manager 和 scheduler 功能
  2. Data Plane 验证

    • node 状态和可用性
    • kubelet 功能
    • Container runtime 状态
  3. Networking 验证

    • Pod-to-pod 通信
    • Service discovery
    • Ingress 和 egress traffic
  4. Storage 验证

    • volume provisioning
    • 数据持久性
    • Storage class 功能
  5. Security 验证

    • Authentication 和 authorization
    • Network policies
    • Encryption 和 security contexts

最佳实践:

  1. 分阶段验证方法

    bash
    # Phase 1: System component validation
    ./validate-system-components.sh
    
    # Phase 2: Basic workload functionality validation
    ./validate-basic-workloads.sh
    
    # Phase 3: Advanced feature validation
    ./validate-advanced-features.sh
    
    # Phase 4: Performance and load testing
    ./validate-performance.sh
  2. 自动化验证测试

    yaml
    # Validation job definition
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: cluster-validation
    spec:
      template:
        spec:
          containers:
          - name: validation
            image: validation-tools:latest
            command: ["/scripts/validate-cluster.sh"]
          restartPolicy: Never
  3. 记录验证结果

    bash
    # Collect validation results
    kubectl get nodes -o wide > validation-results/nodes.txt
    kubectl get pods --all-namespaces > validation-results/pods.txt
    kubectl get events --all-namespaces --sort-by='.lastTimestamp' > validation-results/events.txt
    
    # Collect performance metrics
    kubectl top nodes > validation-results/node-metrics.txt
    kubectl top pods --all-namespaces > validation-results/pod-metrics.txt
  4. 逐步切换生产流量

    • 使用 canary deployment
    • 逐步增加流量
    • 监控指标并检测异常

其他选项的问题:

  • A. 只验证 node 数量:node 数量验证是基础验证,但可能遗漏 node 状态、系统组件和 workload 功能等重要方面。
  • B. 只验证 cluster 版本:cluster 版本验证有助于确认升级完成,但缺少功能验证。
  • D. 升级后不验证,立即在生产环境中使用:不验证就用于生产环境存在风险,潜在问题可能影响用户。