01 kubernetes
01 kubernetes
1. kubernetes
1. kubernetes
- 다수의 컨테이너를 효율적으로 배포, 확장 및 관리 하기 위한 오픈 소스 시스템
- 쿠버네티스(Kubernetes)는 Docker Compose와 비슷함.
- 쿠버네티스(Kubernetes)의 대략적인 이미지를 그릴 때는 Docker Compose의 확장판으로 보면 편함.
2. 쿠버네티스의 장점
- 컨테이너 관리 자동화 (배포, 확장, 업데이트)
- 부하 분산 (로드 밸런싱)
- 쉬운 스케일링
- 셀프 힐링
2. POD
1. pod
- 도커에서는 하나의 프로그램을 실행시키는 단위를 컨테이너
- 쿠버네티스에서는 하나의 프로그램을 실행시키는 단위를 파드(Pod)
- 파드를 띄우는 방법
CLI를 활용하는 방법,yaml 파일을 활용하는 방법
2. 파드를 띄우기 예시
1. yaml 만들기
- 파일명 : nginx_pod.yaml
- 변경 O, (도커파일은 변경 불가능함)
- 매니페스트파일(Manifest file) : 다양한 리소스(파드, 서비스, 볼륨 등)를 생성하고 관리하기 위해 사용하는 파일
내용
1 2 3 4 5 6 7 8 9 10
apiVersion: v1 # Pod를 생성할 때는 v1이라고 기재한다. (공식 문서) kind: Pod # Pod를 생성한다고 명시 metadata: name: nginx-pod # Pod에 이름 붙이는 기능 spec: containers: - name: nginx-container # 생성할 컨테이너의 이름 image: nginx # 컨테이너를 생성할 때 사용할 Docker 이미지 ports: - containerPort: 80 # 해당 컨테이너가 어떤 포트를 사용하는 지 명시적으로 표현
2. 실행
1
2
kubectl apply -f nginx_pod.yaml
# 쿠버네티스컨트롤 # 시도 #-f 파일 #nginx_pod.yaml을 실행
3. 확인
1
2
3
4
5
6
7
8
9
# 파드의 존재 확인
kubectl get pods
# nginx-pod 파드의 세부 정보 조회
# kubectl describe pods [파드명]
kubectl describe pods nginx-pod
# kubectl logs [파드명]
kubectl logs nginx-pod # 파드 로그 확인하기
3. POD의 네트워크
1. POD 네트워크
- 도커는 컨테이너 내부와 컨테이너 외부의 네트워크가 서로 독립적으로 분리되어 있음
- 쿠버네티스에서는 파드(Pod) 내부의 네트워크를 컨테이너가 공유해서 같이 사용함.
- 파드(Pod)의 네트워크는 로컬 컴퓨터의 네트워크와는 독립적으로 분리됨
- 파드(Pod)로 띄운 Nginx에 아무리 요청을 보내도 응답이 없던 것
2. POD의 접근방법
1. 파드(Pod) 내부로 들어가서 접근하기
1
2
3
4
5
6
# kubectl exec -it [파드명] -- bash
# 도커에서 컨테이너로 접속하는 명령어(docker exec -it [컨테이너 ID bash)와 비슷하다.
kubectl exec -it nginx-pod -- bash # nginx-pod 내부 환경으로 접속
# ---Pod 내부---
curl localhost:80 # Nginx로 요청보내기
2. 파드(Pod)의 내부 네트워크를 외부에서도 접속할 수 있도록 포트 포워딩(= 포트 연결시키기) 활용하기
1
2
3
# 파드외부에서 실행, 즉 HostOS에서 실행함.
# kubectl port-forward pod/[파드명] [로컬에서의 포트]/[파드에서의 포트]
kubectl port-forward pod/nginx-pod 80:80
4. yaml & 빌드
1. SpringBoot
1. Dockerfile (기존 Docker 설정과 동일)
1
2
3
4
5
FROM eclipse-temurin:17-jdk
COPY build/libs/*SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
2. 중간과정(Docker와 동일함.)
- Spring Boot 프로젝트 빌드하기
./gradlew clean build - Dockerfile을 바탕으로 이미지 빌드하기 ` docker build -t spring-server .`
- 도커 이미지 확인
docker image ls
3.메니페스트 작성
1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Pod
metadata:
name: spring-pod
spec:
containers:
- name: spring-container
image: spring-server
ports:
- containerPort: 8080
imagePullPolicy: Always
- 이미지 pull 정책
- Always(Default값) : 로컬에서 이미지를 가져오지 않고, 무조건 레지스트리(= Dockerhub, ECR과 같은 원격 이미지 저장소)에서 가져옴
- IfNotPresent : 만약 로컬에 이미지가 없는 경우에만 레지스트리에서 가져옴
- Never : 로컬에서 이미지를 먼저 가져옴
4. 실행은 동일
kubectl apply -f spring-pod.yaml
2. 다중 Container
1. 메니페스트파일에서 반복 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apiVersion: v1
kind: Pod
metadata:
name: spring-pod-1
spec:
containers:
- name: spring-container
image: spring-server
imagePullPolicy: IfNotPresent ports:
- containerPort: 8080
---
apiVersion: v1
kind: Pod
metadata:
name: spring-pod-2
spec:
containers:
- name: spring-container
image: spring-server
imagePullPolicy: IfNotPresent ports:
- containerPort: 8080
---
apiVersion: v1
kind: Pod
metadata:
name: spring-pod-3
spec:
containers:
- name: spring-container
image: spring-server
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
This post is licensed under CC BY 4.0 by the author.