쿠버네티스 안내서와 패스트캠퍼스 강의를 보고 작성한 포스팅입니다.
Pod는 자체 IP를 가지고있고 클러스터 내부에서는 Pod IP를 통해 통신하고 접근할 수 있지만 두가지 단점이 있다.
첫번째로는 Pod가 쉽게 사라지고 생성되는 특징 때문에 직접 통신하고자 하는 Pod를 찾이 어렵다.
두번째로는 클러스터 외부에서 Pod에 접근할 수 없다는 점이다.
쿠버네티스는 Pod과 직접 통신하는 방법 대신 별도의 고정된 IP를 가진 "서비스"를 만들고 이 서비스를 통해 Pod에 접근하는 방식을 사용한다.
서비스는 노출 범위에 따라 CluterIP, NodePort, LoadBalancer 이렇게 3가지로 구분할 수 있다.
서비스 생성에 앞서서 디플로이먼트가 있어야하기 때문에 이전에 만들어두었던 파일을 통해 서비스 만들기를 실습해보자.
# 1. 도커 실행
# 2. 미니큐브 시작
minikube start
cd Desktop/kube
# 3. Deployment 설정
vi deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
# 4. Deployment 생성
kubectl apply -f deployment.yml
서비스가 있어야 하는 이유를 직접 확인해보자면 pod ip를 통해 접근을 시도해보면 된다.
호스트는 접근 권한이 없다고 나오거나 접근시도를 무한반복 할것이다.(Request timeout for icmp_seq 0,1,2...)
ctrl+c로 빠져나올 수 있다.
# pod ip 확인
kubectl get pod -o wide
# pod ip로 접근
ping ip번호
Service - NodePort 만들기
생성된 디플로이먼트와 매칭시켜서 사용할 수 있는 서비스를 만들어보자
# 서비스 설정 파일 생성
vi service.yml
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
type: NodePort # 서비스 종류 설정
ports:
- port: 80
protocol: TCP
selector: # 아래 레이블을 가진 Pod를 매핑
app: nginx
# 서비스 생성
kubectl apply -f service.yml
# 서비스 상태 확인
kubectl get service
ports: 내부에 nodePort: 를 통해서 노드에 오픈할 Port 번호를 지정해 줄 수 있다.
서비스 상태를 확인해보면 새로 만든 서비스의 type 이 NodePort임을 알 수 있고, Port에 있는 서비스의 포트번호(80:포트번호/TCP)를 통해 접근할 수 있다.
minikube ip
# 접근 : curl 미니큐브ip:포트번호
curl 192.168.64.4:31000
Service - LoadBalancer 만들기
노드포트의 단점은 노드가 사라졌을 때 자동으로 다른 노드를 통해 접근이 불가능하다는 점이다.
자동으로 살아있는 노드에 접근하기 위해 모든 노드를 관리하는 Load Balancer가 필요하다. 브라우저는 NodePort에 직접 요청을 보내는 것이 아니라 Load Balancer에 요청하고 Load Balancer가 알아서 살아있는 노드에 접근하면 노드포트의 단점을 없앨 수 있다.
vi loadbal.yml
apiVersion: v1
kind: Service
metadata:
name: counter-lb
spec:
type: LoadBalancer
ports:
- port: 30000
targetPort: 80
protocol: TCP
selector:
app: counter
tier: app
kubectl apply -f loadbal.yml
kubectl get service
이번에는 브라우저로 연결을 확인해보자
주소창에 ip:포트번호를 통해서 접근할 수 있다.
실습
다음 조건에 맞게 service를 만들어보세요
Deployment 이름 | echo |
Deployment Label | app: echo |
Deployment 복제수 | 3 |
Container 이름 | echo |
Container 이미지 | ghcr.io/subicura/echo:v1 |
NodePort 이름 | echo |
NodePort Port | 3000 |
NodePort NodePort | 32000 |
vi quiz-echo.yml
# yaml 파일 작성
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo
spec:
replicas: 3
selector:
matchLabels:
app: echo
template:
metadata:
labels:
app: echo
spec:
containers:
- name: echo
image: ghcr.io/subicura/echo:v1
---
apiVersion: v1
kind: Service
metadata:
name: echo
spec:
type: NodePort
ports:
- port: 3000
protocol: TCP
nodePort: 32000
selector:
app: echo
# 생성
kubectl apply -f quiz-echo.yml
kubectl get all
# 연결확인
curl ip번호:port번호
마무리
실습 마무리는 종료 및 삭제
이젠 코드를 안남겨도 어떻게 하는지 알겠지....
모르면 이전 포스팅 참고!
'MLOps' 카테고리의 다른 글
12. MLOps DVC를 이용한 데이터 관리 (0) | 2022.03.07 |
---|---|
10. 쿠버네티스 미니큐브로 간단한 실습 - Deployment (MacOS) (0) | 2022.01.21 |
9. 쿠버네티스 미니큐브로 간단한 실습 - ReplicaSet (MacOS) (0) | 2022.01.19 |
8. 쿠버네티스 미니큐브로 간단한 실습 - Pod (MacOS) (0) | 2022.01.17 |
7. 쿠버네티스 미니큐브로 간단한 실습 (MacOS) (0) | 2022.01.14 |