1 cloudfomation으로 명령서버 1대 생성 EC2 키페어 선택 Access-key 입력 Secret-Key 입력 # 참고 # aws configure보다 우선하는 변수로 설정하는법 - Access-key 지웠을때 새로 적용시 사용. # Linux / macOS (Bash, Zsh) export AWS_ACCESS_KEY_ID="AKIASEWS42PKOY" export AWS_SECRET_ACCESS_KEY="imuwA5NEid" 2 # ec2 로그인 aws s3 ls cd mkdir 16 cd 16 cat < provider.tf provider "aws" { region = "ap-northeast-2" } EOF cat < vpc.tf module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "~> 5.0" name = "eks-vpc" cidr = "10.0.0.0/16" # 가용 영역 설정 (서울 리전 기준) azs = ["ap-northeast-2a", "ap-northeast-2c"] # EKS Pod가 사용할 충분한 크기의 Private Subnet (/19) private_subnets = ["10.0.32.0/19", "10.0.64.0/19"] # 로드밸런서 등이 위치할 Public Subnet public_subnets = ["10.0.0.0/22", "10.0.4.0/22"] # NAT Gateway 설정 (Private Subnet의 Pod들이 외부 통신을 하기 위해 필수) enable_nat_gateway = true single_nat_gateway = true # 비용 절감을 위해 하나만 생성 (운영환경은 false 권장) # EKS 로드밸런서 자동 인식을 위한 필수 태그 public_subnet_tags = { "kubernetes.io/role/elb" = "1" } private_subnet_tags = { "kubernetes.io/role/internal-elb" = "1" "kubernetes.io/cluster/my-eks-cluster" = "owned" } } EOF cat < eks.tf module "eks" { source = "terraform-aws-modules/eks/aws" version = "~> 20.0" cluster_name = "my-eks-cluster" cluster_version = "1.34" # 최신 안정화 버전 사용 # 앞서 생성한 VPC 모듈의 출력값 연결 vpc_id = module.vpc.vpc_id subnet_ids = module.vpc.private_subnets # 클러스터 엔드포인트 접근 설정 (개발 편의를 위해 Public 오픈, 보안상 Private 권장) cluster_endpoint_public_access = true # Managed Node Group 설정 eks_managed_node_groups = { general = { instance_types = ["m7i-flex.large"] # 최신 인스턴스 타입 사용 min_size = 1 max_size = 3 desired_size = 2 } } # 액세스 권한 관리 (현재 테라폼 실행자에게 관리자 권한 부여) enable_cluster_creator_admin_permissions = true } EOF terraform init terraform plan terraform apply -auto-approve 또는 terraform apply yes (15분) k ge nodes 4 # eks 접속 방법 # 테라폼은 따로 쿠버네티스 권한 받로록 설정해야 한다. aws eks update-kubeconfig --region ap-northeast-2 --name my-eks-cluster k get no ------------------ 5 # 트라블 슈팅 - EKS가 안만들어지고 오류가 발생할시 조치하는법 # EKS 가 정상으로 만들어져서 k get nodes 해서 나오는 경우는 상관 없음. # 두번째 클러스터 생성시는 오류가 발생하므로 아래를 미리 실행 1 # kms 중복 에러 미리 조치 terraform import 'module.eks.module.kms.aws_kms_alias.this["cluster"]' alias/eks/my-eks-cluster 2 # cloudwatch log 중복 에러 미리 조치 - 로그 삭제후 생성 aws logs delete-log-group \ --log-group-name /aws/eks/my-eks-cluster/cluster terraform init terraform plan terraform apply -auto-approve ----------------------- 6 # eks에 서비스 올리기 k get no watch -d kubectl get ing,no,pods,svc,deploy cat < my-app.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-web-app spec: replicas: 3 # 3개의 파드를 띄움 selector: matchLabels: app: my-web-app template: metadata: labels: app: my-web-app spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: my-web-service spec: selector: app: my-web-app ports: - protocol: TCP port: 80 # 서비스가 노출할 포트 targetPort: 80 # 파드 내부의 포트 type: NodePort # ALB 연동을 위해 NodePort 혹은 IP 모드로 설정 EOF # 배포 명령: kubectl apply -f my-app.yaml ------------------------------------------------------------- 6 AWS Load Balancer Controller 설치법 1단계: IAM 정책 생성 컨트롤러가 AWS 서비스(ALB, Target Group 등)를 생성하고 관리할 수 있도록 권한 정책을 생성합니다 # IAM 정책 파일 다운로드 curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json # AWS IAM 정책 생성 aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json 7 2단계: IAM Role 및 Service Account 생성 (IRSA) EKS 클러스터의 서비스 어카운트가 위에서 만든 정책을 사용할 수 있도록 연결합니다. (OIDC 설정 포함) # CLUSTER_NAME과 ACCOUNT_ID를 본인 환경에 맞게 수정하세요. # ACCOUNT_ID는 콘솔 > 오른쪽 > 계정 ID 이다. eksctl create iamserviceaccount \ --cluster=my-eks-cluster \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --role-name "AmazonEKSLoadBalancerControllerRole" \ --attach-policy-arn=arn:aws:iam::<내-계정-ID>:policy/AWSLoadBalancerControllerIAMPolicy \ --approve # my-eks-cluster eksctl create iamserviceaccount \ --cluster=my-eks-cluster \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --role-name "AmazonEKSLoadBalancerControllerRole" \ --attach-policy-arn=arn:aws:iam::697016550159:policy/AWSLoadBalancerControllerIAMPolicy \ --approve 8 3단계: Helm을 이용한 컨트롤러 설치 이제 실제 컨트롤러 소프트웨어를 클러스터에 배포합니다. # Helm 레포지토리 추가 helm repo add eks https://aws.github.io/eks-charts helm repo update # 컨트롤러 설치 helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --set clusterName=my-eks-cluster \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller 9 설치 확인 및 결과 대기 설치가 완료되면 약 1분 후 watch 화면에서 변화를 확인할 수 있습니다. (3분 걸림) k ns kube-system # 컨트롤러 작동 확인: kubectl get deployment -n kube-system aws-load-balancer-controller 10 service cat < service.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-web-app spec: replicas: 3 # 3개의 파드를 띄움 selector: matchLabels: app: my-web-app template: metadata: labels: app: my-web-app spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: my-web-service spec: selector: app: my-web-app ports: - protocol: TCP port: 80 # 서비스가 노출할 포트 targetPort: 80 # 파드 내부의 포트 type: NodePort # ALB 연동을 위해 NodePort 혹은 IP 모드로 설정 EOF 11 # ingress.yaml cat < ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-alb-ingress annotations: # 핵심! 이 주석이 있어야 ALB가 생성됩니다. kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing # 외부 접속 허용 alb.ingress.kubernetes.io/target-type: ip # Pod IP로 직접 전달 (성능 우수) spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: my-web-service # 위에서 만든 서비스 이름 port: number: 80 EOF kubectl apply -f ingress.yaml 12 k get ing k8s-kubesyst-myalbing-a3eb83189f-448392726.ap-northeast-2.elb.amazonaws.com 13 웹 브라우저로 접속 확인 - 아래 페이지가 나오면 정상적으로 ingress가 생성된 상태입니다. Backend service does not exist ------------------------------- # 파드와 노드증가를 시각화 하여 확인하는 Kubeops view 설치 1 k ns default git clone https://codeberg.org/hjacobs/kube-ops-view.git cd kube-ops-view/ kubectl apply -k deploy # 외부에서 kube-ops-view를 접속하기 위해서 Service Type을 LoadBalancer 로 변경한다. kubectl edit svc kube-ops-view type: LoadBalancer (3분 걸림) 9 k ns default kubectl scale deployment.apps/my-web-app --replicas=5 kubectl scale deployment.apps/my-web-app --replicas=30 kubectl scale deployment.apps/my-web-app --replicas=3 10 # work node 수 늘리기 오토스케일링 그룹 이름을 알아야 한다/ # my-eks-cluster 클러스터 Autoscaling Group 이름 CLI로 확인 aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='my-eks-cluster']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]" --output table eks-general-20260331090803223800000003-1ecea193-3321-3248-b09d-ab6d827e1e41 또는 # 콘솔에서 확인 # EC2 > 오토스케일링 그룹 이름 확인 ASG_NAME=eks-general-20260331090803223800000003-1ecea193-3321-3248-b09d-ab6d827e1e41 echo ${ASG_NAME} # node를 5로 aws autoscaling update-auto-scaling-group --auto-scaling-group-name ${ASG_NAME} --min-size 2 --desired-capacity 5 --max-size 6 aws autoscaling update-auto-scaling-group --auto-scaling-group-name ${ASG_NAME} --min-size 2 --desired-capacity 2 --max-size 6 (i-0343e26104cfd2180@eks-demo:N/A) [root@kops-ec2 kube-ops-view]# k get no NAME STATUS ROLES AGE VERSION ip-192-168-20-86.ap-northeast-2.compute.internal Ready 43m v1.34.2-eks-ecaa3a6 ip-192-168-28-28.ap-northeast-2.compute.internal NotReady 5s v1.34.2-eks-ecaa3a6 ip-192-168-33-16.ap-northeast-2.compute.internal Ready 43m v1.34.2-eks-ecaa3a6 ip-192-168-92-134.ap-northeast-2.compute.internal Ready 43m v1.34.2-eks-ecaa3a6 ip-192-168-92-162.ap-northeast-2.compute.internal NotReady 5s v1.34.2-eks-ecaa3a6 -------------------------------------------------------