본문 바로가기
Cloud/Kubenetes

[Kubenetes] Loadbalancer - Cluster IP, NodePort

by tankwoong 2023. 11. 1.
반응형

오늘은 클러스터 IP와 NodePort에 대해서 설명하고 그에 대한 실습을 진행해 보겠다.

 

클러스터 IP와 NodePort는 Kubernetes(k8s)에서 사용되는 서비스 유형 중 하나이다.

 

1. 클러스터 IP(Cluster IP):

 

클러스터 IP는 Kubernetes 내에서 

애플리케이션 간의 내부 통신에 사용되는 서비스 유형이다.

 이 서비스 유형은 애플리케이션 레벨에서 

로드 밸런싱을 수행하고, 다른 서비스 또는 파드와 통신할 때 사용된다. 

 

클러스터 IP는 다음과 같은 특징을 가지고 있습니다:

내부 통신용:

 

클러스터 IP는 클러스터 내에서만 접근 가능하다.

 즉, 클러스터 외부에서는 이 IP에 직접 액세스 할 수 없다는 말이다.

내부 자원 공유:

 

 - default: 클러스터 IP 서비스는 

클러스터 내에서 기본적으로 모든 파드에 대한 액세스를 공유한다. 

이것은 파드가 서로 통신할 때 유용하다.

 

2. NodePort:



NodePort는 Kubernetes 클러스터의 노드(워커 노드)에서 

외부 서비스로 애플리케이션을 노출하는 데 사용되는 서비스 유형이다.

 

NodePort를 사용하면 클러스터 외부에서 해당 서비스에 접근할 수 있다.

 

NodePort는 다음과 같은 특징을 가지고 있습니다:

NodePort는 포트 범위 30000에서 32767까지 선택할 수 있으며,

 일반적으로 이 범위를 사용하여 노드 포트를 할당하는데 

이 범위는 Kubelet이 허용하는 범위이다.

NodePort 서비스는 

클러스터 외부에서 해당 서비스에 접근할 수 있도록 

노드의 IP 주소와 선택한 포트를 사용한다.

 

이를 통해 외부 사용자 또는 다른 클러스터에서 

해당 서비스에 액세스할 수 있다.

정리하자면 클러스터 IP와 NodePort는 

클러스터 IP는 내부 통신에 적합하고, 

NodePort는 외부 노출용으로 적합하므로, 

애플리케이션 요구 사항에 따라 적절한 서비스 유형을 선택할 수 있고

애플리케이션을 쉽게 관리하고 노출할 수 있다.

 

yml파일 생성 : http-go-v1.yml

apiVersion: v1
kind: Pod
metadata:
  name: http-go
  labels:
    app: http-go
spec:
  containers:
  - name: http-go
    image: jingukang/http-go
    ports:
      - containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: http-go-svc
spec:
  selector:
    app: http-go
  ports:
  - port: 80
    targetPort: 8080

yml파일을 이용하여 리소스를 생성

kubectl create -f http-go-v1.yml

확인하면 앞 쪽에서 설명한 ClusterIP가 생성된 것을 확인할 수 있다.

Kubernetes 클러스터 내의

 'http-go' 파드에서 'curl' 명령어를 실행하여 

10.100.184.88 IP 주소로 요청을 보내고, 

결과를 조용히(silent 모드)로 보내준다.

여기서 10.100.184.88은 http-go-svc의 주소이다.

kubectl exec http-go -- curl 10.100.184.88 -s

자세한 내용은 describe를 통해 확인할 수 도 있다.

kubectl describe svc http-go-svc

yml파일 하나 더 생성하기 

kubectl create deploy --image=myoungseok/http-go http-go --port=8080 --dry-run=client -o yaml > http-go-deploy.yml

 

kubectl create -f http-go-deploy.yml

kubectl exec [pod이름] --curl [서비스 주소] -s

kubectl scale deploy http-go --replicas=5

kubectl describe svc | grep Endpoints:

스케일 5개로 업 후 Endpoints확인 

5개 pod 모두 접속되는 것을 확인 

busybox에 접속

kubectl run -it --rm --image busybox -- sh

부하분산이 되는 것을 확인 

이 부분 때문에 부하 분산이 되는 것이다.

 

만약 서버가 똑같아야 되는 경우

kubectl edit svc http-go-svc

kubectl edit configmap -n kube-system cilium-config

 

root@master:~# kubectl rollout restart -n kube-system daemonset/cilium

 

계속 반복해도 서버가 동일함을 알 수 있다.

 

반응형