IT 강의/도커 쿠버

[CKA 강의 요약] Services

rnany 2024. 6. 19. 21:10

Udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests  강의의 36. Services 챕터를 공부한 내용으로 강의 내용과 다를 수 있습니다. 정확한 내용은 강의를 들으시는 것을 추천드립니다.


 

1. Services

Services는 내부의 구성 요소와 외부 사용자, 어플리케이션들이 내부 어플리케이션과 통신할 수 있게 해준다. 

Services를 통해 연결된 구성도

예를 들어, 하단과 같이 애플리케이션은 다양한 역할을 하는 파드의 그룹들로 이루어져 있다.

- 프론트 엔드

- 백엔드 프로세스

- 외부 데이터 소스

이런 파드 그룹 간의 연결을 해주는게 Service이다. 즉, service는 어플리케이션의 마이크로서비스 간에 loose coupling을 가능하게 한다.

더보기

 loose coupling이란?

 

시스템의 구성요소(component)가 서로 약하게 연관돼 관계를 떼어낼 수 있고, 그때문에 한 구성요소에 변화가 생겼을 때 다른 구성요소의 성능이나 존재에 최소한의 영향을 끼치는 상태

출처: https://yozm.wishket.com/magazine/detail/1926/ [느슨한 결합(loosely coupled) 원칙을 활용한 소프트웨어 설계 | 요즘IT]

 

 

1) 외부 통신 예시

웹 어플리케이션이 실행되고 있는 pod를 배포한 뒤 외부 사용자가 서비스에 접근하는 방법에 대해 예시를 통해 이해 해본다.

 

1-1) Node에 접근하여 서비스 접근하기

 

 

상위 구성을 살펴보면 kubernetes node(192.168.1.2)와 사용자의 노트북(192.168.1.10)은 같은 네트워크 대역에 있어 통신이 가능하다. Node 내부 pod의 네트워크 범위는 10.244.0.0이고 pod의 IP는 10.244.0.2이다.

같은 대역의 노트북과 node와는 다르게 다른 네트워크에 있는 pod는 통신이 불가하다. Kubernetes node에 SSH로 연결한 뒤, curl을 수행하면 pod의 서비스인 웹페이지에 접속할 수 있다. 또는, node에 GUI가 있다면 브라우저를 열어서 http://10.244.0.2 를 입력하여 웹페이지를 볼 수 있다.

그러나 이것은 Kubernetes node 내부에서 접근하는 방법으로 우리가 정말로 원하는 것은 SSH를 통해 node로 접근하지 않고 노트북 자체에서 pod의 웹 서비스에 접속하는 것이다.

 

1-2) 직접 서비스 접근하기

노트북에서 SSH 연결 없이 Kubernetes 노드의 IP에 접근하고, 웹 서버에 접속는 방법을 알아본다. Kubernetes Service를 사용해 노트북에서 노드로, 노드에서 파드로 중간에 요청을 매핑한다. pod, replicaset, deployment과 마찬가지로 Kubernetes Service는 kubenetes의 객체이다.

 

 

2. Service 종류

Kubernetes service는 Node Port, Cluster IP, Load Balancer  3가지 종류가 있다.

이번 챕터에선 node port를 중점적으로 설명한다.

 

1) Node Port

NodePort

서버가 내부 포트를 node port에 접근 가능하게 해주는 것이다.

 

port

상위 구성에서 3개의 포트가 있다.

1-1) Target Port: 실제 웹 서버가 있는 pod의 포트로 Service가 요청을 전달할 곳이기에 Target Port라고 부른다.

2-2) Port: service는 node 내의 가상 서버와 같아서 포트는 서비스 자체의 포트로 생각하면 된다. 클러스터 내부에는 자체 IP주소가 있는데, IP 주소를 서비스의 Cluster IP라고 부른다. (상위 구성에선 10.106.1.12)

3-3)  Node Port:  Node 자체에있는 포트로 외부에서 웹 서버에 접근하는 용도로 사용하는 포트이다. 상위 구성에서는 30008로 설정되어 있다. Node port 는 30000에서 32767 사이의 범위에서 값을 가질 수 있습니다.

 

 

2) Cluster IP

Cluster IP

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

 

 

3) Load Balancer

LoadBancer

부하 분산 서비스가 있다. 예를 들어 frontent tier 웹 서버에 걸쳐있는 부하를 분산시킬 수 있습니다.

 

 

3. Service  생성하기

Service는 이전 객체(Ddeployment, replicaset, pod)를 만드는 것과 같이 정의 파일을 사용해 생성한다.

파일의 구성은 apiVersion, kind, metadata, spec으로 이전과 동일하다.

<Service 정의 파일>

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

- apiVersion: v1

- kind: Service

- metadata:

  • name: service의 이름이다.
  • labels: 추가 가능하나 상위 설정에선 넣지 않았다.

- spec: 실제 service를 정의하는 곳으로 service의 spec에는 type과 ports가 있다.

  • type: 우리가 만들고 있는 service의 유형을 나차내며 Node Port, Cluster IP, Load Balancer 3개중 한개가 될 수 있다. 지금은 Node Port를 지정했다.
  • ports: 포트들을 array(배열)로 적어주기에 첫 시작을 '-'로 한다. 단일 service 내에 여러 port가 매핑 될 수 있다. 필수 필드는 port이다. targetPort를 적지 않으면 port와 동일하게 설정 된다. nodePort를 적지 않으면 30000에서 32767 사이에서 사용 가능한 포트가 자동으로 배정된다
  • selector: selector에 연결할 pod의 labels 값을 입력해  service를 pod에 연결한다.

 

 

정의 파일 작성이 완료되면 아래 명령어를 통해 service를 생성한다.

$ kubectl create -f service-definition.yaml

 

하단 명령어를 통해 생성된 services를 조회한다.

$ kubectl get services

Service, Cluster IP, 매핑 port들을 나역하는 명령어다, NodePort 형식으로 생성된 것을 볼 수 있다. Nodeport가 설정 파일에 설정한대로 30008으로 생성 된 것을 확인 할 수 있다.

Curl 명령어나 웹브라우저를 통해 웹 서비스에 접근 해본다.

$ curl http://192.168.1.2:30008

 

 

3-1) pod가 여러개일때의 service 예시

실제 운영 환경에서는 웹 어플리케이션의 여러 인스턴스와 pod가 있을 것이다. pod들은 모두 같은 label을 가지고 있을 것이며, 서비스의 selector에서 해당 label을 가지고 있는 pod들을 모두 엔드포인트로 선택한다. Random 알고리즘으로 load balancing이 동작한다. 따라서 service는 pod 간 부하를 분산하면서 기본인 load balancer 역할을 하게 됩니다.

 

3-2) 여러 node에 분산된 pod에서의 service 예시

 Service를 만들 때 Kubernetes는 자동으로 클러스터의 모든 node에 service를 생성하고 target port를 동일한 node port에 매핑한다. 이에 동일한 IP와 port로 서비스에 접근 가능하다.

즉, kubernetes는  node, pod의 갯수가 변해도 기존 설정 파일을 바꿀 필요 없이 변화된 환경에 유연하게 적응한다.