본문 바로가기
MLOps/Doker & Kubernetes

Udemy CKA 강의 정리 35: Services

by 공부하는 무니 2023. 1. 4.
반응형

해당 내용은 Udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests  강의를 공부한 내용입니다. 내용을 그대로 번역하기보다는, 제가 이해하기 쉬운 대로 수정한 부분들이 있습니다.

⚠️ 영어 독해가 많이 부족합니다. 틀린 내용이 있으면 알려주시면 감사하겠습니다.


이번 강의에서는 Kubernetes Services에 대해 배워보겠습니다.

Services

Kubernetes Services는 내부의 컴포넌트끼리, 그리고 애플리케이션 외부와 통신할 수 있게 해줍니다. Kubernetes Services는 애플리케이션을 다른 애플리케이션이나 사용자와 연결하는 데 도움을 줍니다.

예를 들어, 우리의 애플리케이션은 다양한 섹션을 실행하는 파드의 그룹들이 있습니다. 프론트엔드를 유저에게 서빙하는 그룹, 백엔드 프로세스를 실행하는 그룹, 외부 데이터 소스에 연결하는 그룹들이 있을 것입니다. 이러한 파드 그룹 간 연결을 가능하게 하는 것이 Service입니다. Service를 통해 프론트엔드 애플리케이션을 엔드 유저가 사용할 수 있게 하고, 백엔드와 프론트엔드 파드 간 통신을 돕고, 외부 데이터 소스 연결 설정에 도움을 줍니다. 즉, 서비스는 애프리케이션의 마이크로서비스 간에 loose coupling을 가능하게 합니다.

External Communication

서비스의 한 가지 사용 사례를 살펴보겠습니다. 웹 애플리케이션이 실행되고 있는 파드를 배포했습니다. 어떻게 외부 사용자가 웹페이지에 접속할 수 있을까요?

  • From the node (Able to reach the application as expected)

먼저 기존 설정을 살펴보겠습니다. Kubernetes 노드에는 IP 주소가 있습니다. 지금 이 주소는 192.168.1.2입니다. 내 노트북도 같은 네트워크에 있고, IP 주소는 192.168.1.10입니다. 그리고 내부 파드 네트워크 범위는 10.244.0.0 입니다. 지금 파드의 IP는 10.244.0.2입니다.

지금 저는 파드와 다른 네트워크에 있으므로 파드에 ping하거나 접속할 수 없습니다. 어떻게 웹페이지를 볼 수 있을까요? 먼저, Kubernetes 노드에 SSH로 연결하면 curl을 수행하여 파드의 웹페이지에 접속할 수 있습니다. 또는, 노드에 GUI가 있다면 브라우저를 열어서 http://10.244.0.2 를 입력하여 웹페이지를 볼 수 있습니다.

그러나 이것은 Kubernetes 노드 내부에서 접근하는 방법입니다. 우리가 정말로 원하는 것은 SSH연결 없이 내 노트북에서 웹 서버에 접속하는 것을 원합니다.

  • From outside world (This should be our expectation, without something in the middle it will not reach the application)

우리는 노트북에서 SSH연결 없이 Kubernetes 노드의 IP에 접근하고, 웹 서버에 접속하고 싶습니다. 따라서 노트북에서 노드로, 노드에서 파드로 중간에 리퀘스트를 매핑할 무언가가 필요합니다. 이 역할을 하는 것이 Kubernetes Service입니다. 파드, replicaset, deployment과 마찬가지로 Kubernetes Service는 오브젝트입니다.

Service Types

쿠버네티스에는 3가지 타입의 Service가 있습니다.

1. NodePort

노드와 노드 내 파드에서 내부 파드에 접근 가능하도록 만드는 서비스 입니다.

서비스를 자세히 보겠습니다. 3개의 포트가 있습니다.

1) 실제 웹서버가 있는 파드의 포트는 80이며, Service가 리퀘스트를 전달할 곳이기 때문에 TargetPort라고 부릅니다.

2) 두 번째 포트는 서비스 자체의 포트입니다. 그냥 Port로 부릅니다. 사실 서비스는 노드 내의 가상 서버와 같습니다. 클러스터 내부에는 자체 IP주소가 있는데, IP주소를 서비스의 ClusterIP라고 부릅니다. (여기서는 10.106.1.12)

3) 마지막으로 노드 자체에 포트가 있습니다. 외부에서 웹 서버에 액세스하는 사용할 노드 포트이며, 지금은 30008로 설정되어 있습니다. 노드 포트는 30000에서 32767 사이의 범위에서 값을 가질 수 있습니다.

To create the service

deployment, replicaset, pod을 만들었을 때와 같이 Definition file을 사용합니다.

파일의 구조는 이전과 마찬가지로 apiVersion, kind, metadata, spec으로 동일합니다.

  • apiVersion: v1
  • kind: Service
  • metadata:
    • name: my-app-service 가 들어가고, 이것이 서비스의 이름입니다.
    • labels: 레이블이 있을 수 있지만, 지금은 필요하지 않습니다.
  • spec: 늘 그렇듯이 spec이 가장 중요한 부분입니다. 서비스의 spec에는 type과 ports가 있습니다.
    • type: 우리가 만들고 있는 서비스의 유형을 나타냅니다. 지금은 NodePort입니다.
    • ports: 위에서 말한 포트들을 array로 적어줄 곳입니다. 여기서 필수 필드는 port입니다. targetPort를 적지 않으면 port와 동일하다고 간주합니다. nodePort를 적지 않으면 30000에서 32767 사이에서 사용 가능한 포트가 자동으로 배정됩니다.
      • targetPort: 80
      • port: 80
      • nodePort: 30008
    • selector: labels와 selector를 사용해서 서비스를 파드에 연결해야 합니다. selector에 연결할 파드의 labels 정보를 입력하면 됩니다.

완성된 definition file 은 아래와 같습니다.

apiVersion: v1
kind: Service
metadata:
 name: myapp-service
spec:
 types: NodePort
 ports:
 - targetPort: 80
   port: 80
   nodePort: 30008
 selector:
   app: myapp
   type: front-end

definition file 이 완성되면, 아래 명령어를 통해 서비스를 생성합니다.

$ kubectl create -f service-definition.yaml

To list the services

$ kubectl get services

To access the application from CLI or web browser

$ curl http://192.168.1.2:30008

A service with multiple pods

지금까지 단일 파드에 매핑된 서비스에 대해 이야기했습니다. 그런데 프로덕션 환경에서는 실행중인 웹 애플리케이션의 여러 인스턴스가 있을 것이고 파드도 여러 개 있을 것입니다. 다행히 파드들은 모두 같은 label을 가지고 있을 것이며, 서비스의 selector에서 해당 label을 가지고 있는 파드를 모두 선택하게 됩니다. 그 중 리퀘스트를 전달할 파드는 파드간 로드 균형을 조정하면서 랜덤 알고리즘으로 선택하게 됩니다. 따라서 서비스는 파드 간 부하를 분산하면서 기본적으로 로드 밸런서 역할을 하게 됩니다.

When Pods are distributed across multiple nodes

만약 파드가 여러 노드에 분산되어 있다면 어떻게 될까요? 우리가 서비스를 만들 때 Kubernetes는 자동으로 클러스터의 모든 노드에서 대상 포트를 매핑하도록 만듭니다. 이때 클러스터의 모든 노드는 동일한 포트 번호를 사용합니다.

2. ClusterIP

Cluster IP 서비스는 서로 다른 서비스(ex. 프론트엔드 서버, 백엔드 서버) 간에 소통을 가능하게 하기 위해 클러스터 안에 Virtual IP 를 생성합니다.

3. LoadBalancer

세 번째 타입은 loadbalancer 입니다. 예를 들어 frontent tier 웹 서버에 걸쳐있는 부하를 분산시킬 수 있습니다.

반응형

댓글