1편 : 쿠버네티스 시작하기 1편
2편 : 쿠버네티스 시작하기 2편
이전 편에서 쿠버네티스 구성과, deployment 에 대해 알아보았다.
이번 편에서는 쿠버네티스에서 어떻게 pod 의 어플리케이션을 실행하는지 확인해보자.
예를 들어 백엔드의 API 를 제공하는 서비스가 존재하고, 프론트엔드가 작업한 서비스는 백엔드 API 서비스를 호출해야 한다고 가정하자.
백엔드가 제공하는 서비스의 ip 주소를 host 로 호출하면 정상적으로 사용 할 수 있을 것이다.
매우매우 일반적인 사용 방법이다.
하지만 클라우드 환경에서는 각 서비스의 ip 주소가 변경될 수 있고 이때마다 클라이언트가 host ip 를 변경해 줄 수는 없다.
mas 환경에서는 이 상황을 해결하기 위해 "서비스 디스커버리" 를 사용한다.
쿠버네티스에서는 이런 서비스 디스커버리를 사용하지 않고, 자체적으로 각 pod 에 고유한 내부 ip 를 부여하고 이 pod 집하에 대해 단일 DNS 를 제공함으로써 로드벨런싱이 이루어 질 수 있도록 한다.
즉, 쿠버네티스 service 를 통해 클라이언트는 백엔드 pod 의 ip 가 변경되거나 상태가 변경됨에 상관 없이 다른 pod 집합을 호출할 수 있는 것이다.
이렇게 디커플링이 이루어진다.
일전에 작성했던 nginx pod를 실행시키는 yml 파일이다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app.kubernetes.io/name: proxy
spec:
containers:
- name: nginx
image: nginx:stable
ports:
- containerPort: 80
name: http-web-svc
// kubectl apply -f {yml파일}
// pod
NAME READY STATUS RESTARTS AGE
pod/nginx 1/1 ContainerCreating 0 6s
// service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
이 nignx pod 를 호출하기 위한 service 를 작성해본다.
service 는 pod 생성 yml 아래 붙인다.
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app.kubernetes.io/name: proxy
ports:
- name: name-of-service-port
protocol: TCP
port: 80
targetPort: http-web-svc
이 서비스의 내용은 이렇다.
1. app.kubernetes.io/name: proxy 라는 레이블을 가진 pod 에서 port 가 80인 pod 를 select 한다.
2. 쿠버네티스는 이 서비스가 해당 레이블을 가진 pod 를 지속적으로 탐색하도록 한다.
그리고 다시 pod 를 실행해본다면 service 가 생성되었을 것이다.
// pod
NAME READY STATUS RESTARTS AGE
pod/nginx 1/1 ContainerCreating 0 6s
// service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-service ClusterIP 10.102.128.241 <none> 80/TCP 5s
이렇게 쿠버네티스가 service 를 사용해 pod 간 통신 하는 방법을 알아보았다. 생각보다 간단하지만 이 내용은 단순 기초일뿐 더 많은 옵션과 방법이 존재하니 아래 쿠버네티스 공홈을 참고하자.
https://kubernetes.io/ko/docs/concepts/services-networking/service/