본문 바로가기
INFRA/DevOps

Service - 2

by BTC_룰루랄라 2022. 6. 13.

반갑습니다!

💙베하💙 누구든 탑승할 수 있는 유임승차 팀의 BTC 룰루랄라 입니다!!💨😉

 

저번 포스팅은 쿠버네티스 기능 중 하나인 Service에 대해서 설명 드렸는데요~

이번 포스팅에서는 Kubernetes의 Service에 대해서 추가적인 기능에 대해서 설명해 드리겠습니다.

Service는 애플리케이션을 동작하기 위한 가장 중요한 기능이므로 꼭 알아 두셔야 될 것 같아요!!

그럼 서비스에 대해서 추가적으로 알아 보겠습니다~

룰루랄라~♬

 

 

Service(NodePort) 만들기

CluterIP는 클러스터 내부에서만 접근할 수 있습니다. 클러스터 외부(노드)에서 접근할 수 있도록 NodePort 서비스를 만들어봅니다.

apiVersion: v1
kind: Service
metadata:
  name: counter-np
spec:
  type: NodePort
  ports:
    - port: 3000
      protocol: TCP
      nodePort: 31000
  selector:
    app: counter
    tier: app
 

정의설명

spec.ports.nodePort 노드에 오픈할 Port (미지정시 30000-32768 중에 자동 할당)

counter app을 해당 노드의 31000으로 오픈합니다.

kubectl apply -f counter-nodeport.yml

# 서비스 상태 확인
kubectl get svc

실행 결과

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
counter-np   NodePort    10.101.168.165   <none>        3000:31000/TCP   13s
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          3d19h
redis        ClusterIP   10.103.50.102    <none>        6379/TCP         30m

minikube ip로 테스트 클러스터의 노드 IP를 구하고 31000으로 접근해봅니다.

curl 192.168.64.4:31000 # 또는 브라우저에서 접근

Docker

Docker driver를 사용중이라면 minikube service counter-np 명령어를 이용하여 접속하세요.

NodePort는 클러스터의 모든 노드에 포트를 오픈합니다. 지금은 테스트라서 하나의 노드밖에 없지만 여러 개의 노드가 있다면 아무 노드로 접근해도 지정한 Pod으로 쏘옥 접근할 수 있습니다.

NodePort와 ClusterIP

NodePort는 CluterIP의 기능을 기본으로 포함합니다.

#Service(LoadBalancer) 만들기

NodePort의 단점은 노드가 사라졌을 때 자동으로 다른 노드를 통해 접근이 불가능하다는 점입니다. 예를 들어, 3개의 노드가 있다면 3개 중에 아무 노드로 접근해도 NodePort로 연결할 수 있지만 어떤 노드가 살아 있는지는 알 수가 없습니다.

자동으로 살아 있는 노드에 접근하기 위해 모든 노드를 바라보는 Load Balancer가 필요합니다. 브라우저는 NodePort에 직접 요청을 보내는 것이 아니라 Load Balancer에 요청하고 Load Balancer가 알아서 살아 있는 노드에 접근하면 NodePort의 단점을 없앨 수 있습니다.

Load Balancer를 생성해 봅니다.

apiVersion: v1
kind: Service
metadata:
  name: counter-lb
spec:
  type: LoadBalancer
  ports:
    - port: 30000
      targetPort: 3000
      protocol: TCP
  selector:
    app: counter
    tier: app
 
kubectl apply -f counter-lb.yml

실행 결과

NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE
counter-lb   LoadBalancer   10.109.133.129   <pending>     30000:31535/TCP   9s
counter-np   NodePort       10.101.168.165   <none>        3000:31000/TCP    34m
kubernetes   ClusterIP      10.96.0.1        <none>        443/TCP           3d20h
redis        ClusterIP      10.103.50.102    <none>        6379/TCP          65m

counter-lb가 생성되었지만, EXTERNAL-IP가 <pending>인 것을 확인할 수 있습니다. 사실 Load Balancer는 AWS, Google Cloud, Azure 같은 클라우드 환경이 아니면 사용이 제한적입니다. 특정 서버(노드)를 가리키는 무언가(Load Balancer)가 필요한데 이런 무언가가 가상머신이나 로컬 서버에는 존재하지 않습니다.

#minikube에 가상 LoadBalancer 만들기

Load Balancer를 사용할 수 없는 환경에서 가상 환경을 만들어 주는 것이 MetalLB라는 것입니다. minikube에서는 현재 떠 있는 노드를 Load Balancer로 설정합니다. minikube의 addons 명령어로 활성화합니다.

minikube addons enable metallb

그리고 minikube ip명령어로 확인한 IP를 ConfigMap으로 지정해야 합니다.

minikube를 이용하여 손쉽게 metallb 설정을 할 수 있습니다.

minikube addons configure metallb

-- Enter Load Balancer Start IP: # minikube ip 결과값 입력
-- Enter Load Balancer End IP: # minikube ip 결과값 입력
    ▪ Using image metallb/speaker:v0.9.6
    ▪ Using image metallb/controller:v0.9.6
✅  metallb was successfully configured

minikube를 사용하지 않고 직접 ConfigMap을 작성할 수도 있습니다.

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.64.4/32 # minikube ip
kubectl apply -f metallb-cm.yml

# 다시 서비스 확인
kubectl get svc

실행 결과

NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE
counter-lb   LoadBalancer   10.109.133.129   192.168.64.4  30000:31535/TCP   1m
counter-np   NodePort       10.101.168.165   <none>        3000:31000/TCP    35m
kubernetes   ClusterIP      10.96.0.1        <none>        443/TCP           3d20h
redis        ClusterIP      10.103.50.102    <none>        6379/TCP          66m

이제 192.168.64.4:30000으로 접근해봅니다.

Docker

Docker driver를 사용중이라면 minikube service counter-lb 명령어를 이용하여 접속하세요.

LoadBalancer와 NodePort

LoadBalancer는 NodePort의 기능을 기본으로 포함합니다.

#마무리

서비스는 로우레벨low level 수준의 네트워크를 이해하고 성능, 보안 이슈를 신경 써야 합니다. 파고들면 한없이 복잡하고 어려운 부분으로 일단 그렇구나.. 하고 넘어갑니다. 😭

실전에선 NodePort와 LoadBalancer를 제한적으로 사용합니다. 보통 웹 애플리케이션을 배포하면 80 또는 443 포트를 사용하고 하나의 포트에서 여러 개의 서비스를 도메인이나 경로에 따라 다르게 연결하기 때문입니다. 이 부분은 뒤에 Ingress에서 자세히 알아봅니다.

'INFRA > DevOps' 카테고리의 다른 글

[K8S] containerd 란  (0) 2022.06.16
[Docker] Docker Engine 설치 실습  (0) 2022.06.14
IaC 별 역할과 Terraform, Ansible에 대해서 알아봅시다  (0) 2022.06.10
[K8S] 배포전략  (0) 2022.06.09
[Docker] Container 개요  (0) 2022.06.07

댓글