DoEKS常见问题排查:解决EKS数据平台部署与运行难题
2026/6/10 15:46:23 网站建设 项目流程

DoEKS常见问题排查:解决EKS数据平台部署与运行难题

【免费下载链接】data-on-eksDoEKS is a tool to build, deploy and scale Data Platforms on Amazon EKS项目地址: https://gitcode.com/gh_mirrors/da/data-on-eks

DoEKS(Data on Amazon EKS)是构建、部署和扩展Amazon EKS上数据平台的强大工具,但在实际使用过程中,用户可能会遇到各种部署与运行难题。本文将为您提供全面的常见问题排查指南,帮助您快速定位并解决这些问题,确保EKS数据平台稳定高效运行。

部署阶段常见错误及解决方法

AWS CLI版本过低导致的local-exec provisioner错误

在执行local-exec provisioner时,若遇到类似以下错误:

Error: local-exec provisioner error with module.eks-blueprints.module.emr_on_eks["data_team_b"].null_resource.update_trust_policy, on .terraform/modules/eks-blueprints/modules/emr-on-eks/main.tf line 105, in resource "null_resource" "update_trust_policy":│ 105: provisioner "local-exec" {│ │ Error running command 'set -e│ │ aws emr-containers update-role-trust-policy \ --cluster-name emr-on-eks \│ --namespace emr-data-team-b \│ --role-name emr-on-eks-emr-eks-data-team-b

问题描述:该错误表明当前使用的AWS CLI版本中不存在emr-containers命令,此问题已在AWS CLI 2.0.54版本中修复。

解决方案:将AWS CLI版本更新至2.0.54或更高版本,执行以下命令:

pip install --upgrade awscliv2

Terraform销毁时的超时问题

问题描述:在删除环境时,特别是删除VPC时可能会遇到超时问题,这与vpc-cni组件相关。症状包括ENIs(弹性网络接口)在环境销毁后仍附加到子网,EKS无法删除与ENI关联的安全组。

解决方案:使用提供的cleanup.sh脚本确保资源的正确清理。运行蓝图中包含的cleanup.sh脚本,它将处理任何残留的ENIs和相关安全组。

无法下载图表的错误

若遇到以下错误:

│ Error: could not download chart: failed to download "oci://public.ecr.aws/karpenter/karpenter" at version "v0.18.1"

问题描述:这是由于Terraform在安装Karpenter时的一个bug导致无法下载指定图表。

解决方案

  1. 使用以下命令与ECR进行身份验证:
aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
  1. 使用--auto-approve标志重新运行terraform apply命令:
terraform apply --auto-approve

身份验证与网络问题

Terraform无法与EKS集群进行身份验证

当出现以下错误时:

ERROR: ╷ │ Error: Get "http://localhost/api/v1/namespaces/kube-system/configmaps/aws-auth": dial tcp [::1]:80: connect: connection refused │ │ with module.eks.kubernetes_config_map_v1_data.aws_auth[0], │ on .terraform/modules/eks/main.tf line 550, in resource "kubernetes_config_map_v1_data" "aws_auth": │ 550: resource "kubernetes_config_map_v1_data" "aws_auth" { │ ╵

解决方案:首先尝试使用exec插件:

provider "kubernetes" { host = module.eks_blueprints.eks_cluster_endpoint cluster_ca_certificate = base64decode(module.eks_blueprints.eks_cluster_certificate_authority_data) exec { api_version = "client.authentication.k8s.io/v1beta1" command = "aws" args = ["eks", "get-token", "--cluster-name", module.eks_blueprints.eks_cluster_id] } }

如果问题仍然存在,可以使用本地kube配置文件:

  1. 为集群创建本地kubeconfig:
aws eks update-kubeconfig --name <EKS_CLUSTER_NAME> --region <CLUSTER_REGION>
  1. 更新providers.tf文件,使用config_path:
provider "kubernetes" { config_path = "<HOME_PATH>/.kube/config" } provider "helm" { kubernetes { config_path = "<HOME_PATH>/.kube/config" } } provider "kubectl" { config_path = "<HOME_PATH>/.kube/config" }

Pod网络配置错误

在创建Pod时遇到以下错误:

Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "xxxxxxxxxxxxxxxxxxxxxx" network for pod "test-pod": networkPlugin cni failed to set up pod test-pod_default" network: add cmd: failed to assign an IP address to container

问题描述:此错误表明VPC CNI无法为容器分配IP地址,可能是由于EC2 API调用速率限制导致的。

解决方案

  1. 避免在大型集群或有大量Pod变动的集群中使用WARM_IP_TARGET
  2. MINIMUM_IP_TARGET设置一个略高于预期每个节点上运行的Pod数量的值:
# EKS Addons cluster_addons = { vpc-cni = { configuration_values = jsonencode({ env = { MINIMUM_IP_TARGET = "30" } }) } }
  1. 对于大型实例类型,使用MAX_ENImax-pods限制每个节点的IP数量:
# EKS Addons cluster_addons = { vpc-cni = { configuration_values = jsonencode({ env = { MAX_ENI = "1" } }) } }

并更新工作节点的userdata以设置--max-pods选项。

资源与状态管理问题

EMR Containers虚拟集群删除错误

当遇到"waiting for EMR Containers Virtual Cluster delete: unexpected state 'ARRESTED'"错误时:

解决方案

  1. 运行以下命令列出处于"ARRESTED"状态的虚拟集群:
aws emr-containers list-virtual-clusters --region <REGION> --states ARRESTED \ --query 'virtualClusters[0].id' --output text
  1. 运行以下命令删除虚拟集群:
aws emr-containers list-virtual-clusters --region <REGION> --states ARRESTED \ --query 'virtualClusters[0].id' --output text | xargs -I{} aws emr-containers delete-virtual-cluster \ --region <REGION> --id {}

命名空间终止问题

当命名空间卡在"Terminating"状态且无法删除时:

解决方案:使用以下命令删除命名空间上的终结器:

NAMESPACE=<namespace> kubectl get namespace $NAMESPACE -o json | sed 's/"kubernetes"//' | kubectl replace --raw "/api/v1/namespaces/$NAMESPACE/finalize" -f -

KMS别名已存在错误

在Terraform安装或重新部署过程中,可能会遇到AlreadyExistsException: An alias with the name ...错误。

解决方案:使用以下命令删除现有的KMS别名:

aws kms delete-alias --alias-name <KMS_ALIAS_NAME> --region <ENTER_REGION>

CloudWatch Logs日志组创建错误

当Terraform无法创建CloudWatch Logs日志组,因为它已存在于AWS账户中时:

解决方案:通过更新日志组名称和区域来删除现有日志组:

aws logs delete-log-group --log-group-name <LOG_GROUP_NAME> --region <ENTER_REGION>

Karpenter相关问题

Karpenter缺少服务关联角色错误

Karpenter在尝试创建新实例时抛出以下错误:

"error":"launching nodeclaim, creating instance, with fleet error(s), AuthFailure.ServiceLinkedRoleCreationNotPermitted: The provided credentials do not have permission to create the service-linked role for EC2 Spot Instances."}

解决方案:在使用的AWS账户中创建服务关联角色:

aws iam create-service-linked-role --aws-service-name spot.amazonaws.com

监控与优化建议

为了避免和快速解决DoEKS相关问题,建议实施以下监控和优化策略:

  1. 监控网络地址使用情况(NAU),避免VPC容量限制。可以通过CloudWatch指标NetworkAddressUsage进行监控。

  2. 考虑启用VPC CNI前缀模式,以减少NAU消耗。

  3. 配置CoreDNS自动扩展或实施Node local cache,以处理高DNS流量。

  4. 为CoreDNS应用节点反亲和性策略,确保副本分布在不同节点上。

  5. 调整Pod的DNS配置,优化DNS查找性能。例如,将ndots设置为较低值:

apiVersion: v1 kind: Pod metadata: namespace: default name: dns-example spec: containers: - name: test image: nginx dnsConfig: options: - name: ndots value: "2"
  1. 对于需要在Pod之间交换数据的工作负载,考虑使用podAffinity将Pod调度到同一可用区,以减少跨AZ流量成本和延迟。

通过以上方法,您可以有效解决DoEKS在部署和运行过程中遇到的常见问题,确保您的EKS数据平台稳定高效地运行。如果您遇到其他问题,建议查阅项目的官方文档或联系支持团队获取进一步帮助。

【免费下载链接】data-on-eksDoEKS is a tool to build, deploy and scale Data Platforms on Amazon EKS项目地址: https://gitcode.com/gh_mirrors/da/data-on-eks

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询