EKS

    AWS EKS Node 인스턴스 타입의 최대 Pod 개수 (Too many pods 해결 방법)

    AWS EKS Node 인스턴스 타입의 최대 Pod 개수 (Too many pods 해결 방법)

    개요AWS EKS는 AWS VPC CNI 플러그인을 통해 ENI를 EC2 노드에 연결한다.VPC CNI는 pod에게 IP를 할당할 때, 노드가 속한 Subnet IP 대역을 할당한다.  EC2 Node의 인스턴스 타입에 따라서 ENI 개수와 각 ENI당 붙을 수 있는 프라이빗 IP의 개수가 다르다.즉, 노드의 인스턴스 타입에 따라서 할당 가능한 Pod의 개수가 다르다.참고: https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/managing-vpc-cni.html 노드 유형 확인 및 Pod 개수 제한 확인 명령어kubectl get nodes -o jsonpath="{range .items[*]}{.metadata.labels['beta\.kubernetes..

    AWS EKS 비용 절감 방안 (인스턴스 비용 절감)

    AWS EKS 비용 절감 방안 (인스턴스 비용 절감)

    개요 EKS를 사용하다 보면 노드의 타입과 개수가 늘어나면서 인스턴스에 대한 비용이 많이 늘어나게 된다. 이때 비용절감을 할 수 있는 방법은 크게 두 가지가 있다. 첫 번째는 모니터링을 통해 리소스(Limit, Request)를 알맞게 조정하는 것이다. 두 번째는 인스턴스를 On-Demand만 사용하지 않고 RI 또는 Spot을 같이 사용하는 것이다. 1. 리소스(Limit, Request) 조정 Kubernetes를 사용하면서 Pod 리소스가 무한정으로 커지지 않고 리소스 용량 관리를 하기 위해서는 리소스(Limit, Request) 설정을 해야 한다. 또한 CA, HPA에서 확장/축소시킬 기준값이 되기 때문에 운영환경에서 리소스 설정은 필수이다. 설정팁은 Request를 무조건 작게 설정하면 조금만 ..

    [EKS] Karpenter - Groupless Node AutoScaling 사용법

    [EKS] Karpenter - Groupless Node AutoScaling 사용법

    K8S Auto Scaling Pod 기반 Kubernetes Event-driven Autoscaling - 이벤트 기반 파드 오토스케일링을 지원합니다. Horizontal Pod Autoscaler - 필요에 따라 배포에 더 많은 파드를 추가하거나 제거합니다. Vertical Pod Autoscaler - 파드의 CPU 및 메모리 요청 크기를 조정하고 부하에 맞게 제한합니다. Node 기반 Karpenter (현재는 AWS EKS만 가능) Cluster Autoscaler Karpenter 개요 Karpenter는 AWS로 구축된 유연한 오픈 소스의 고성능 Kubernetes 클러스터 오토스케일러입니다. 애플리케이션 로드의 변화에 대응하여 적절한 크기의 컴퓨팅 리소스를 신속하게 실행함으로써 애플리케이..

    MAC M1에서 EKS 배포 에러 (CPU ARM/AMD 문제)

    MAC M1에서 EKS 배포 에러 (CPU ARM/AMD 문제)

    개요 MAC M1에서 docker build한 image를 eks에 배포하려고 했을 때, pod내부의 container가 실행되지 못하고 CrashLoopBackOff 가 발생했습니다. local에서 docker run을 했을 때는 정상적으로 작동하던 container가 eks에 올릴 때는 에러가 뜨는게 이상했습니다. 위의 사진과 같이 pod log를 찍어보면 exec /bin/sh: exec format error 가 찍혔습니다. MAC M1는 arm기반 cpu이고, 일반적으로 amazonelinux OS를 사용하는 aws ec2는 amd이기 때문에 m1에서 빌드한 이미지를 ec2에서 사용하려면 --platform linux/amd64 옵션을 사용해야한다고 합니다. docker build -t jwt ..

    [k8s] Resource  + Autoscaler (CA, HPA) 개념 정리

    [k8s] Resource + Autoscaler (CA, HPA) 개념 정리

    Resource 파드를 지정할 때, 컨테이너에 필요한 각 리소스의 양을 선택적으로 지정한다. 지정할 가장 일반적인 리소스는 CPU와 Memory가 있다. Requests and Limits Requests 스케줄러에서 Pod를 어떤 노드에 위치시킬 판단 근거가 된다. Pod가 Request량을 초과 하여 사용해도 Limit량을 넘지 않으면 문제는 없다. 다만 Node의 자원이 부족할 경우에는 Request량을 초과 한 Pod는 퇴거(Eviction)의 대상이 된다. CA, HPA에서 Pod를 확장 또는 축소시킬 기준 값이 된다. Limits Pod는 limit이상의 자원을 사용할 수 없다. 컨테이너의 프로세스가 허용된 양보다 많은 메모리를 사용하려고 하면, 시스템 커널은 메모리 부족(out of memo..

    [EKS] ingress-nginx helm chart 에 AWS ACM 등록

    [EKS] ingress-nginx helm chart 에 AWS ACM 등록

    개요 https://kubernetes.github.io/ingress-nginx/deploy/#aws 공식문서에서 deploy.yaml 을 다운받아서 acm 설정한 다음 kubectl apply -f deploy.yaml을 했을 때는 https 접속이 정상적으로 됐음 https://github.com/kubernetes/ingress-nginx 그런데 helm chart 로 설치를 했더니 "The plain HTTP request was sent to HTTPS port" 에러가 뜨면서 https 접속이 안됨 해결 방법 helm chart info repo: ingress-nginx repo url: https://kubernetes.github.io/ingress-nginx chart: ingress..

    [EKS] eksctl create cluster yaml file 생성

    [EKS] eksctl create cluster yaml file 생성

    사전 환경 VPC 1개 Private Subnet 2개 Public Subnet 에 IGW, NAT 생성 keypair 생성 클러스터 적용 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: eks-demo region: ap-northeast-2 version: "1.21" iam: withOIDC: true vpc: subnets: private: ap-northeast-2a: { id: subnet-xxxxxxxxxxxxxxxxx } ap-northeast-2c: { id: subnet-xxxxxxxxxxxxxxxxx } cs metadata 에 cluster 의..

    argoCD App of Apps 패턴을 사용한 서비스 배포

    argoCD App of Apps 패턴을 사용한 서비스 배포

    개요 GitOps로 app 을 일괄적으로 관리하고 new app 이 추가되어도 구조가 바뀌지 않도록 하기 위한 방법을 생각해봤습니다. 그래서 하나의 폴더에 child application 을 생성하도록 하는 App of Apps 패턴을 사용하게 되었습니다. 이를 사용하면 배포 및 구성할 수 있는 apps 들을 선언적으로 관리 할 수 있습니다. https://argo-cd.readthedocs.io/en/stable/operator-manual/cluster-bootstrapping/ 디렉터리(GitOps) 구조 ├── application.yaml ├── apps │ ├── app-apache.yaml │ ├── app-kustomize-guestbook.yaml │ └── app-helm-nginx.y..

    Github, Jenkins, argoCD를 사용하여 CI/CD 구축

    Github, Jenkins, argoCD를 사용하여 CI/CD 구축

    프로젝트의 발단은 위 아키텍처를 보고 시작했습니다. 개발자가 도커 이미지를 변경하여 Github에 push 하면 Jenkins에서 도커 이미지를 build 하고, 빌드 번호를 이미지 태그에 붙여 ECR에 push 합니다. 그리고 Github의 deployment.yaml 파일에 이미지 태그의 정보를 업데이트합니다. argoCD에서 EKS Cluster에 Pod를 배포합니다. 처음으로 제대로 된 CICD를 구축해 볼 생각에 즐거웠습니다. 하지만 과정은 그렇게 즐겁지만은 않았죠... 젠킨스 파일 삽질을 꽤 했습니다... 시작해보겠습니다. 작업 순서 1. EKS, ECR 생성 2. Github에 코드 올리기 3. Jenkins 설치 및 설정 4. Jenkinsfile 5. argoCD 설치 6. 확인 1. E..

    [EKS] alb-ingress-controller 사용해보기

    [EKS] alb-ingress-controller 사용해보기

    주의 사항 2022.08.10 수정 해당 블로그에서 설치하는 AWS ALB Ingress Controller는 v1.1 버전으로 deprecated 상태입니다. 최신 버전인 AWS Load Balancer Controller v2.4를 설치하는 것이 권장됩니다. https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/ 테스트 순서 EKS 클러스터 생성합니다 worker node 역할에 추가로 정책을 붙입니다 alb-ingress-controller 배포합니다 ingress, deployment, service 배포합니다 host에 따라 웹페이지가 바뀌는지 확인합니다 1. EKS 클러스터 생성 1 2 3 4 5 6 eksctl create ..