7. 서비스

쿠버네티스 클러스터 안에서 파드의 집합(주로 레플리카세트)에 대한 경로나 서비스 디스커버리(API 주소가 동적으로 바뀌어도 클라이언트가 대상을 바꾸지않고 접근할 수 있음)를 제공하는 리소스이다. 서비스의 대상이 되는 파드는 서비스에서 정의하는 레이블 셀렉터로 정해진다. spec.selector 속성값으로 특정 파트의 레이블값을 설정하여 특정 파드만 접근할 수 있도록 yaml파일을 작성해보자.

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
name: echo
spec:
selector: # 특정 파드만 접근할수 있도록 함.
app: echo
release: summer
ports:
- name: http
port: 80

위의 서비스를 실행하고 컨테이너 안에 존재하는 아무 컨테이너에 들어가서 curl http://echo 를 입력하면 잘 동작하는것을 확인할 수 있다.

1
2
3
4
5
6
7
8
$ kubectl exec -it 파드명 bash

혹은

$ kubectl run -i --rm --tty debug --image=gihyodocker/fundamental:0.1.0 --restart=Never -- bash -il


# curl http://echo

다음명령어를 통해 로그를 summer안에서 생기는 로그를 확인할 수 있다.

1
$ kubeclt logs -f echo-summer-dtblk -c echo

쿠버네티스 클러스터는 서비스명.네임스페이스명.svc.local로 연결해준다.

1
2
3
4
5
6
7
$ curl http://echo.default.svc.local

$ curl http://echo.default
# svc.local 생략가능

$ curl http://echo
# 같은네임스페이스일 경우만 가능

ClusterIP 서비스

서비스의 종류는 여러가지가 있고 기본값은 ClusterIP 서비스이다. ClusterIP를 통해 클러스터 내부 IP 주소에 서비스를 공개할 수 있다.

NodePort 서비스

이는 클러스터 외부에서 접근할 수 있는 서비스이다. ClusterIP를 만든다는 점은 ClusterIP 서비스와 같다. 각 노드에서 서비스 포트로 접속하기 위한 글로벌 포트를 개방하는것이 차이점이다.

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
name: echo
spec:
type: NodePort # 추가함
selector:
app: echo
release: summer
ports:
- name: http
port: 80

다음 명령어를 통해 포트를 알아내고 curl요청을 보낼 수 있다.

1
$ kubectl get svc echo

LoadBalancer 서비스

이는 각 클라우드 플랫폼에서 제공하는 로드밸런서와 연동하기 위해 사용된다.

ExternalName 서비스

이는 셀렉터도 포트 정의도 없는 특이한 서비스다. 쿠버네티스 클러스터에서 외부 호스트를 네임 레졸루션 하기위한 별칭을 제공한다.
아래의 경우 gihyo.jp를 gihyo로 참조할 수 있게해준다.

1
2
3
4
5
6
7
apiVersion: v1
kind: Service
metadata:
name: gihyo
spec:
type: ExternalName # 추가함
externalName: gihyo.jp
Share