작성
·
473
·
수정됨
1
순서대로 따라했으나, karpenter가 제대로 동작하지 않습니다.
프로비저너 스펙으로 spot이나, 직접 인스턴스 유형을 지정한 경우나 둘 다 p4d.24xlarge
라는 말도 안되는 인스턴스를 요청하거나 계속 waiting on cluster sync
라는 문구가 나옵니다.
왜 이런 오류가 나는건지 알 수 가 없네요 ㅠ ㅜ
완전히 싹다 밀고 처음부터 하나하나 다시 천천히 입력해봐도 여전히 똑같습니다..
답변 2
1
안녕하세요. CloudNet@ 팀입니다.
질문주신 사항에 대해 테스트해 보니 정상적으로 동작하네요.😭😭😭
(admin@myeks2:default) [root@myeks2-bastion-EC2 ~]# kubectl scale deployment inflate --replicas 5
deployment.apps/inflate scaled
(admin@myeks2:default) [root@myeks2-bastion-EC2 ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
inflate 5/5 5 5 90s
(admin@myeks2:default) [root@myeks2-bastion-EC2 ~]# kubectl logs -f -n karpenter -l app.kubernetes.io/name=karpenter -c controller | grep provisioner
2024-03-09T18:24:48.690Z INFO controller.provisioner found provisionable pod(s) {"commit": "637a642", "pods": 5}
2024-03-09T18:24:48.690Z INFO controller.provisioner computed new machine(s) to fit pod(s) {"commit": "637a642", "machines": 1, "pods": 5}
2024-03-09T18:24:48.705Z INFO controller.provisioner created machine {"commit": "637a642", "provisioner": "default", "machine": "default-f8q7x", "requests": {"cpu":"5150m","pods":"7"}, "instance-types": "c4.2xlarge, c4.4xlarge, c4.8xlarge, c5.12xlarge, c5.2xlarge and 95 other(s)"}
2024-03-09T18:24:49.383Z DEBUG controller.machine.lifecycle created launch template {"commit": "637a642", "machine": "default-f8q7x", "provisioner": "default", "launch-template-name": "karpenter.k8s.aws/9596557386432317423", "id": "lt-0911f1666a1257f25"}
2024-03-09T18:24:49.506Z DEBUG controller.machine.lifecycle created launch template {"commit": "637a642", "machine": "default-f8q7x", "provisioner": "default", "launch-template-name": "karpenter.k8s.aws/18355487179494316340", "id": "lt-03e2b35a60e46fd83"}
2024-03-09T18:24:49.638Z DEBUG controller.machine.lifecycle created launch template {"commit": "637a642", "machine": "default-f8q7x", "provisioner": "default", "launch-template-name": "karpenter.k8s.aws/1925139460811799108", "id": "lt-0b5a8728a037f2af6"}
2024-03-09T18:24:51.960Z INFO controller.machine.lifecycle launched machine {"commit": "637a642", "machine": "default-f8q7x", "provisioner": "default", "provider-id": "aws:///ap-northeast-2d/i-08510f4d3504238c1", "instance-type": "m7i-flex.2xlarge", "zone": "ap-northeast-2d", "capacity-type": "spot", "allocatable": {"cpu":"7910m","ephemeral-storage":"17Gi","memory":"29317Mi","pods":"58"}}
2024-03-09T18:25:14.449Z DEBUG controller.machine.lifecycle registered machine {"commit": "637a642", "machine": "default-f8q7x", "provisioner": "default", "provider-id": "aws:///ap-northeast-2d/i-08510f4d3504238c1", "node": "ip-192-168-98-48.ap-northeast-2.compute.internal"}
2024-03-09T18:25:25.528Z DEBUG controller.machine.lifecycle initialized machine {"commit": "637a642", "machine": "default-f8q7x", "provisioner": "default", "provider-id": "aws:///ap-northeast-2d/i-08510f4d3504238c1", "node": "ip-192-168-98-48.ap-northeast-2.compute.internal"}
(admin@myeks2:default) [root@myeks2-bastion-EC2 ~]# kubectl get node --label-columns=eks.amazonaws.com/capacityType,karpenter.sh/capacity-type,node.kubernetes.io/instance-type
NAME STATUS ROLES AGE VERSION CAPACITYTYPE CAPACITY-TYPE INSTANCE-TYPE
ip-192-168-8-100.ap-northeast-2.compute.internal Ready <none> 18m v1.26.12-eks-5e0fdde ON_DEMAND m5.large
ip-192-168-93-11.ap-northeast-2.compute.internal Ready <none> 18m v1.26.12-eks-5e0fdde ON_DEMAND m5.large
ip-192-168-98-48.ap-northeast-2.compute.internal Ready <none> 3m32s v1.26.12-eks-5e0fdde spot m7i-flex.2xlarge
혹시 증상 재현을 위해 제가 참고할 만한 사항이 있을까요?? 사소한 것이라도 괜찮습니다..
그 외에 주의 사항을 다시 점검해 보자면...
1) 환경 변수 선언하고 제대로 출력되는지 다시 한번 체크
echo $KARPENTER_VERSION
echo $CLUSTER_NAME
echo $AWS_DEFAULT_REGION
echo $AWS_ACCOUNT_ID
echo $TEMPOUT
2) EC2 Spot Fleet 사용을 위한 service-linked-role 생성 확인 (이미 생성됐다는 에러가 나와야 정상)
(admin@myeks2:default) [root@myeks2-bastion-EC2 ~]# aws iam create-service-linked-role --aws-service-name spot.amazonaws.com || true
An error occurred (InvalidInput) when calling the CreateServiceLinkedRole operation: Service role name AWSServiceRoleForEC2Spot has been taken in this account, please try a different suffix.
확인 부탁드려요... 감사합니다.
추가적으로 grep 옵션 없이 로그 정보 확인 부탁드려요. 너무 길면 메일로 첨부해서 보내셔도 좋습니다. (ongja@cloudneta.net)
kubectl logs -f -n karpenter -l app.kubernetes.io/name=karpenter -c controller
0
안녕하세요.
메일로 보내주신 로그 잘 보았습니다.
로그 상에서 눈여겨 볼 부분이 아래와 같은데요.
2024-03-10T04:59:23.584Z ERROR controller Reconciler error {"commit": "637a642", "controller": "machine.lifecycle", "controllerGroup": "karpenter.sh", "controllerKind": "Machine", "Machine": {"name":"default-ws4pf"}, "namespace": "", "name": "default-ws4pf", "reconcileID": "112747a4-1c68-449e-8bd8-e3bc202806af", "error": "creating machine, creating instance, with fleet error(s), UnauthorizedOperation: You are not authorized to perform this operation. User: arn:aws:sts::...:assumed-role/myeks2-karpenter/1710046124308773194 is not authorized to perform: ec2:RunInstances on resource: arn:aws:ec2:ap-northeast-2:...:instance/* with an explicit deny in a service control policy. Encoded authorization failure message:
UnauthorizedOperation
오류로 AWS IAM 권한 오류에 따라 인스턴스를 생성하는 권한이 없다고 출력되네요. 이에 따라 2 가지 측면을 체크해 볼 필요가 있겠습니다.
먼저 Karpenter에서 사용하는 IAM 역할(myeks2-karpenter)은 실습 코드에 의해 생성되서 저와 다를 거 같진 않습니다.
그 외에 로그 상에 with an explicit deny in a service control policy
이 있는 것으로 보면 SCP(Service Control Policy)에서 인스턴스 생성을 명시적으로 거부했을 가능성도 보이네요.
메일 상에서 SCP 정책은 확인이 어렵다고 하셨는데... 가능하다면 해당 조직 담당자에게 문의 요청을 별도로 드려야 할 것 같습니다.
아무래도 위 과정이 번거롭거나 애매할 경우 'IAM 권한 오류 때문에 그런 것인지' 확인해 보는 방법으로... 새로운 AWS 프리티어 계정을 생성 후 테스트 해보는 것은 어떨까 싶습니다.
참고로 해당 의견은 로그 상 출력된 메시지로 해석한 것이라... 별도의 다른 이유 때문에 그럴 수도 있으니 참고바랍니다.
혹시나 진행 사항 있으면 코멘트 주세요~ 같이 고민해 보시죠.🙂
아!! 추가로 생각난 것인데 CloudTrail 정보를 보면 유추할 만한 단서가 나올 수도 있어 보입니다.
SCP로 권한을 막아둔 게 있었던 것 같습니다...
제 root 계정으로 실행 하니 잘 되네요..ㅠㅠ
제가 어떤 SCP를 걸어놨는지 담당자에게 문의해 놓긴 했는데, 제가 이해한 바가 맞을지 궁금합니다.
페더레이션 계정 자체에는 Administrator 권한이 부여되어 있어 EC2나 다른 리소스에 자유롭게 접근할 수 있지만, arn:aws:sts::0099466XXXX:assumed-role/myeks2-karpenter/1710046124308773194
처럼 새롭게 생성한 role이 ec2:RunInstances
권한을 가지는 것은 SCP에서 차단되어 있다. 👈🏻 이해한 바가 맞을까요?
You are not authorized to perform this operation.
User: arn:aws:sts::00994xxxxxx:assumed-role/myeks2-karpenter/1710046124308773194 is not authorized to perform: ec2:RunInstances
on resource:arn:aws:ec2:ap-northeast-2:00XXXXXXXXX:instance/* with an explicit deny in a service control policy.
제가 조직으로 부터 받은 계정으로 들어갈 때 AWS SSO를 통해 제 AWS 계정 ID/PW를 입력하고, 이렇게 페더레이션 계정으로 접속할 수 있도록 되어있습니다.
2. 이 IAM Role이 어느단계에서 생성되나요?
이 단계에서 아래처럼 생성되면 "처음부터 다시 진행" 이라고 하셨는데, 아무리 봐도 너무나 천천히 하나하나 진행한지라 오류가 없을것으로 생각되어 그냥 진행했고 결과적으로 성공했습니다.
주말에도 열심히 분석해주시고, 원인을 찾아주셔서 감사합니다.
오늘 하루도 내일도, 계속해서 항상 좋은 일만 있으시길 바라겠습니다. 정말 감사드립니다.
1. 로그 내용대로 해석하면 그렇게 이해하는 것이 맞을 것 같습니다.
2. karpenter에서 제공하는 소스를 활용한 것으로 Karpenter IAM과 EC2 Instance Profile 생성에 따라 EC2-Spot 서비스 연결 역할이 생성된다고 생각했는데 코드 내용을 뜯어보니 그런 개념은 아닌가 봅니다.
어찌됐든 Spot 인스턴스를 관리하기 위한 서비스 연결 역할(AWSServiceRoleForEC2Spot)이 필요한 것이고 이미 생성된 상태라면 별도의 작업 없이 진행하고 이미 생성한 상태가 아니라면 생성 후 다음 작업을 진행하는 것으로 보면되겠네요.
이 부분은 EKS Hands-On 페이지에 적당히 적시해 놓겠습니다.
감사합니다. 👍
테스트 해봐주셔서 감사합니다..아침에 다시 다 밀고 설치해봤는데 여전히 똑같은 상황이 발생하네요..ㅠㅠ
문제될 여지가 될지 모르겠지만 제 계정의 상황을 말씀드리자면,,
1. 저는 EKS 환경을 기존 1개 이미 동작중인 상태입니다.
하지만 VPC가 다르고, 현재 myeks2에서도 다른 파드나 노드는 모두 정상 작동 중입니다. 충돌 날 일은 없어보입니다.
IAM 계정으로 Administrator 권한을 부여하여 사용하고 있습니다.
-----확인 결과-----
1), 2) 확인 결과 - 정상
3) grep 옵션없이 로그 정보
계속 기다리니까 권한관련 추가적인 로그가 발생하였는데 이는 메일로 전체 첨부드렸습니다.
감사합니다.