k8s > GCE를 이용해서 설치하기(6) - Service, Service Type
우선 글을 작성하기 전에 GCE 위에서 쿠버네티스를 설치하는 실습은 이번 포스팅까지임을 말씀드립니다.
Ingress까지 공부를 진행하였으나 GCP에서 부하분산을 지원하기도하고
슬슬 GKE를 이용해서 프로젝트를 진행하고 싶어 다음 포스팅 부터는 GKE 관련 포스팅이 될 것입니다.
실습 위주로 진행된 부분이 많아 내용정리에 부족한 부분들은 별도로 추가 포스팅을 진행할 계획입니다.
Service
서비스에 대해서 다시 한번 짚고 넘어갑니다~
서비스는 파드 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법이라고 한다.
서비스가 대상으로 하는 파드의 집합은 일반적으로 셀렉터가 결정합니다. => 셀렉터를 맞춰준 이유!
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
pori: nginx
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: NodePort
nginx 서비스 코드를 예시로 뜯어보겠습니다.
프로토콜을 TCP를 사용하고, 파드의 9376번 포트를 대상으로하는 서비스를 만든다면 위와 같이 생성 가능합니다.
서비스의 이름은 my-service가 될것이고 서비스의 80번 포트로 연결될 것입니다.
Docs의 아래에 재미있는 코드가 하나 더 있습니다. 바로 Pod의 컨테이너 포트에 이름을 생성해주고 서비스에서 타겟포트를 해당 이름으로 지원하는 방법입니다.
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
---
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
Kind를 잘 봐주세요!!
위쪽은 Pod의 정의 입니다. spec > containers > ports > name을 보면 해당 포트에 이름을 지정해둔 것을 확인 가능합니다.
아래의 Service의 targetPort를 보면 원하는 Pod의 포트 이름으로 연결한 것을 확인 가능합니다.
Service type
- ClusterIP: 클러스터 내부에서만 접근할 수 있는 IP를 할당한다.
- NodePort: 노드의 특정 포트를 사용해서 접근하는 방법이다. 포트당 하나의 서비스만 사용가능하다고 한다.
- LoadBalancer: 노드포트의 앞에 특정 LoadBalancer를 사용해서 접근한다.
- ExternalName: DNS이름에 대한 서비스를 매핑한다.
NodePort
사용할 NodePort에 대해서 조금 더 알아보겠다.
NodePort는 특정 포트를 사용해서 접근을 허용합니다.
--service-node-port-range 플래그로 지정된 범위에서 포트를 할당한다. (3000~32767 범위의 포트를 사용한다.)
(뭔가 오버라이딩이 될것만 같은 형태..)
서비스는 할당된 포트를 .spec.ports[*].nodePort필드에 나타낸다고한다.
실습
우선 디플로이먼트로 파드를 생성해준다. 서비스가 대상으로하는 파드의 집합은 셀렉터에서 가져오니까 셀렉터를 잘 기억해두겠습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx # 이거는 pod에 영향을 주지 않는다.
spec:
replicas: 2
selector:
matchLabels:
pori: nginx # MatchLable의 값이 아래의 metadata의 labels와 동일한 값이여야 동작
template:
metadata:
labels:
pori: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
네 지난 실습코드와 동일합니다! 여기서 selector의 matchLabes를 기억하면 pori:nginx입니다.
그럼 이제 service를 만들면
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
pori: nginx
ports:
- protocol: TCP
nodePort: 31299
port: 80
targetPort: 80
type: NodePort
31299번 포트를 지정해서 사용할것이기 때문에 다음과 같이 작성했습니다.
spec > selector를 보면 우리가 위에서 지정한 라벨을 똑같이 적용함을 알 수 있습니다.
이렇게 서비스로 연결된 파드는 worker1, worker2가되고 GCE의 외부IP와 열어둔 포트를 이용해서 접근하면?
정상적으로 접근이 가능한 것을 확인 가능합니다.