볞묞 바로가Ʞ

Container/Kubernetes

[Kubernetes] 파드륌 왞부로 녞출하Ʞ: 서비슀(Service)

반응형

🔊 핎당 포슀팅은 ì‹œìž‘하섞요! 도컀/쿠버넀티슀 ì„œì ì„ 읜고 개읞적읞 목적 하에 작성되는 Ꞁ입니닀. 포슀팅에 사용되는 몚든 자료는 제가 직접 재구성하였음을 알늜니닀.
 

Kubernetes


읎번 포슀팅에서는 저번 포슀팅에서 소개한 쿠버넀티슀 Ʞ쎈 개념에 포핚되는 서비슀(Service)띌는 였람젝튞에 대핎서 알아볞닀. 저번 포슀팅 마지막에 배욎 디플로읎뚌튞띌는 였람젝튞륌 활용하멎 동음한 역할을 하는 파드 여러개륌 한 번에 생성하거나 삭제하고, 파드의 생애죌Ʞ까지 ꎀ늬핎죌는 등 손쉜게 레플늬칎셋(파드듀의 몚음)을 ꎀ늬할 수 있었닀. 하지만 디플로읎뚌튞가 수행하지 못하는 것읎 한 가지 있는데, 왞부(왞부띌 핚은 로컬 또는 쿠버넀티슀 큎러슀터의 왞부)에서 파드로 접귌읎 불가능한 것읎닀. 읎륌 가능하도록 하Ʞ 위핎서 서비슀띌는 였람젝튞륌 별도로 생성핎죌얎알 하는데, 읎번 시간에는 읎 서비슀띌는 것에 대핎서 배워볎도록 하자.

1. 왞부에서도 파드에 접귌을 가능하게 하는 였람젝튞, 서비슀!

저번 포슀팅에서 파드, 레플늬칎셋을 ë°°ìš°ë©Žì„œ 작성한 YAML 파음을 볎멎 파드 템플늿 영역에서 파드의 애플늬쌀읎션읎 사용할 포튞번혞륌 containerPort 띌는 항목윌로 정의핎죌었닀. 하지만 읎것을 정의핎죌었닀고 í•Žì„œ 왞부에서도 핎당 파드로 접귌읎 가능하닀는 것은 아니닀. 읎륌 위핎 서비슀띌는 였람젝튞는 파드에 접귌하Ʞ 위한 규칙을 정의하게 된닀. 서비슀에는 많은 Ʞ능읎 있지만, 핵심 Ʞ능만 엎거핎볎멎 아래와 같닀.

 

  • 여러 개의 동음한 역할을 하는 파드에 쉜게 접귌읎 가능하도록 고유한 도메읞 읎늄을 부여
  • 여러 개의 동음한 역할을 하는 파드에 접귌할 때, 요청을 분산하는 로드 밞런서 Ʞ능을 수행
  • 큎띌우드 플랫폌의 로드 밞런서, 큎러슀터 녞드의 포튞 등을 통핎 파드륌 왞부로 녞출

위에서 ì—Žê±°í•œ Ʞ능 왞에 서비슀는 더 닀양한 Ʞ능을 갖고 있지만, 지ꞈ은 위 3가지 Ʞ능만 알아두도록 하자. ì°žê³ ë¡œ 서비슀륌 사용하지 않고도 큎러슀터 낎부의 파드듀 간에 통신읎 가능한 것은 처음에 쿠버넀티슀 섀치할 때 같읎 섀치한 calico 같은 넀튞워크 플러귞읞 덕분읎닀. 읎 calico가 자동윌로 였버레읎 넀튞워크륌 적용하여 서로 닀륞 녞드듀의 파드 간에 통신읎 가능한 것읎닀. 읎는 도컀 슀웜때와 비슷하닀.

 

서비슀에는 종류가 몇 가지 있닀. 귞래서 서비슀륌 정의할 때 섀정하는 서비슀 종류에 따띌 파드륌 왞부에 녞출시킬 수 있고 없고가 달띌진닀. 읎에 대핮 하나씩 알아볎도록 하자. 우선은 파드랑 서비슀륌 연결핎볎Ʞ 위핎, 아래 낎용의 YAML 파음로 디플로읎뚌튞륌 생성핎볎자. 파드 생성 시 사용하는 읎믞지는 파드의 혞슀튞 읎늄을 반환하도록 직접 제작안 책 저자분의 컀슀텀 읎믞지읎닀.

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: zedd-hostname-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webserver
  template:
    metadata:
      name: zedd-webserver
      labels:
        app: webserver
    spec:
      containers:
      - name:  zedd-webserver-pod
        image: alicek106/rr-test:echo-hostname
        ports:
        - containerPort: 80

 

귞러멎 읎제 서비슀의 종류에 대핮 하나씩 짚얎볎자.

2. 쿠버넀티슀 낎부에서만 접귌읎 가능한 서비슀, ClusterIP 유형

ClusterIP는 읎늄에서 느낄 수 있는 것처럌 쿠버넀티슀 큎러슀터 낎부에서만 파드듀에 접귌할 때 사용하는 서비슀 유형읎닀. 귞러멎 ClusterIP 유형의 서비슀륌 섀정하Ʞ 위한 YAML 파음을 삎펎볎자.

 

apiVersion: v1
kind: Service
metadata:
  name: zedd-hostname-svc-clusterip
spec:
  ports:
  - name: web-port
    port: 8080
    targetPort: 80
  selector:
    app: webserver
  type: ClusterIP

 

서비슀륌 배포할 때도 kubectl apply 명령얎륌 동음하게 사용하멎 된닀. 읎제 위 YAML 파음 낎용의 각 항목을 삎펎볎자.

 

  • spec.selector : 핎당 서비슀에서 ì–Žë– í•œ 띌벚을 갖는 파드에 접귌할 수 있게 만듀 것읞지 결정한닀. 여Ʞ서 '띌벚'읎띌는 것은 저번 포슀팅에서 배욎 레플늬칎셋곌 파드 간의 연결을 수행하는 슉 파드 템플늿 낎에 정의하는 LabelSelector륌 의믞한닀.
  • spec.ports.port : 생성된 서비슀는 쿠버넀티슀 낎부에서만 사용할 수 있는 고유한 IP(ClusterIP 띌고 부늄)륌 할당 받는데, port 항목에는 ê·ž 고유한 IP에 접귌할 때 사용할 포튞번혞륌 섀정한닀.
  • spec.ports.targetPort : 위에서 디플로읎뚌튞륌 배포할 때 적용한 YAML 파음 슉, 파드 템플늿 낎에서 정의한 파드가 사용할 포튞 슉, containerPort 항목에 섀정된 포튞번혞와 동음핎알 한닀.

 

서비슀륌 잘 생성했닀멎, 아래 명령얎로 생성된 서비슀 목록을 출력핎볎자.

 

 

귞런데 우늬가 직접 생성하지 않은 kubernetes 띌는 읎늄의 서비슀가 졎재하는 것을 볌 수 있닀. 읎것도 ClusterIP 유형읞 것을 알 수 있닀. 읎 서비슀는 파드 낎에서 쿠버넀티슀의 API에 접귌하Ʞ 위한 서비슀륌 의믞한닀. 지ꞈ 상황에서는 쀑요한 낎용읎 아니니 슀킵하자.

 

귞러멎 우늬가 생성한 ClusterIP 서비슀륌 활용핎서 파드에 접귌하는 방법에 대핮 알아볎자. 방법은 간닚하닀. 위 출력화멎에서 CLUSTER-IP 와 PORT(S) 항목에 명시되얎 있는 값듀을 읎용핎서 요청을 하멎 된닀. 닀륞 워컀 녞드로 접속핎서 핎당 "IP:포튞번혞" 형태로 요청을 볎낎볎자.

 

 

curl 요청을 볎냈을 때, 늬턎되는 response륌 볎멎 파드의 고유한 읎늄읎 늬턎된 것을 볌 수 있닀. 읎는 아까 위에서 디플로읎뚌튞륌 생성할 때 같읎 생성된 파드듀읎닀. 싀제로 마슀터 녞드로 읎동애서 파드 목록을 출력핎볎멎 읎늄읎 동음한 것을 알 수 있닀.

 

 

또 한 가지 삎펎볌 것은 curl 로 요청을 볎낌 때마닀 response 되는 파드의 읎늄읎 맀번 달띌지는 것을 알 수 있닀. 슉, 서비슀와 연결된 여러 개의 파드에 자동윌로 요청읎 분산되는 것읎닀. 읎는 서비슀륌 생성할 때 별도의 섀정을 하지 않아도 서비슀는 연결된 파드듀에 대핮 로드 밞런싱을 수행한닀. 

 

귞늬고 위에서는 IP 및 포튞번혞로 요청을 볎냈지만, 생성한 ClusterIP 서비슀 읎늄 자첎만윌로도 접귌할 수 있닀. 읎것읎 가능한 읎유는 쿠버넀티슀 낎부적윌로 DNS륌 구동하고 있고, 파드듀은 자동윌로 읎 DNS륌 사용하도록 섀정되Ʞ 때묞읎닀. 구첎적윌로는 CoreDNS 서버륌 읎용하는데, 죌의할 점은 서비슀 읎늄윌로 접귌하렀멎 특정 파드 낎부에서 요청을 볎낌 때만 가능하닀. 만앜 혞슀튞 환겜에서 테슀튞한닀멎 서비슀 읎늄윌로는 접귌읎 불가능하고 서비슀의 ClusterIP 죌소로만 접귌읎 가능하닀.(저자분 Q&A)

3. 파드륌 왞부에 녞출하는 서비슀, NodePort 유형

읎번에는 큎러슀터 왞부에서도 파드에 접귌할 수 있는 NodePort 유형의 서비슀에 대핮 배워볎자. NodePort 서비슀는 몚든 녞드의 특정 포튞륌 개방핎 서비슀에 접귌하는 방식읎닀. NodePort 유형의 서비슀륌 정의하는 YAML 파음 낎용은 아래와 같닀. ClusterIP 음 때의 YAML 파음 낎용곌 거의 동음하고, type 항목만 달띌진닀.

 

apiVersion: v1
kind: Service
metadata:
  name: zedd-hostname-svc-nodeport
spec:
  ports:
  - name: web-port
    port: 8080
    targetPort: 80
  selector:
    app: webserver
  type: NodePort

 

위 파음 낎용을 작성하고 NodePort 서비슀륌 생성핎볎도록 하자.

 

 

생성한 NodePort 서비슀륌 출력핎볎자. 죌목할 부분은 PORT(S) 항목에 31033 읎띌는 포튞번혞가 추가되었닀. 읎는 몚든 녞드에서 동음하게 접귌할 수 있는 포튞륌 의믞한닀. 슉, 큎러슀터의 몚든 녞드에서 낎부 IP 또는 왞부 IP륌 통핎 31033 포튞로 접귌하멎 동음한 서비슀에 연결읎 가능하닀. 싀제로, 몚든 녞드에서도 접귌읎 가능한지 삎펎볎자. 우선 녞드의 낎부 IP가 묎엇읞지부터 삎펎볎자.

 

 

읎제 각 녞드의 낎부 IP 번혞와 포튞번혞 31033을 ê²°í•©í•Žì„œ 요청을 날렀볎자. 잘 응답읎 되고 있닀.

 

 

만앜 GKE나 EKS륌 쓰고 섀정을 한 것읎띌멎 각 녞드의 랜덀한 포튞에 접귌하Ʞ 위핎 별도의 방화벜 섀정을 추가핎죌얎알 한닀. 읎는 책 낎용의 322페읎지륌 찞고하자. 

 

위 YAML 예시에서는 몚든 녞드에 공통적윌로 개방할 포튞 번혞륌 랜덀윌로 섀정하도록 했지만, 읎것도 명시적윌로 섀정할 수 있닀. YAML 파음 낮 spec.ports.nodePort 항목에 별도로 명시핎죌멎 된닀. 

 

귞런데, NodePort 유형의 서비슀여도 CLUSTER-IP 항목에 낎부 IP가 할당되얎 있는 것을 볌 수 있닀. 읎는 NodePort 서비슀가 ClusterIP의 Ʞ능을 포핚하고 있Ʞ 때묞읎닀. 귞래서 NodePort 서비슀륌 사용하멎 낎부 넀튞워크와 왞부 넀튞워크 양쪜에서 접귌읎 가능핎지는 것읎닀. 

 

귞런데 싀제로 욎영 환겜에서 NodePort 서비슀륌 왞부에 제공하는 겜우는 많지 ì•Šë‹€. 왜냐하멎 NodePort에서 포튞번혞륌 80 또는 443윌로 섀정하Ʞ에는 적절지 않윌며 SSL 읞슝 서 적용, 띌우팅 등곌 같은 복잡한 섀정을 NodePort 서비슀에 적용하Ʞ가 얎렵Ʞ 때묞읎닀. 따띌서, NodePort 서비슀 ê·ž 자첎륌 통핎 서비슀륌 왞부로 제공하Ʞ볎닀는 읞귞레슀(Ingress)띌고 부륎는 쿠버넀티슀의 였람젝튞에서 간접적윌로 사용되는 겜우가 많닀. 읞귞레슀에 대핎서는 추후에 ë°°ìšž 예정읎지만, 여Ʞ서는 '왞부 request 요청을 싀제로 받아듀읎는 ꎀ묞'윌로만 개념적윌로 읎핎핎두자. 읞귞레슀 였람젝튞는 아래에서 ë°°ìšž LoadBalancer 와 NodePort륌 합쳐서 사용할 수 있닀.

4. 큎띌우드 플랫폌의 로드 밞런서랑 연동읎 가능한 서비슀, LoadBalancer 유형

닀음은 서비슀 생성곌 동시에 로드 밞런서륌 새롭게 생성핎 파드와 연결하는 서비슀읎닀. NodePort 서비슀륌 사용하멎 각 녞드의 IP륌 알아알만 파드에 접귌읎 가능했지만, 읎번에 ë°°ìšž LoadBalancer 유형의 서비슀는 큎띌우드 플랫폌윌로부터 도메읞 읎늄곌 IP륌 할당 받는닀. 큎띌우드 플랫폌에 의졎하닀 볎니 반드시 로드 밞런서륌 동적윌로 생성하는 Ʞ능을 제공하는 GCP, AWS와 같은 큎띌우드 플랫폌 환겜에서만 사용할 수가 있닀. 묌론 옚프레믞슀 환겜에서도 MetaLB띌는 였픈소슀 프로젝튞륌 읎용할 수도 있ꞎ 하지만 MetalLB는 쿠버넀티슀의 공식 프로젝튞가 아니띌서 유지볎수가 지속적읎지 않을 수 있닀는 점을 유의핎알 한닀. 필자도 GKE, EKS륌 사용하는 환겜읎 아니Ʞ 때묞에 LoadBalancer 서비슀륌 사용하는 방법은 책 원볞 낎용을 찞고하도록 하자. 여Ʞ에서는 생략하도록 하겠닀.

4-1. 튞래픜 분배 방식을 결정하는 속성, externalTrafficPolicy

대신 여Ʞ서는 LoadBalancer 서비슀륌 사용하게 됚윌로썚 튞래픜을 분배하는 정책을 결정하는 속성 값에 대핮 배워볎렀고 한닀. 바로 externalTrafficPolicy 띌는 속성값읎닀. 속성 값에 대핮 ë°°ìš°êž° 전에 LoadBalancer 유형의 서비슀륌 읎용했을 때, 왞부로부터 듀얎옚 튞래픜을 얎떻게 각 녾드, 각 파드에 분산시킀는지부터 알아볎자. 아래 귞늌을 볎자.

 

 

우늬가 죌목할 부분은 워컀 녾드 1 슉, Node 1로 듀얎옚 왞부 튞래픜 요청읎 (1)번 룚튞륌 타지 않고 굳읎 (2)번 룚튞륌 타는 방식읎닀. 읎렇게 되멎 불필요한 넀튞워크 홉(넀튞워크 홉읎란)읎 한 닚계 더 발생하게 되고 녾드 간의 늬닀읎렉튞가 발생하게 되얎 튞래픜의 출발지 죌소가 바뀌는 SNAT(SNAT읎란)가 발생하게 된닀. 읎렇게 되멎 큎띌읎얞튞의 IP 죌소 또한 볎졎되지 않는 묞제가 발생한닀.

 

읎러한 튞래픜 분배 방식을 변겜하Ʞ 위핎 우늬는 서비슀 생성 시 섀정하는 YAML 파음에서 externalTrafficPolicy 항목을 정의할 수 있닀. 우선 위와 같읎 Ʞ볞적윌로 섀정되얎 있는 방식은 Cluster 띌는 방식읎닀. 하지만 읎륌 Local 로 변겜하멎 파드가 생성된 녞드에서만 파드로 접귌할 수 있게 된닀. 닀시 말핮, 위 예시로 듀멎, Node 1로 듀얎였게 된 요청듀은 몚두 Node 1 낎의 파드듀에게만 요청읎 가도록 강제하는 것읎닀. 읎렇게 하멎 당연히 Cluster 방식에서 발생되었던 여러가지 묞제듀읎 발생하지 않게 된닀.

 

하지만 읎러한 Local 방식읎 묎조걎적윌로 좋은 것은 아니닀. 만앜 각 녞드에 파드가 고륎지 않게 슀쌀쥎링 되었닀멎 요청읎 고륎게 분산되지 않게 되얎 각 파드가 받는 부하의 양읎 동음핎지지 않는닀. 슉, ì–Žë–€ 파드는 많은 양의 부하륌 받게 되고, 닀륞 파드는 상대적윌로 적은 양의 부하륌 받게 된닀. 아래처럌 말읎닀.

 

 

위 귞늌처럌 되멎 워컀 녾드 3에있는 파드만 유음하게 튞래픜의 50% 부하륌 받게 된닀. 읎렇게 되멎 자원 활용률 잡멎에서 부적절하닀. 읎렇게 Local 방식도 닚점읎 졎재하Ʞ 때묞에 튞래픜 분배 방식 쀑에 정답은 없닀. 각 상황에서 ì–Žë–€ 요소륌 더 쀑요하게 고렀하는지에 따띌 튞래픜 분배 방식을 결정하는 것읎 좋닀.

5. 파드가 왞부 시슀템곌 연결되도록 하는 서비슀, ExternalName 유형

닀음윌로 알아볌 서비슀 유형은 쿠버넀티슀륌 왞부 시슀템곌 연동핎알 할 때 사용하는 ExternalName 서비슀읎닀. 읎 서비슀륌 생성하멎 서비슀가 왞부 도메읞을 가늬킀도록 섀정할 수 있닀. 예륌 듀얎, 아래와 같은 YAML 파음읎 있닀고 가정핎볎자.

 

apiVersion: v1
kind: Service
metadata:
  name: externalname-svc
spec:
  type: ExternalName
  externalName: my.database.com

 

위 파음로 서비슀륌 생성하게 되멎 파드듀은 externalname-svc 띌는 읎늄윌로 요청을 볎낌 겜우, 쿠버넀티슀의 낎부 DNS가 my.database.com윌로 접귌할 수 있도록 CNAME 레윔드륌 반환한닀. 닀시 말핮, 파드가 externalname-svc로 ìš”청을 볎낎멎 my.database.com에 접귌하게 된닀는 것읎닀. 읎는 쿠버넀티슀 파드가 Ʞ졎에 우늬가 사용하던 왞부 시슀템에 접귌핎알 하는 상황에 맀우 유용하게 사용할 수 있닀.

 

귞런데 방ꞈ CNAME 레윔드륌 반환한닀고 했는데, CNAME 레윔드가 묎엇음까? 작은 배겜지식윌로 알아두는 게 좋을 것 같아 정늬핎볎렀 한닀. Canonical Name의 쀄임말로, 도메읞을 가늬킀는 닀륞 읎늄을 뜻한닀. 예륌 듀얎서, DNS에는 크게 아래와 같읎 2개 종류의 맀핑 값듀읎 있을 것읎닀. DNS 테읎랔읎 아래와 같닀고 핎볎자.

 

사용하는 도메읞 읎늄 변환되는 싀질적읞 죌소
externalname-svc my.database.com
zedd-hostname-nodeport 11.22.33.44.55

 

두 번짞 행부터 삎펎볎자. 우늬는 아까 NodePort 서비슀륌 생성하멎서 zedd-hostname-nodeport 띌는 서비슀 읎늄을 명시했고, 읎는 ClusterIP와 맀핑된닀고 ë°°ì› ë‹€. 읎렇게 특정 도메읞 읎늄읎 숫자 형태의 IP 죌소로 맀핑되는 것을 A 레윔드띌고 한닀. 

 

반멎에, 첫 번짞 행처럌 특정 도메읞 읎늄(externalname-svc)읎 숫자 형태의 IP 죌소가 아닌 또 닀륞 도메읞 읎늄(my.database.com)윌로 맀핑되는 것을 CNAME 레윔드띌고 한닀.


읎렇게 í•Žì„œ 쿠버넀티슀의 Ʞ쎈 개념읞 서비슀까지 몚두 닀룚얎볎았닀. 닀음 포슀팅부터는 쿠버넀티슀 늬소슀의 ꎀ늬와 섀정을 닀룚는 방법에 대핮 ë°°ìšž 예정읎닀. 닀음 포슀팅만 진행하고 나멎 쿠버넀티슀의 Ʞ쎈는 몚두 끝읎 난닀. ê·ž 읎후는 고꞉ Ʞ법에 적용되는 챕터듀읞데, 읎는 지ꞈ 당장 필자에게 필요한 낎용은 아니Ʞ 때묞에 백로귞 형태로 낚겚놓윌렀고 한닀.

반응형