클라우드/AWS

[AWS] EKS 웹콘솔 생성 시 문제

Cloud_Park 2024. 6. 19. 10:05
curl -O https://raw.githubusercontent.com/awslabs/amazon-eks-ami/master/log-collector-script/linux/eks-log-collector.sh
sudo bash eks-log-collector.sh
sudo bash /opt/cni/bin/aws-cni-support.sh​
aws sts get-caller-identity
aws eks update-kubeconfig --region region-code --name my-cluster

EKS  생성하다 발생하는 문제들을 기입해보겠습니다.

 

 

 

환경 :

SG : 0.0.0.0/0 ALL PORT 오픈

룰 : 2개 생성했음 

클러스터 룰:

워커노드 룰: 

Subnet :  인터넷 게이트웨이가 있는 서브넷 

 

 

1.    Ec2SubnetInvalidConfiguration

- 내용 확인 결과  worker node에 플로팅 아이피가 존재하지 않아 발생한 건으로  아마 외부에서 노드로 통신을 체크하는 게 있는 것으로 판단됩니다.

 

해결 방법 :  인스턴스 생성 시 플로팅 아이피를 할당하여 생성할  수 있도록 서브넷을 설정한다.   "자동할당 IP 설정 활성화"를 진행

 

노드가 프라이빗 서브넷에 배포된 경우, 서브넷에는 퍼블릭 IP 주소가 할당된 NAT 게이트웨이에 대한 경로가 있어야 합니다.

 

 

 

2.  EKS: Unhealthy nodes in the kubernetes cluster

문제 : CNI 구성 실패 

  기본 CNI는 AWS CNI로 구성을 하게 되는데 워커노드에 CNI 정책룰이 없어 정책으로 인해 실패되는 문구이다.

해결: 

 노드그룹 생성 시 선택하는 정책에 AmazonEKS_CNI_Policy 룰을 추가한다.

 

 

2. Cannot create cluster 'example-cluster' because region-1d, the targeted Availability Zone, does not currently have sufficient capacity to support the cluster. Retry and choose from these Availability Zones: region-1a, region-1b, region-1c

 

문제 :  선택한 가용영역에 자원이 부족하다는 내용

해결 :  다른 가용 영역을 추가하여 생성

 

 

 

3. 노드가 클러스터 조인에 실패

 3.1. 노드그룹 생성 시 aws-auth ConfigMap을 생성하는 해당 내용과 클러스터 이름이 상이하여 발생 

아래 명령어로 해당 클러스터에서  ConfigMap 확인 가능하고 동일한지 확인 

역할 이름이 development/apps/my-role인 경우 역할에 대한 ARN을 지정할 때 역할 이름을 my-role로 변경해야 합니다. 노드 IAM 역할 ARN(인스턴스 프로파일 ARN이 아님)을 지정

eksctl get iamidentitymapping --cluster my-cluster

 

  3.2.   클러스터 이름이 일지 않는 경우

AWS CloudFormation템플릿에서 ClusterName이 조인할 클러스터의 이름과 정확히 일치하지 않습니다. 이 필드에 올바르지 않은 값을 전달하면 노드의 /var/lib/kubelet/kubeconfig 파일의 올바르지 않은 구성이라 워커노드에서 해당 파일을 확인해본다.

 

  3.3. 노드가 클러스터에서 소유하는 것으로 태그가 지정되지 않았습니다. 노드에는 다음 태그가 적용되어야 합니다. 여기서 my-cluster은 클러스터의 이름으로 교체됩니다.

키값

kubernetes.io/cluster/my-cluster owned

  3.4.  노드를 찾지 못하는 경우  (DNS관련)

 노드에 프라이빗 DNS 항목이 없으므로 kubelet 로그에 node "" not found 오류가 포함됩니다. 노드가 생성된 VPC에 대해 DHCP options set에서 Options domain-name  domain-name-servers 값이 설정되었는지 확인합니다. 기본값은 domain-name:<region>.compute.internal  domain-name-servers:AmazonProvidedDNS

 

 3.5. 15분 내로 생성되지 않는경우 (NodeCreationFailure)

  15분 동안 생성되지 않으면 NodeCreationFailure 상태가 되면 실패가 된다.  보다 빠른 노드 타입을 선택하여 해결

 

 

 

 

4. 권한이 없거나 액세스가 거부됨(kubectl)

원인 : kubectl이 Amazon EKS에 대해 올바르게 구성되지 않았거나 사용하고 있는 IAM 보안 주체(역할 또는 사용자)의 보안 인증 정보가 Amazon EKS 클러스터의 Kubernetes 객체에 대해 충분한 권한을 보유한 Kubernetes 사용자 이름에 매핑되지 않은 것

해결 :   kube config 파일을 업데이트 

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/create-kubeconfig.html

 

 

5. hostname doesn't match

문제 : 파이썬 버전이  2.7.9 버전 보다 낮음

해결: 파이썬 버전 업그레이드 

https://docs.kanaries.net/ko/topics/Python/how-to-update-python

 
6.  getsockopt: no route to host 
Error: : error upgrading connection: error dialing backend: dial tcp 172.17.<nn>.<nn>:10250: getsockopt: no route to host

문제 : eks 클러스터 아이피와 서브넷 아이피가 충돌되어 발생

해결 :  172.17.0.0/16 CIDR 범위를 피하여 생성 

 

 

7. 관리형 노드 그룹 오류

관리형 노드 그룹에 하드웨어 상태 문제가 발생하면 Amazon EKS는 문제 진단에 도움이 되는 오류 메시지를 반환합니다. 이러한 상태 확인은 Amazon EC2 상태 확인을 기반으로 하기 때문에 소프트웨어 문제를 감지하지 못하는 경우 

 

오류 종류 :

AccessDenied:  노드가 API 서버와 인증되지 못하는 현상 

 https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/troubleshooting.html#access-denied-managed-node-groups

더보기

AccessDenied 오류의 가장 흔한 원인은 관리형 노드 그룹에서 작업을 수행할 때 eks:node-manager ClusterRole 또는 ClusterRoleBinding이 누락되는 것입니다. Amazon EKS는 관리형 노드 그룹을 사용한 온보딩의 일부로 클러스터에 이러한 리소스를 설정하며 이러한 리소스는 노드 그룹을 관리하는 데 필요합니다.

ClusterRole은 시간이 지남에 따라 변경될 수 있지만 다음 예제와 비슷해야 합니다.

 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: eks:node-manager
rules:
- apiGroups:
  - ''
  resources:
  - pods
  verbs:
  - get
  - list
  - watch
  - delete
- apiGroups:
  - ''
  resources:
  - nodes
  verbs:
  - get
  - list
  - watch
  - patch
- apiGroups:
  - ''
  resources:
  - pods/eviction
  verbs:
  - create               
            

ClusterRoleBinding은 시간이 지남에 따라 변경될 수 있지만 다음 예제와 비슷해야 합니다.

 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: eks:node-manager
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: eks:node-manager
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: eks:node-manager

eks:node-manager ClusterRole이 존재하는지 확인합니다.

 
kubectl describe clusterrole eks:node-manager

존재하는 경우, 출력을 이전 ClusterRole 예와 비교합니다.

eks:node-manager ClusterRoleBinding이 존재하는지 확인합니다.

 
kubectl describe clusterrolebinding eks:node-manager

존재하는 경우, 출력을 이전 ClusterRoleBinding 예와 비교합니다.

관리형 노드 그룹 작업을 요청하는 동안 누락되거나 손상된 ClusterRole 또는 ClusterRoleBinding이 AcessDenied 오류의 원인으로 확인된 경우 복원할 수 있습니다. 다음 콘텐츠를 eks-node-manager-role.yaml이라는 파일에 저장합니다.

 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: eks:node-manager
rules:
- apiGroups:
  - ''
  resources:
  - pods
  verbs:
  - get
  - list
  - watch
  - delete
- apiGroups:
  - ''
  resources:
  - nodes
  verbs:
  - get
  - list
  - watch
  - patch
- apiGroups:
  - ''
  resources:
  - pods/eviction
  verbs:
  - create
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: eks:node-manager
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: eks:node-manager
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: eks:node-manager

파일을 적용합니다.

 
kubectl apply -f eks-node-manager-role.yaml

노드 그룹 작업을 다시 시도하여 문제가 해결되었는지 확인합니다.

AmiIdNotFound : IAM ID 존재하지 않음

AutoScalingGroupNotFound : 오토스케일 그룹을 찾을 수 없음 > 다시 생성

ClusterUnreachable: 노드가 API서버와 통신 불가 

Ec2SecurityGroupNotFound :클러스터의 클러스터 보안 그룹을 찾을 수 없습니다. 클러스터를 다시 생성해야 합니다.

Ec2SecurityGroupDeletionFailure :관리형 노드 그룹의 원격 액세스 보안 그룹을 삭제할 수 없음 >  보안 그룹에서 종속성을 제거

Ec2LaunchTemplateNotFound :관리형 노드 그룹의 Amazon EC2 시작 템플릿을 찾을 수 없음 > 복구하려면 노드 그룹을 다시 생성해야 합니다.

Ec2LaunchTemplateVersionMismatch :관리형 노드 그룹의 Amazon EC2 시작 템플릿 버전이 Amazon EKS에서 생성한 버전과 일치하지 않음 >  복구하려면 Amazon EKS에서 생성한 버전으로 되돌려야 합니다.

IamInstanceProfileNotFound : 관리형 노드 그룹의 IAM 인스턴스 프로파일을 찾을 수 없음  >복구하려면 동일한 설정으로 인스턴스 프로파일을 재 생성

IamNodeRoleNotFound : 관리형 노드 그룹의 IAM 역할을 찾을 수 없음 >.  복구하려면 동일한 설정으로 IAM 역할을 생성

AsgInstanceLaunchFailures :인스턴스를 시작하려고 시도하는 중에 Auto Scaling 그룹에 오류가 발생

NodeCreationFailure :시작된 인스턴스를 Amazon EKS 클러스터에 등록할 수 없음

InstanceLimitExceeded :AWS 계정에서 해당 인스턴스 유형의 인스턴스를 더 이상 시작할 수 없음>  복구하려면 Amazon EC2 인스턴스 제한의 증가를 요청

InsufficientFreeAddresses: 관리형 노드 그룹과 연결된 하나 이상의 서브넷에 새 노드에 사용 가능한 IP 주소가 충분하지 않음

InternalFailure : Amazon EKS 서버 측 문제

 

 

6. 노드가 NotReady 상태임

문제 : 노드가 not ready 상태라 pod가 스케줄 되지 않음

해결 :  cpu memory  storage 리소스 확인 

 

 

7.  컨테이너 런타임이 준비되지 않음 (Container runtime network not ready)

4191 kubelet.go:2130] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
4191 reflector.go:205] k8s.io/kubernetes/pkg/kubelet/kubelet.go:452: Failed to list *v1.Service: Unauthorized
4191 kubelet_node_status.go:106] Unable to register node "ip-10-40-175-122.ec2.internal" with API server: Unauthorized
4191 reflector.go:205] k8s.io/kubernetes/pkg/kubelet/kubelet.go:452: Failed to list *v1.Service: Unauthorized

원인 : aws-auth ConfigMap이 없거나 노드를 구성하는 데 사용한 IAM 역할 항목이 포함되어 있지 않음

해결 : 3.번의 내용과 동일하게 진행

 

7. TLS 핸드셰이크 시간 초과 
원인 : 노드에서 퍼블릭 API 서버 엔드포인트에 연결할 수 없는 경우 다음과 유사한 오류가 발생
 
server.go:233] failed to run Kubelet: could not init cloud provider "aws": error finding instance i-1111f2222f333e44c: "error listing AWS instances: \"RequestError: send request failed\\ncaused by: Post  net/http: TLS handshake timeout\""
 
해결 :

kubelet 프로세스가 지속적으로 다시 생성되어 API 서버 엔드포인트를 테스트하고 이 오류는 구성 변경 또는 버전 업데이트와 같이 컨트롤 플레인에서 클러스터의 롤링 업데이트를 수행하는 절차 중에 일시적으로 발생할 수도 있습니다.

이 문제를 해결하려면 라우팅 테이블과 보안 그룹을 점검하여 노드의 트래픽이 퍼블릭 엔드포인트에 도달할 수 있는지 확인합니다.

 

 

 

기타 :

CNI 로그 수집 도구

로그 확인 하기
curl -O https://raw.githubusercontent.com/awslabs/amazon-eks-ami/master/log-collector-script/linux/eks-log-collector.sh
sudo bash eks-log-collector.sh
sudo bash /opt/cni/bin/aws-cni-support.sh

# 저장 경로 /var/log/eks_i-0717c9d54b6cfaa19_2020-03-24_0103-UTC_0.6.1.tar.gz

 

 

 

 

참고: https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/troubleshooting.html

 

Amazon EKS 문제 해결 - Amazon EKS

해당 위치에 스크립트가 없으면 CNI 컨테이너를 실행할 수 없습니다. 다음 명령을 사용하여 스크립트를 수동으로 다운로드하고 실행할 수 있습니다. curl -O https://raw.githubusercontent.com/awslabs/amazon-ek

docs.aws.amazon.com