오늘은 클러스터 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
계속 반복해도 서버가 동일함을 알 수 있다.