만자의 개발일지

[Kubernetes] 서비스(Service) 구성 및 생성하기 본문

Kubernetes

[Kubernetes] 서비스(Service) 구성 및 생성하기

박만자 2022. 7. 20. 09:34

이번 포스팅에서는 YAML 파일로 Service를 구성하고 생성하는 법에 대해 포스팅하도록 하겠습니다.

서비스와 서비스의 유형에 대해서는 아래 글을 참고하시길 바랍니다.

https://yoo11052.tistory.com/189

 

[Kubernetes] Kubernetes Object란

Kubernetes Object 쿠버네티스를 이해하기 위해서는 오브젝트에 대해 제대로 이해하고 넘어가야합니다. 쿠버네티스에서 오브젝트란 쿠버네티스를 구성하는 단위로, 가장 기본적인 구성단위인 기본

yoo11052.tistory.com

https://yoo11052.tistory.com/191

 

[Kubernetes] 서비스(Service)의 유형

서비스(Service)란? 쿠버네티스에서 서비스는 라벨링을 통해 같은 라벨을 가진 Pod를 묶어 단일 엔드포인트를 제공해주는 기능입니다. 클러스터 내부에서 실행되는 Pod들은 언제든지 삭제됬다 생성

yoo11052.tistory.com

 

서비스(Service) 구성하기

서비스를 구성하기 위해서는 porttargetPort에 대한 이해가 필요합니다.

  • port
    • 서비스 쪽에서 열려있는 포트를 의미합니다.
  • targetPort
    • Pod 쪽에서 열려있는 Port를 의미합니다.
    • 서비스로 들어온 트래픽은 해당 파드의 <Cluster 내부 IP>:<targetPort>로 넘어가게 됩니다.

 

Service(ClusterIP)

다음과 같이 Service(ClusterIP)를 구성하였습니다.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ClusterIP
  selector:
    app: myapp
  ports:
    - name: http
      port: 80 # 서비스의 80번 포트로 들어오면
      targetPort: 80 # Pod의 80번 포트로 전달
      protocol: TCP
    - name: https
      port: 443 # 서비스의 443번 포트로 들어오면
      targetPort: 80 # Pod의 80번 포트로 전달
      protocol: TCP

 

ClusterIP의 경우 type이 생략 가능합니다.

spec.selector 섹션을 통해 동일한 라벨을 가지고 있는 Pod들을 해당 서비스로 묶을 수 있습니다. 위 구성을 예시로 들면, app: myapp이라는 라벨을 가지고있는 모든 Pod들은 my-service라는 ClusterIP유형의 서비스의 80, 443 포트로 접근할 수 있게 되는 것입니다.

만약 서비스에 묶인 Pod가 하나가 아니라 여러개라면 서비스는 랜덤으로 Pod에 트래픽을 분산하게 됩니다.

 

Service(NodePort)

다음과 같이 Service(NodePort)를 구성하였습니다.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: myapp
  ports:
    - name: http
      nodePort: 30001 # 노드의 30001번 포트로 들어오면
      port: 80 # 서비스의 80번 포트로 전달하고
      targetPort: 80 # Pod의 80번 포트로 전달 30001(Node) -> 80(Service) -> 80(Pod)
      protocol: TCP

NodePort의 경우는 type을 생략할 수 없으며 ClusterIP와 달리 nodePort를 지정할 수 있습니다.

nodePort를 지정하면 사용자는 <node IP>:<nodePort>로 Pod에 접근할 수 있습니다. 마찬가지로 Pod가 여러개인 경우 랜덤으로 트래픽을 분산하고, nodePort의 포트범위 30000~32767사이이며, 별도로 지정해주지 않을 경우 시스템이 알아서 지정하게됩니다.

 

Service(LoadBalancer)

다음과 같이 Service(LoadBalancer)를 구성하였습니다.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer
  selector:
    app: myapp
  ports:
    - name: http
      port: 80 # 로드밸런서로 트래픽이 들어오면 서비스의 80번 포트로 전달하고
      targetPort: 80 # Pod의 80번 포트로 전달
      protocol: TCP
status: 	   # 프로비저닝된 로드 밸런서 정보
  loadBalancer:
    ingress:
    - ip: 192.0.2.127

 

LoadBalancer의 경우 기본적인 구조는 NodePort와 유사하지만 NodePort와 ClusterIP가 자동으로 생성되고,

status.loadBalancer 섹션을 통해 로드밸런서를 프로비저닝할 수 있습니다.

 

Service(ExternalName)

다음과 같이 Service(ExternalName)를 구성하였습니다.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ExternalName
  externalName: my.service.example.com

ExternalName은 서비스로 들어오는 트래픽을 Pod가아닌 외부 서비스로 전달하기 때문에 spec.selectorspec.ports를  지정해줄 필요가 없습니다. 

spec.externalName에 외부 서비스의 DNS로 지정해주면 서비스로 들어오는 트래픽을 해당 외부 서비스로 포워딩해줍니다.

 

서비스(Service) 생성하기

서비스를 YAML파일로 구성한 뒤 다음 명령어로 서비스를 생성할 수 있습니다. 

$ kubectl apply -f service.yaml
service/my-service created

예시로 nginx 컨테이너가 실행되고있는 Pod와 NodePort 서비스를 생성하였습니다.

Pod생성은 아래글을 참고하시길 바랍니다.

https://yoo11052.tistory.com/190?category=1033876 

 

[Kubernetes] Pod 구성 및 생성하기

이번 포스팅에서는 YAML파일로 Pod를 구성하고 Pod를 생성하는 법에 대해 포스팅하도록 하겠습니다. Pod란? Pod는 쿠버네티스에서 컨테이너의 기본 단위로, 가장 기본적인 배포 단위이며, 1개 이상

yoo11052.tistory.com

 

다음 명령어로 서비스가 생성되었는지 확인합니다.

$ kubectl get svc my-service
NAME         TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
my-service   NodePort   10.104.76.218   <none>        80:30001/TCP   94s

 

노드에 30001번 포트가 할당된것을 보실 수 있습니다.

 

서비스로 접근시 Pod로 트래픽이 잘 전달되는것을 보실 수 있습니다.

localhost:30001

생성된 서비스는 다음 명령어를 통해 삭제할 수 있습니다.

$ kubectl delete svc my-service

 

서비스(Service) 생성 흐름

서비스를 구성하고 생성하는 방법에대해 알아봤으니 이제 서비스를 생성하면 클러스터 내부에서 어떤 동작이 일어나는지 알아보도록 합시다.

https://subicura.com/k8s/guide/service.html

  1. Endpoints Controller가 Service와 Pod를 감시하면서 조건(Selector)에 맞는 Pod의 IP를 수집합니다.
  2. Endpoints Controller가 수집한 IP를 가지고 Endpoints를 생성합니다.
  3. Kube-Proxy는 Endpoints의 변화를 감지하고 노드의 iptables을 설정하여 노드가 해당 서비스 주소로 접근할 수 있도록 만듭니다.
  4. CoreDNS는 Service를 감시하고 서비스 이름과 IP를 CoreDNS에 추가합니다.
CoreDNS란?
CordeDNS는 쿠버네티스 클러스터의 DNS서버 역할을 합니다. Pod, Service의 도메인을 관리하고 외부 도메인 서버와 연결이 필요한 경우 통로역할을 수행합니다.

 

참고

'Kubernetes' 카테고리의 다른 글

[Kubernetes] Deployment란  (1) 2022.12.18
[Kubernetes] Endpoints란  (1) 2022.07.20
[Kubernetes] 서비스(Service)의 유형  (0) 2022.07.19
[Kubernetes] Pod 구성 및 생성하기  (0) 2022.07.19
[Kubernetes] Kubernetes Object란  (1) 2022.07.14
Comments