쿠버네티스란,
다수의 컨테이너를 효율적으로 배포, 확장 및 관리 하기 위한 오픈소스 시스템
Docker Compose의 확장판이라고 생각
쿠버네티스 장점
- 컨테이너 관리 자동화(배포, 확장, 업데이트)
- 부하 분산 (로드 밸런싱)
- 쉬운 스케일링
- 셀프 힐링
파드(Pod) 란?,
하나의 프로그램을 실행시키는 단위
- 쿠버네티스에서 가장 작은 단위
- 일반적으로 하나의 파드가 하나의 컨테이너를 가진다. (예외로 여러 컨테이너를 가지는 경우도 있다.)
Nginx 파드 예시
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx
ports:
- containerPort: 80 # 컨테이너가 사용하는 포트
- 파드 조회 명령어
kubectl get pods
매니페스트 파일(Manifest File) 이라고 부른다.
kubectl apply -f nginx-pod.yaml명령어로 파드를 생성할 수 있다.
파드(Pod)로 띄운 프로그램에 접속이 안 되는 이유
- 도커에 대해서 공부했을 때는 컨테이너 내부와 컨테이너 외부의 네트워크가 서로 독립적으로 분리
쿠버네티스에서는 파드(Pod) 내부의 네트워크를 컨테이너가 공유해서 같이 사용 - 파드(Pod) 네트워크는 로컬 컴퓨터의 네트워크와 독립적 분리 -> 외부에서 접근 불가
2가지 접근 방법
- 파드 내부로 들어가서 접근
kubectl exec -it nginx-pod -- bash - 파드 의 내부네트워크를 외부에서도 접속할 수 있도록 포트 포워딩 활용
sudo kubectl port-forward pod/nginx-pod 80:80
- 파드 내부로 들어가서 접근
파드 삭제
kubectl delete pod nginx-pod
백앤드 서버 파드로 띄우기
Spring boot 서버에 Dockerfile 작성
FROM openjdk:17-jdk
COPY build/libs/*SNAPSHOT.jar app.jar
LABEL authors="jeon-eunseong"
ENTRYPOINT ["java","-jar","/app.jar"]
쿠버네티스 파드 매니페스트 파일 작성
apiVersion: v1
kind: Pod
metadata:
name: spring-pod
labels:
app: spring-app
spec:
containers:
- name: spring-container
image: spring-server
ports:
- containerPort: 8080
등록 명령어
kubectl apply -f spring-pod.yaml
조회 명령어
kubectl get pods
ImagePullBackOff 오류 발생
이미지가 없다고 에러가 뜨는 이유
이미지 풀 정책(Image pull Policy) 때문에 발생
이미지 풀 정책
yaml 을 읽어서 Pod 생성 시, 이미지를 어떻게 Pull 할 지에 대한 정책
Always: 로컬 말고, 무조건 레지스트리(Dockerhub, ECR(원격 이미지 저장소)) 에서 가져온다.IfNotPresent: 로컬에 이미지 먼저 가져오고, 없으면 레지스트리에서 가져온다.Never: 로컬에서만 이미지를 가져온다.
image 뒤에 version을 명시하지 않거나, latest 태그를 사용하는 경우 Always 가 기본값
lastest 태그를 사용하지 않는다면 IfNotPresent 가 기본값
해결 방법
이미지 풀 정책을 IfNotPresent 로 변경
...
ports:
- containerPort: 8080
imagePullPolicy: IfNotPresent