베하~!
안녕하세요 여러분! 블랙아웃입니다.
저희는 최근 EKS에 대해 짧게 공부해보았는데요!
오늘은 EKS에서 사용되는 서비스 타입 4가지에 대해 알아보고 실습 해보도록 하겠습니다~!
다들 아시다시피 파드는 생성될 때마다 IP가 계속해서 바뀌는데요.
이러한 파드에 탑재된 애플리케이션이 외부와 상호 통신할 수 있도록 해주는 것이 바로 서비스(Service)입니다.
오늘은 이 서비스 타입 4가지에 대해 알아보고, 직접 yaml 파일을 생성해서 서비스를 만들어보도록 하겠습니다!
먼저 Service Type에는 크게 4가지의 유형이 있습니다.
- ClusterIP
- NodePort
- LoadBalancer
- ExternalName
각각 하나씩 살펴 보도록 하겠습니다.
1. Cluster IP
- 같은 label을 가진(Selector로 지정) pod의 엔드포인트를 묶어서 단일 진입점을 제공해주는 역할을 하는 서비스입니다.
- Etcd에서 같은 Label을 가지는 Pod를 묶어서 하나의 Virtual IP 를 만들고, 클러스터 내에서 이 IP와 포트를 사용하여 서비스로 접근이 가능합니다.
- 클러스터 내부에서만 사용이 가능하기 때문에, 클러스터 외부에서는 ClusterIP에 접근할 수 없습니다.
ClusterIP를 만드는 Yaml 파일입니다.
apiVersion: v1
kind: Service
metadata:
name: svc-clusterip
spec:
type: ClusterIP # type을 생략해도 기본적으로 clusterIP로 생성
selector: # 파드를 만들 때 지정해둔 레이블을 선택해서
app: web # 같은 레이블을 가진 파드를 만들어 단일 진입점인 clusterIP를 생성해 줍니다.
ports:
- protocol: TCP
port: 80 # 사용자가 접속하는 포트 (웹서버라면 80)
targetPort: 80 # 서비스와 파드를 연결하는 포트
kubectl apply -f svc-clusterip.yaml
kubectl get svc -o wide 를 통해 저희가 만든 ‘svc-clusterip’가 잘 만들어 진 것을 확인할 수 있습니다.
curl 'clusterIP'를 해보면 외부에서 접근이 안되는 것을 확인할 수 있습니다.
2. NodePort
- 해당 ClusterIP로 연결되어 있는 pod에 외부 접속이 가능하도록 포트를 열어주는 역할을 하는 서비스입니다.
- NodePort 서비스를 사용하면 외부에서 클러스터로 연결하기 위해 노드의 IP 주소와 포트 번호를 사용하여 접근이 가능합니다.
- 30000 이상 번호로 포트 예약이 가능하고, 예를 들어, 30001번으로 NodePort를 생성하게 되면 모든 노드에 30001번 포트가 열리게 되는 구조입니다.
NodePort를 만드는 Yaml 파일입니다.
apiVersion: v1
kind: Service
metadata:
name: svc-nodeport
spec:
type: NodePort
selector:
app: web
ports:
- port: 80
protocol: TCP
targetPort: 80
nodePort: 30123 #노드1과 노드2 모두에 30123 포트가 열리게 됩니다.
kubectl apply -f svc-nodeport.yaml
curl ‘node1의 privateIP:포트번호’를 하게 되면 해당 서비스에 엮여 있는 파드들이 차례대로 호출되는 것을 확인할 수 있습니다.
3. LoadBalancer
- AWS나 Azure, GCP처럼 클라우드 공급자의 로드밸런서를 자동으로 프로비저닝하는 서비스입니다.
- 저희는 AWS에 제공하는 EKS를 사용하는 만큼 LoadBalancer 서비스를 사용하게 되면 ELB가 생성되게 됩니다.
- 실제 로드밸런서(AWS ELB)의 포트와 NodePort에 열려 있는 포트를 연결해 주는 작업을 하게 됩니다.
- AWS의 경우 기본적으로 CLB가 생성이 되지만, Annotation을 활용하면 NLB도 생성이 가능합니다.
- 자동으로 쿠버네티스 클러스터 내부의 파드를 대상으로 로드 밸런서를 프로비저닝하기 때문에 이 로드밸런서를 통해서 클러스터 외부에서 서비스로 액세스가 가능합니다.
AWS에서 NLB를 만드는 Yaml 파일입니다.
apiVersion: v1
kind: Service
metadata:
name: svc-nlb
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: "nlb" #nlb를 만드는 annotation 추가
spec:
type: LoadBalancer
selector:
app: web
ports:
- protocol: TCP
port: 80 # 사용자가 접속하는 포트
targetPort: 80 # 서비스와 파드를 연결하는 포트
NLB가 다 만들어진 후에 curl NLB를 해보면 묶여있는 파드들이 로드밸런싱 되어 호출되는 것을 확인하실 수 있습니다!
'LoadBalancer' 서비스 타입은 실제 CSP의 로드밸런서를 직접 만드는 것이기 때문에
해당 Yaml 파일로 NLB를 만들게 되면 AWS 콘솔 화면에서도 nlb가 생성된 것을 확인하실 수 있습니다!
4. ExternalName
- 클러스터 안에서 사용하는 도메인입니다.
- 서비스를 생성하면, 쿠버네티스는 서비스의 CNAME 레코드를 생성하게 됩니다. 그래서 클러스터 내부에서 서비스를 찾을 때, 이 CNAME 레코드를 사용하여 외부 서비스와 통신하게 되는 것이죠.
- 즉, 클러스터 안에서 외부로 접속할 때 사용할 도메인을 ExternalName에 등록해서 사용하는 구조입니다.
EKS에서 ExternalName 서비스를 생성하는 Yaml 파일입니다.
apiVersion: v1
kind: Service
metadata:
name: svc-externalname
spec:
type: ExternalName
externalName: example.com
여기까지 Service Type 4가지의 개념을 보고 직접 생성도 해보았는데요.
글로만 읽는 것과 간단하지만 직접 만들어보면서 이해하는 것은 큰 차이가 있다고 생각합니다.
그러니 여러분들도 함께 따라하시면서 EKS Service Type을 더 잘 이해하셨으면 좋겠습니다!
그럼 다음에 만나요
베빠~!
'CSP (Cloud Service Provider) > AWS' 카테고리의 다른 글
[AWS] Storage Gateway (0) | 2023.05.22 |
---|---|
[EFS를 활용한 WEB/WAS 서비스 (1) | 2023.05.21 |
[AWS] KMS의 활용 (2) | 2023.05.20 |
S3 로그를 Lambda를 통해 CLoud watch로 전송 (0) | 2023.05.19 |
[AWS] System Manager Patch Manager을 통한 인스턴스 자동업데이트 구성 (1) | 2023.05.19 |
댓글