본문 바로가기
IT/Kubernetes

EKS 생성(AWS 모른채 삽질의 연속으로 어찌저찌 성공)

by rapker 2023. 4. 12.
반응형

AWS에서 EKS를 사용해 쿠버네티스 클러스터 생성하기 - 좀 시간이 지난 문서

Amazon EKS 시작하기 - AWS Docs

생성하면서 요약

  • VPC, Subnet 설계를 위해 CloudFormation을 사용하던 안하던 VPC 생성할 때 Subnet 지정하는 방법 리서치
    • public ip만 사용하도록 해야겠음
    • 자동으로 생성되었던 private subnet은 pod접근이 안되어 별도 설정 필요했음
  • EKS 확장이 필요한 즉시 사용할 수 있는 EKS 생성/설정 하는 CLI 작성 필요

 

aws cli 설치 지침

eksctl 설치

eksctl 설치 - AWS Docs

 

aws는 eks생성에 필요한 리소스 들을 직접 사전에 한땀한땀 생성을 해야 하는데

eksctl을 통해 간소화 할 수 있는가 봅니다.

시험삼아 eksctl로 생성해 보겠지만 사실 프로덕션에 network 구성을 꼼꼼히 하기위해서는

eksctl 보다 aws cli를 사용하는게 나은 방법으로 보여집니다.

 

cmd에서 choco 설치

cmd를 관리자 권한으로 열고 아래 명령어 실행

@"%SystemRoot%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command " [System.Net.ServicePointManager]::SecurityProtocol = 3072; iex ((New-Object System.Net.WebClient).DownloadString('<https://chocolatey.org/install.ps1>'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\\chocolatey\\bin"

 

eksctl 설치

choco install -y eksctl

EKS 클러스터 두 가지 방식

  • Fargate : EC2 직접 사용하지 않고 Serverless 형태로 node 사용
    • node의 public ip 정보를 얻을 수 있는가?
  • Managed Node : Node에 EC2 사용
    • 일반적인 방식으로 보임

EKS Fargate 장단점

아 Fargate가 원래 serverless형으로 docker container 실행하는 서비스 인데

EKS와 결합해서 pod가 실행될 node가 EC2대신 fargate가 되는거구만.

일단 fargate는 EKS에 비해 일부 제약사항이 붙는것으로 보여져서 생성해보지는 않겠고,

eksctl을 통한 managed cluster 생성과,

aws cli를 통한 managed cluster를 생성해 봅니다.

 

아 하나 더

 

fargate가 node당 하나의 pod가 생성되는 방식이라는 글을 봤는데

그렇게 되면 pod하나 띄울 때마다 이미지 다운로드 받는 시간이 너무 오래 걸리겠네

 

아~ eksctl로 cluster 생성하려고 했는데 아래와 같은 오류가 나네

Error: checking AWS STS access – cannot get role ARN for current session: operation error STS: GetCallerIdentity, failed to sign request: failed to retrieve credentials: failed to refresh cached credentials, no EC2 IMDS role found, operation error ec2imds: GetMetadata, request send failed, Get "<http://169.254.169.254/latest/meta-data/iam/security-credentials/>": dial tcp 169.254.169.254:80: connectex: A socket operation was attempted to an unreachable network.

 

aws 자격증명을 얻지 않아서 발생하는거로 확인되는데...

aws login 부터 방법을 찾아봐야겠네요

반응형

 

AWS 자격증명

구성 및 자격 증명 파일 설정 - AWS Docs

 

aws configre 명령어 실행 후 몇 가지 정보를 입력하면

%userprofile%\.aws 경로에 아래와 같이 파일이 생성됩니다.

aws configure                    // default 프로필 생성
aws configure --profile user1    // user1 프로필 생성

 

각각 아래와 같이 설정됩니다.

[default]
region=ap-northeast-2
output=json

[profile user1]
region=ap-northeast-2
output=json

 

.kube/config 설정

aws eks update-kubeconfig --region <region-code> --name <my-cluster>
aws eks update-kubeconfig --region ap-northeast-2 --name testcluster995

 


728x90

 

EKSCTL로 EKS 생성 (실패)

eksctl create cluster --name test999 --region ap-northeast-2

아 뭐 이래저래 권한 없다고 해서 계속 추가 하다가 full 권한을 받고

 

생성을 시도 하는데 CloudFomation이 생성하다가 계속 실패하네

 

CloudFomation에 출력되는 이벤트 중 문제로 보여지는 메세지

 

 

음.....

 

CloudFomation이 뭔지 좀 찾아봐야겠네

CloudFomation이란?

AWS CloudFormation 이란?

 

AWS에 구축한 구성을 템플릿화 하여 재사용하기 쉽게 해주는 서비스 라네요.

 

아 AWS에 리소스 배포하고 구성한 내용을 그대로 Json이나 Yaml 형식(Yaml 추천)으로 템플릿화 해두고 나중에 다시 사용하는 거구만!!

 

뭐 이거 Azure에 배포된 리소스의 Json 내보내기와 동일한 서비스 인것으로 보이는데

Azure Json내보내기 같은 경우 내보내진 Json 파일을 그대로 사용하는것은 불가능하기 때문에

CloudFomation도 제 구실을 할 수 있을 지 의문의 한 솥만큼 생기네요?

 

아... 그럼 이거 CloudFomation을 사용하지 않아도 될거 같은데

eksctl은 무조건 CloudFomation을 기반으로 하는거 같아 보이고...

 

확실한건 EKS를 사용하는데 있어 CloudFormation이 필수가 아닌 선택으로 보여진다는 점입니다.

일단 eksctl로 k8s 배포해서 k8s-controller 동작하는 것 먼저 빠르게 확인해보고 싶은데...

eksctl 사용하면 EKS 배포를 턴키에 할 수 있는것 처럼 독스에 적혀는 있지만

(배포되는 리소스들의 설정은 주는대로 써라 오류나는건 알아서 해결하시고... )

 

유저 경험은 좋지 못하네요.....

AWS Cli로 한땀한땀 배포하는 방법으로 해야하는 것인가.... ㅠㅠ

아니 뭐야 aws cli로 클러스터 생성할 때도 예제 자체가 CloudFormation을 사용하는거네...;;

 

무조건 써야 되는건가?....;;;

 

eksctl 내다 버리고!!!

 

 

AWS Managed Console로 EKS 생성

아래 링크 따라 cli와 콘솔로 하나씩 만들어 봅니다.

aws cloudformation create-stack --region ap-northeast-2 --stack-name test995-vpc-stack --template-url <https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-vpc-private-subnets.yaml>

이게 뭔지는 모르겠지만 일단 오류는 안났고...

 

콘솔에 뭐 만들어진거 있나 들어가 봅니다.

 

먼저 CloudFormation 에 스택이 생성 되어 있고

 

VPC도 하나 생성 되어 있네요

 

 

VPC도 하나 생성 되어 있네요

 

이건 뭐 지난주에 생성해둔 거고

aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy --role-name eksClusterRole

Console에서 cluster 생성하니까

 

권한 관련해서 몇번 오류나는거 잡아주고

그 다음 발생한 오류도 해결하고

 

이건 실행하지 않음

Role with arn: arn:aws:iam::773723108633:role/eksClusterRole, could not be assumed because it does not exist or the trusted entity is not correct

 

이건 실행하지 않음

aws eks update-kubeconfig --region ap-northeast-2 --name testcluster995

 

드디어! 클러스터 생성 완료!

생성하면서....

SLA는 어떻게 되는지 모르겠지만 마스터플레인 생성 자체로 시간당 0.1$라는 비용이 발생하네요

 

클러스터 생성전에 VPC와 서브넷을 생성해둬야 하는데

 

가이드 문서에 나온 그대로 따라 했더니

aws cloudformation create-stack \
--region region-code \
--stack-name my-eks-vpc-stack \
--template-url <https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-vpc-private-subnets.yaml>

VPC와 서브넷, 보안규칙이 같이 생성된거 같습니다.

 

(아 보안규칙은 eksctl 실패 때 생성된 것일 수도 있으려나? 아니겠지 CloudFormation이 삭제되면 해당 리소스는 모두 삭제된다고 했으니 아니겠지?)

 

VPC의 CIDR이 192.168.0.0/16 으로 생성되었고

 

Subnet은 두 개 영역에 private, public 하나 씩 생성되었습니다.

 

아무래도 VPC 생성 때 사용되는 amazon-eks-vpc-private-subnets.yaml 파일의 내용을 분석해서 Subnet 설계 할 때 사용해야 하겠고

public subnet과 private subnet이 단순히 이름만 저렇게 나뉜건지 아니면 뭔가 설정이 다른건지(public subnet에 배포된 ec2들만 public ip를 갖게 되는건지) 알아봐야 겠습니다.

amazon-eks-vpc-private-subnets.yaml
0.01MB

 

그리고 Network adapter는 딱히 kubenet을 선택하는 부분이 없었고

Amazon CNI의 버전을 선택하는 부분만 있는것으로 봐서 기본으로 Amazon CNI만 제공되는 것으로 보여집니다.

 

클러스터를 생성하자마자

이것저것 업데이트 하라는 리본메세지가 떠 있네요

 

음....

 

무엇은 꼭 해야되고,

무엇은 어떤 부분에 대해 알고만 있으면 되고,

무엇은 신경쓰지 않아도 되는지

누가 좀 알려주면 좋겠네요 ㅠㅠ

 

node 만드는건 뭐 별 무리 없이 슥~ 지나갔고

 

Amazon ECR 생성

콘솔에서 클릭몇번으로 생성되었고

 

Amazon ECR 사용

ecr 로그인

aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 773723108633.dkr.ecr.ap-northeast-2.amazonaws.com

 

aws account id가 뭔지 한참 찾았네요... ㅠㅠ

 

repogitory 생성

aws ecr create-repository --repository-name <hello-repository> --image-scanning-configuration scanOnPush=true --region <region>
aws ecr create-repository --repository-name colorverse-app --image-scanning-configuration scanOnPush=true --region ap-northeast-2

 

엥~ 뭐야

console에서 ECR 생성한거랑 똑같네 이전에 만든 건 삭제 해야겠어요

 

repogitory 의 비어있는 이미지

 

tagging & push

docker tag <hello-world:latest> <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<hello-repository>
docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<hello-repository>

 

push 결과

 

이미지 경로

<aws_account_id>.dkr.ecr.<region>.amazonaws.com/<hello-repository:latest>

 

백업성 정보

ACR 경로

"DockerInfo": {
	"RootUrl": "acitest998.azurecr.io"
},

 

ECR 경로

"DockerInfo": {
	"RootUrl": "<aws_account_id>.dkr.ecr.ap-northeast-2.amazonaws.com"
},

아니 helm 으로 잘 배포되서 접속해보려고 했는데

 

node 의 public ip가 없네.....;;;

 

검색을 해보니 subnet에 이름 중 public 붙은곳에 ec2를 배포하면 자동으로 public ip가 생성된다는 이야기를 봐서

기존에 4개 subnet 사용하도록 설정했던 것을 public subnet만 사용하도록 변경하고 싶은데

 

node group에는 서브넷 변경하는 부분이 없고,

EKS에서도 subnet 변경하는 부분이 안보여서 EKS를 다시 생성해야 할 판이네

 

아 오키 찾았다

 

subnet 설정 편집에 가서 public ipv4주소 자동할당 활성화 켜주는게 있네요

 

vpc에 4개 서브넷중 네이밍이 두개는 private 이 였으니까

두개 다 퍼블릭 ip 할당받도록 변경하고

 

node group은 깔끔하게 재 생성 해봐야겠어요.

 

아 node에 public ip가 있는지 없는지 확인이 안되나

콘솔 뒤적거려서 보이지가 않네요.....

 

아 콘솔에서 노드 선택하고 원시보기 하면 External IP가 나오는데 이건가 보네요

 

어??

 

pod 생성하고 pod의 host ip를 보니까 위에 ExternalIP랑 다르네요.....

 

ExternalIP는 뭐지?

 

접속해보는 순간.....

 

아 포트를 안열어줬습니다.

아~ 포트는 또 어디서 열지

 

접속 잘 되고~~

 

또 희안한 일이......

roomServer 를 여러번 생성했다 지웠다 했는데 pod에 접속이 가능했다가 불가능 했다가 와리가리 하네요~

수차례 테스트 하면서 규칙을 찾았는데

특정 노드에 배포된 pod는 접속이 불가능 했습니다.

 

두 node의 차이점을 찾아 봤는데요

 

접속이 불가능했던 인스턴스의 라우팅 설정이 nat로 되어 있는 부분이 발견되었습니다.

이를 igw로 변경하니까 접속되지 않던 node의 Pod에 접속이 잘 되었습니다.

 

CloudFormation으로 vpc 생성할 때 subnet 이름만 private이 아니였나 봅니다.

4개 subnet 중 라우팅 테이블의 대상이 nat 로 되어있는 것을 igw 로 변경 및 확인해 줍니다.

(private subnet 두 개만 nat로 되어 있었고 public subnet은 igw로 되어 있었습니다.)

(private subnet 두 개도 하나 변경하니까 두 개가 같이 반영되었습니다. 뭔가 같은 규칙을 사용하고 있었던 것 같습니다.)

 

변경 전

 

변경 후

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
LIST