[Docker] ECR 이미지를 활용한 EKS 운영 (2) - 디플로이먼트와 서비스 생성

yedi·2025년 3월 26일
post-thumbnail

4. kubectl 설치와 EKS 클러스터 연결

EKS 클러스터와 노드 그룹을 생성한 상태라면, EC2에서 kubectl을 설치한 후 EKS 클러스터에 연결해야 합니다.
kubectl을 사용하면 동일한 VPC 내 EC2 인스턴스에서 SSH로 접속하여 EKS에 Deployment와 Service를 반영할 수 있습니다.

kubectl은 Kubernetes 클러스터를 관리하는 명령어 도구입니다.
이를 통해 파드(Pod) 생성, 업데이트, 삭제, 서비스 배포 등 다양한 Kubernetes 작업을 수행할 수 있습니다.
쉽게 말해, Kubernetes와 소통하는 리모컨 같은 역할을 합니다.

kubectl 설치와 EKS 클러스터 연결 실습

먼저 접속하려는 EC2 인스턴스에 SSH로 접속해보자.

  1. kubectl 설치

    curl -LO "https://dl.k8s.io/release/$(curl -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
    chmod +x kubectl
    sudo mv kubectl /usr/local/bin/
    

    설치가 완료되었는지 확인합니다.

    kubectl version --client
    
  2. EKS 클러스터와 연결
    EKS 클러스터에 대한 인증 정보를 kubeconfig 파일에 추가하여, kubectl 명령어로 EKS 클러스터에 연결할 수 있게 만듭니다.

    aws eks --region <Region> update-kubeconfig --name <Cluster>
    
  3. ECR 로그인
    ECR에 이미 업로드된 두 개의 이미지를 사용할 예정이므로, ECR에 로그인해야 합니다.

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

5. 디플로이먼트 (Deployment)

EKS에서 디플로이먼트(Deployment)는 Kubernetes 애플리케이션을 관리하고 배포하는 방법입니다. 디플로이먼트를 사용하면 애플리케이션을 파드 형태로 배포하고, 지정된 개수만큼 자동으로 실행되며, 버전 업데이트나 롤백도 쉽게 할 수 있습니다. 즉, 애플리케이션 배포와 관리를 효율적으로 지원하는 중요한 리소스입니다.

디플로이먼트의 역할

  • 애플리케이션 배포
    : 애플리케이션을 자동으로 파드로 배포하고 관리합니다.

  • 스케일링
    : 파드 수를 자동으로 조정하여 애플리케이션을 확장하거나 축소합니다.

  • 업데이트 및 롤백
    : 애플리케이션을 안전하게 업데이트하고 필요시 롤백할 수 있습니다.

  • 고가용성 유지
    : 파드 실패 시 자동으로 새로운 파드를 생성하여 서비스 중단을 방지합니다.


디플로이먼트의 구성

  • 파드 수 (replicas)
    : 실행할 파드 개수 설정

  • 컨테이너 이미지
    : 배포할 애플리케이션 이미지 설정

  • 롤링 업데이트 전략
    : 서비스 중단 없이 점진적으로 업데이트


EKS 디플로이먼트 실습

노드그룹에서 생성한 노드(EC2 인스턴스)에 하나의 파드로 web과 api 두 개의 컨테이너를 실행하며, ECR에 업로드한 web 이미지와 api 이미지를 사용합니다.

  1. deployment.yaml 작성

    설정
    - web-container (포트: 8080)
    - api-container (포트: 60818)
    - replicas: 1 → Pod 하나만 생성
    - matchLabels: app: web-api → Selector를 통해 Service와 연결

    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: web-api-deployment
    spec:
     replicas: 1
     selector:
       matchLabels:
         app: web-api
     template:
       metadata:
         labels:
           app: web-api
       spec:
         containers:
         - name: web-container
           image: <web-image-url>
           ports:
           - containerPort: 8080
         - name: api-container
           image: <api-image-url>
           ports:
           - containerPort: 60818
  2. deployment.yaml 적용

    kubectl apply -f deployment.yaml
  3. Pod 확인

    kubectl get pods

    반영 후 확인해보면, Deployment가 적용되어 Pod가 정상적으로 생성된 것을 확인할 수 있습니다.

    [ec2-user@ip-<public-ip> k8s]$ kubectl get pods
    NAME                                  READY   STATUS    RESTARTS   AGE
    web-api-deployment-574b5549fd-cszf8   2/2     Running   0          68s

6. 서비스 (Service)

EKS에서 서비스(Service)는 Kubernetes 클러스터 내에서 실행되는 파드(Pod)들을 외부나 다른 파드들이 접근할 수 있도록 네트워크 서비스를 제공합니다.
서비스는 주로 클러스터 내부에서의 통신을 관리하며, 파드가 동적으로 변화할 때도 안정적으로 요청을 라우팅할 수 있게 해줍니다.

서비스의 역할

서비스는 파드 간의 네트워크 통신을 효율적이고 안정적으로 관리하는 역할을 합니다.

  • 로드 밸런싱
    : 서비스는 여러 파드로 트래픽을 분산시켜 로드 밸런싱 역할을 합니다.

  • 클러스터 내 통신
    : 클러스터 내에서 다른 파드들이 서비스에 접근할 수 있도록 DNS 이름을 제공합니다.

  • 외부 접근
    : NodePort나 LoadBalancer와 같은 서비스를 통해 외부에서 클러스터로 접근할 수 있습니다.


서비스의 구성

  • 서비스는 주로 ClusterIP, NodePort, LoadBalancer와 같은 유형으로 설정됩니다.
    ClusterIP는 서비스가 클러스터 내부에서만 접근할 수 있도록 하고, NodePort는 클러스터 외부에서 특정 포트를 통해 접근할 수 있게 해줍니다.
    LoadBalancer는 외부 로드 밸런서를 사용하여 클러스터 외부에서 접근할 수 있도록 설정하며, 가장 일반적인 외부 공개 방식이기도 합니다.

EKS 서비스 실습

  1. service.yaml 작성

    apiVersion: v1
    kind: Service
    metadata:
     name: web-api-service
    spec:
     selector:
       app: web-api
     ports:
       - name: web-port
         protocol: TCP
         port: 80
         targetPort: 8080
       - name: api-port
         protocol: TCP
         port: 8081
         targetPort: 60818
     type: LoadBalancer
  2. service.yaml 적용

    kubectl apply -f service.yaml
  3. service 확인

    kubectl get svc

    반영 후 확인해보면, Service가 적용되어 정상적으로 생성된 것을 확인할 수 있습니다.

    [ec2-user@ip-<public-ip> k8s]$ kubectl get svc
    NAME              TYPE           CLUSTER-IP      EXTERNAL-IP                                                                    PORT(S)                       AGE
    kubernetes        ClusterIP      10.100.0.1      <none>                                                                         443/TCP                       23h
    web-api-service   LoadBalancer   10.100.27.247   ad24971795ee44bbb9e42a1d7ad48268-1027712442.ap-northeast-2.elb.amazonaws.com   80:31408/TCP,8081:31927/TCP   10s

7. EKS 서비스 외부 접속 확인

kubectl get svc 명령어로 출력된 EXTERNAL-IP를 통해 외부 URL에서 접속할 수 있습니다. 접속 URL은 http://<EXTERNAL-IP>/<PATH> 형식으로, <PATH>는 프로젝트의 컨텍스트 경로(context path)에 해당합니다.

컨텍스트 경로(context path)를 common/main으로 설정해두었으므로, http:///common/main 으로 접속해보겠습니다.

웹이 잘 뜨는 것을 확인했습니다.

API도 잘 통신하여 데이터가 정상적으로 출력되는 것을 확인할 수 있었습니다.

0개의 댓글