EKS 클러스터와 노드 그룹을 생성한 상태라면, EC2에서 kubectl을 설치한 후 EKS 클러스터에 연결해야 합니다.
kubectl을 사용하면 동일한 VPC 내 EC2 인스턴스에서 SSH로 접속하여 EKS에 Deployment와 Service를 반영할 수 있습니다.
kubectl은 Kubernetes 클러스터를 관리하는 명령어 도구입니다.
이를 통해 파드(Pod) 생성, 업데이트, 삭제, 서비스 배포 등 다양한 Kubernetes 작업을 수행할 수 있습니다.
쉽게 말해, Kubernetes와 소통하는 리모컨 같은 역할을 합니다.
먼저 접속하려는 EC2 인스턴스에 SSH로 접속해보자.
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
EKS 클러스터와 연결
EKS 클러스터에 대한 인증 정보를 kubeconfig 파일에 추가하여, kubectl 명령어로 EKS 클러스터에 연결할 수 있게 만듭니다.
aws eks --region <Region> update-kubeconfig --name <Cluster>
ECR 로그인
ECR에 이미 업로드된 두 개의 이미지를 사용할 예정이므로, ECR에 로그인해야 합니다.
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
EKS에서 디플로이먼트(Deployment)는 Kubernetes 애플리케이션을 관리하고 배포하는 방법입니다. 디플로이먼트를 사용하면 애플리케이션을 파드 형태로 배포하고, 지정된 개수만큼 자동으로 실행되며, 버전 업데이트나 롤백도 쉽게 할 수 있습니다. 즉, 애플리케이션 배포와 관리를 효율적으로 지원하는 중요한 리소스입니다.
애플리케이션 배포
: 애플리케이션을 자동으로 파드로 배포하고 관리합니다.
스케일링
: 파드 수를 자동으로 조정하여 애플리케이션을 확장하거나 축소합니다.
업데이트 및 롤백
: 애플리케이션을 안전하게 업데이트하고 필요시 롤백할 수 있습니다.
고가용성 유지
: 파드 실패 시 자동으로 새로운 파드를 생성하여 서비스 중단을 방지합니다.
파드 수 (replicas)
: 실행할 파드 개수 설정
컨테이너 이미지
: 배포할 애플리케이션 이미지 설정
롤링 업데이트 전략
: 서비스 중단 없이 점진적으로 업데이트
노드그룹에서 생성한 노드(EC2 인스턴스)에 하나의 파드로 web과 api 두 개의 컨테이너를 실행하며, ECR에 업로드한 web 이미지와 api 이미지를 사용합니다.
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
deployment.yaml 적용
kubectl apply -f deployment.yaml
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
EKS에서 서비스(Service)는 Kubernetes 클러스터 내에서 실행되는 파드(Pod)들을 외부나 다른 파드들이 접근할 수 있도록 네트워크 서비스를 제공합니다.
서비스는 주로 클러스터 내부에서의 통신을 관리하며, 파드가 동적으로 변화할 때도 안정적으로 요청을 라우팅할 수 있게 해줍니다.
서비스는 파드 간의 네트워크 통신을 효율적이고 안정적으로 관리하는 역할을 합니다.
로드 밸런싱
: 서비스는 여러 파드로 트래픽을 분산시켜 로드 밸런싱 역할을 합니다.
클러스터 내 통신
: 클러스터 내에서 다른 파드들이 서비스에 접근할 수 있도록 DNS 이름을 제공합니다.
외부 접근
: NodePort나 LoadBalancer와 같은 서비스를 통해 외부에서 클러스터로 접근할 수 있습니다.
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
service.yaml 적용
kubectl apply -f service.yaml
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
kubectl get svc 명령어로 출력된 EXTERNAL-IP를 통해 외부 URL에서 접속할 수 있습니다. 접속 URL은 http://<EXTERNAL-IP>/<PATH> 형식으로, <PATH>는 프로젝트의 컨텍스트 경로(context path)에 해당합니다.
컨텍스트 경로(context path)를 common/main으로 설정해두었으므로, http:///common/main 으로 접속해보겠습니다.
웹이 잘 뜨는 것을 확인했습니다.

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