반응형
1. 서비스 개념
- 파드가 끊임없이 생성·삭제되는 쿠버네티스의 특성으로 인해 파드의 IP도 고정되지 않고 계속해서 바뀜
- 이런 특성은 클러스터 외부에 있는 유저가 웹 서비스에 접근하거나, 클러스터 내부의 백엔드 또는 DB에 리소스를 요청할 때 큰 제약사항
- 서비스 오브젝트는 이러한 문제를 해결하기 위해 애플리케이션에 접근 가능한 고정된 IP를 제공하는 역할
- 서비스 타입은 4종류가 존재
- ClusterIP
- NodePort
- LoadBalancer
- ExternalName
2. 서비스 타입
- ClusterIP
- 서비스 오브젝트의 기본 타입으로 NodePort 등 별도의 옵션을 설정하지 않을 경우 디폴트로 ClusterIP로 설정
- 클러스터 내부에서만 접근 가능한 ClusterIP라는 Virtual IP를 생성하고, 내부 리소스간에만 통신이 가능하도록 함
- 따라서 클러스터 외부에서 접근하고자 할 경우 NodePort 또는 LoadBalancer 서비스 적용 필요
- NodePort
- 클러스터 외부에서 워커노드의 IP와 포트로 접속을 요청하면 워커노드는 해당 요청을 NodePort 서비스 오브젝트로 전달하고,
- NodePort 서비스 오브젝트는 이를 전달받아 selector에 맵핑된 파드로 전달
- LoadBalancer
- CSP(AWS, GCP, Azure 등)에서 제공하는 로드밸런서를 이용하는 방법
- IP를 가진 로드밸런서를 구성하고 DNS를 등록해 사용
- 클러스터 외부의 이용자들이 NodePort처럼 주소(192.168.10.2:30008)를 입력하지 않고 URL을 통해 파드에 접근 가능
- 로컬(virtualbox 등)에서 클러스터를 구성한 경우 metallb 등 오픈소스 LB를 통해 구현 가능
- ExternalName
- 클러스터 외부 서비스를 클러스터 내부에서 호출하고자 할 때 사용하는 서비스
- ExternalName 서비스로 들어오는 모든 요청을 'externalName' 항목에 설정한 DNS 주소로 포워딩
3. ClusterIP
3.1. 서비스 생성
- yaml를 활용한 ClusterIP 서비스 생성
apiVersion: v1
kind: Service
metadata:
labels:
app: my-clusterip-svc
name: my-clusterip-svc
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: clusterip-test
- 명령어를 활용한 ClusterIP 서비스 생성
kubectl create svc clusterip clusterip-test --tcp=80:80
or
kubectl expose deployment [디플로이먼트_이름] --port=[port] --target-port=[target-port]
3.2. 서비스 목록 확인
kubectl get svc
kubectl get svc -n [네임스페이스]
kubectl get svc -A
kubectl get svc -o wide
3.3. 서비스 정보 확인
kubectl describe svc [서비스_이름]
3.4. 서비스 삭제
kubectl delete svc [서비스_이름]
3.5. ClusterIP 적용 예제
- ClusterIP 서비스를 연결 할 nginx 디플로이먼트 생성
- ClusterIP 서비스 생성
- [ClusterIP 서비스의 IP]:[ClusterIP 서비스의 포트] 주소로 nginx 접속 테스트
4. NodePort
4.1. 서비스 생성
- yaml를 활용한 NodePort 서비스 생성
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
name: nodeport-test
ports:
- protocol: TCP
port: 80
targetPort: 80
- 6~7번: NodePort 서비스를 연결할 레플리카셋 또는 디플로이먼트의 레이블 값
- 8~11번: NodePort를 별도로 설정하지 않을 경우 30000 ~ 32767 범위에서 자동 할당
- 명령어를 활용한 NodePort 서비스 생성
kubectl create service nodeport [서비스_이름] --tcp=[port]:[targetPort]
or
kubectl expose deployment [디플로이먼트_이름] --port=[port] --target-port=[target-port] --type=NodePort
4.2. NodePort 적용 예제
- NodePort 서비스를 연결 할 nginx 디플로이먼트 생성
- 파드 배포 확인
- NodePort 서비스 생성
- nginx 디플로이먼트가 배포된 노드의 IP 확인
- [디플로이먼트가 배포된 노드의 IP]:[NodePort 서비스의 포트] 주소로 nginx 접속 테스트
5. LoadBalancer
5.1. 서비스 생성
- yaml를 활용한 LoadBalancer 서비스 생성
apiVersion: v1
kind: Service
metadata:
labels:
app: frontend
name: my-loadbalncer-test
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: frontend
type: LoadBalancer
- 명령어를 활용한 LoadBalancer 서비스 생성
kubectl create service loadbalancer [서비스_이름] --tcp=[port]:[targetPort]
or
kubectl expose deployment [디플로이먼트_이름] --port=[port] --target-port=[target-port] --type=LoadBalancer
6. ExternalName
6.1. 서비스 생성
- yaml를 활용한 ExternalName 서비스 생성
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ExternalName
externalName: zero.test.com
- 명령어를 활용한 LoadBalancer 서비스 생성
kubectl create service externalname [서비스_이름] --external-name [DNS]
반응형
'Kubernetes' 카테고리의 다른 글
Kubernetes 메뉴얼 스케줄링(Manual Scheduling)과 노드 셀렉터(Node Selector) 개념과 설정 (0) | 2023.03.16 |
---|---|
Kubernetes 명령형(Imperative) 관리와 선언형(Declarative) 관리 개념 (0) | 2023.03.16 |
Kubernetes 네임스페이스(Namespace) 개념과 명령어 (0) | 2023.03.15 |
Kubernetes 디플로이먼트(Deployment) 개념과 명령어 (0) | 2023.03.15 |
Kubernetes 레플리카셋(ReplicaSet) 개념과 명령어 (0) | 2023.03.15 |