안녕하세요.
오늘은 쿠버네티스에서 없어선 안될 존재 서비스에 대해 알아보겠습니다.
# 서비스란?
쿠버네티스에서 파드는 언제든지 죽었다가 다시 되살아나고를 반복합니다.
그럴 때마다 IP가 바뀌게됩니다.
그렇기 때문에 유저 입장에서는 직접 접근하기가 어려운데요.
이때 서비스는 여러 파드에 접근할 수 있는 고정된 네트워크 엔드포인트를 제공합니다.
유저가 그 파드들에 접근할 수 있는 정책을 정의하는 추상적 개념입니다.
# 서비스의 종류
ClusterIP
clusterIP는 쿠버네티스 서비스의 기본 설정값으로 클러스터 내부에서만 파드에 접근될 수 있는 유형입니다.
외부에서는 접근이 불가능합니다.
즉, 다른 서버에서 ClusterIP를 이용하여 파드에 접근하는 것은 불가능합니다.
간단하게 디플로이먼트와 ClusterIP를 배포하여 테스트를 해보겠습니다.
먼저 디플로이먼트입니다.
label은 `web-deploy`로 하겠습니다.
label을 통해 서비스와 파드는 매칭되게 되므로 해당 부분은 절대 오타가 나선 안됩니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-test01
spec:
replicas: 3
selector:
matchLabels:
app.kubernetes.io/name: web-deploy
template:
metadata:
labels:
app.kubernetes.io/name: web-deploy
spec:
containers:
- name: nginx
image: nginx:latest
다음은 ClusterIP입니다.
똑같이 `web-deploy` label을 달아줍니다.
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app.kubernetes.io/name: web-deploy
type: ClusterIP
ports:
- protocol: TCP
port: 80
저희가 생성한 ClusterIP를 확인 가능합니다.
ip는 `10.108.65.53` 입니다.
해당 ip를 통해 정말 연결이 되는지 확인해보겠습니다.

앞서 말씀드렸듯이 ClusterIP의 경우 외부에서는 접근이 불가능하기 때문에 테스트용 파드를 하나 더 올려주겠습니다.
아래 명령어를 통해 파드를 하나 올려주겠습니다.
생성됨과 동시에 파드 내부에 접속하게 됩니다.
kubectl run curl-test --rm -it --image=radial/busyboxplus:curl -- sh
아까 생성한 클러스터 IP를 호출하면 바로 nginx가 나오는 것을 확인 가능합니다.

NodePort
앞서 설명드린 ClusterIP의 경우 외부에서 연결은 불가능하다고 말씀드렸습니다.
그러나 NodePort는 특정 포트를 통해 외부 접근을 제공하기 때문에 다른 서버에서도 접근이 가능합니다.
외부 유저는 클러스터가 올라가 있는 노드의 IP : 노드 Port 로 접근이 가능합니다.
바로 생성해 보겠습니다.
디플로이먼트는 아까 생성한 친구를 그대로 활용하겠습니다.
Node Port의 yml 파일입니다.
똑같이 label은 `web-deploy`를 사용합니다.
apiVersion: v1
kind: Service
metadata:
name: web-service-nodeport
spec:
selector:
app.kubernetes.io/name: web-deploy
type: NodePort
ports:
- protocol: TCP
nodePort: 31001
port: 80
targetPort: 80
코드를 보시면 `nodePort`, `port`, 'targetPort` 까지 포트만 총 3개가 있어서 헷갈리실 텐데요.
하나씩 살펴보겠습니다.
먼저 `nodePort`는 말 그대로 노드의 포트입니다.
외부에서 접근할 때 해당 포트를 통해서 접근해야 합니다.
`port`는 서비스의 포트입니다.
서비스에서 사용되는 포트로 파드에 매칭시켜 주는 포트입니다.
`targetPort`는 파드에서 열려있는 포트입니다.
아마 아래 그림을 보시면 쉽게 이해가 가능하실 겁니다.

이제 생성된 노드 포트로 직접 접근해 보겠습니다.
아래와 같이 노드의 Public IP를 통해 정상적으로 접근이 가능합니다.
(참고로 저는 Cloud 환경에 배포된 VM으로 테스트하고 있기 때문에 퍼블릭 IP를 이용한 테스트가 가능하지만 vmware나 virtual box등을 이용하시는 분들은 nat 방식을 이용하여 테스트가 필요합니다.)

Loadbalancer
마지막으로 Loadbalancer 타입에 대해 알아보겠습니다.
클라우드 환경에서 사용되는 서비스 타입으로 외부 로드밸런서를 생성하여 연결합니다.
주로 아래와 같은 형태로 로드밸런서는
AWS에서는 ALB, NLB
Azure에서는 Application Gateway와 Loadbalancer
등 클라우드 네이티브 서비스로 배포가 되고 연결이 됩니다.

다만 클라우드를 사용할 환경이 아닌 분들의 경우 저런 서비스를 이용하는 것이 불가능합니다.
감사합니다.