Kubernetes - 쿠버네티스개념, Pod
쿠버네티스란?
오케스트레이션을 보고나면 지휘자가 어느곳은 약하게 강하게 이런지휘를 하게 된다 또 어떤곳을 연주할지랑 조율을 자주한다
이런이미지를 인프라에 대입시켜보면 쿠버네티스는 인프라 관리지휘를 하는 역할을하는것이다.
개발적으로는 컨테이너가 악기들이며 이러한 다수의 컨테이너를 효율적으로 배포, 확장 및 관리하기 위한 오픈소스이다.
DokcerCompose와 비슷하지만 DockerCompose의 확장판이라고 생각하자
쿠버네티스 장점
- 컨테이너 관리 자동화(배포, 확장, 업데이트)
- 부하 분산(로드 밸런싱)
- 쉬운 스케일링 (매니페스트 파일로 간단)
- 셀프 힐링
Pod
도커에서는 하나의 프로그램을 실행시키는 단위를 컨테이너
쿠버네티스에서는 파드라고 부른다. 파드는 일반적으로 쿠버네티스에서 하나의 프로그램을 실행시키는 단위라고 기억하자
- 쿠버네티스에서 가장 작은 단위
- 일반적으로 하나의 파드가 하나의 컨테이너를 가진다(여러개 가질 수 있다)
쿠버네티스도 도커처럼 이미지를 기반으로 파드를 띄워 실행시킨다
그런데 궁금한점이 있다
도커허브는 도커이미지 저장소인데 쿠버네티스도 이미지를 띄우는데 도커랑 호환되는건가?
쿠버네티스는 컨테이너 런타임(Container Runtime)을 사용해 컨테이너를 실행하는데, 도커도 이 컨테이너 런타임 중 하나로 동작할 수 있었습니다. 하지만 몇 가지 중요한 점이 있습니다:
- 쿠버네티스는 기본적으로 OCI(Open Container Initiative) 표준을 따르는 컨테이너 이미지를 실행할 수 있습니다. 도커 이미지도 이 표준을 따르기 때문에 쿠버네티스에서 문제없이 실행됩니다.
- 쿠버네티스는 컨테이너를 실행할 때, 컨테이너 런타임 인터페이스(CRI: Container Runtime Interface)를 통해 컨테이너 런타임과 통신합니다.
정리하면 쿠버네티스는 OCI표준을 따르는 컨테이너 이미지를 실행하는데 도커이미지도 OCI표준을 따르기 때문에 이상없이 실행시키는 것이다
파드를 띄우는 방법
매니패스트 파일이나 직접 명령어(CLI)이다
주로 매니패스트 파일로 한다 왜냐하면 형상관리가 되고 직접치는것보다 파일에 적어서 파일만 실행시키면 편하기 때문이다
매니패스트 파일은 어찌보면 Dockerfile과 비슷하다
파드로 띄운 프로그램에 직접 접속이 안 되는 이유
도커에 대해서 공부했을 때는 컨테이너 내부와 컨테이너 외부의 네트워크가 서로 독립적으로 분리되어 있다 = 도커 컨테이너마다 아이피가 독립적이다(자체 IP주소와 네트워크 공간을 갖는다) 그래서 접속이 안되는 것이다.
자세하게 알려면 Docker네트워크에 대해 공부하자.
컨테이너 A의 IP: 172.17.0.2
컨테이너 B의 IP: 172.17.0.3
따라서 직접 호출하는 방법은 2가지가 있다
- 파드내부에 들어가기
- 포트포워딩 활용하기
이미지 풀 정책(Image Pull Policy)
ImagePullBackOff라는 에러가 발생했다.
왜 발생했냐면 쿠버네티스가 yaml 파일을 읽어들여 파드를 생성할 때, 이미지를 레지스트리(Dockerhub, ECR, Harbor)에서 가져올려고 해서 발생한것이다.
이미지 풀 정책(Image Pull Policy)이란 쿠버네티스가 yaml 파일을 읽어들여 파드를 생성할 때, 이미지를 어떻게 Pull을 받아올 건지에 대한 정책을 의미한다. 어떤 정책들이 있는 지 알아보자.
- Always : 로컬에서 이미지를 가져오지 않고, 무조건 레지스트리(= Dockerhub, ECR과 같은 원격 이미지 저장소)에서 가져온다.
- IfNotPresent : 로컬에서 이미지를 먼저 가져온다. 만약 로컬에 이미지가 없는 경우에만 레지스트리에서 가져온다.
- Never : 로컬에서만 이미지를 가져온다.
이렇게 3가지가 있다
그래서 매니패스트 파일을 수정해보자
apiVersion: v1
kind: Pod
metadata:
name: spring-pod
spec:
containers:
- name: spring-container
image: spring-server
ports:
- containerPort: 8080
imagePullPolicy: Always # 여기가 이미지 풀 정책 정하는곳이다
매니패스트 파일에서 궁금증
ports:
- containerPort: 8080
왜 containerPort라고 하는건가? - 포트종류에 대해서는 다음에 더 공부해야겠다
Kubernetes에서는 네트워크 설정 시 여러 종류의 포트를 다룰 수 있습니다.
containerPort는 컨테이너 내부의 포트를 의미하고, 외부에서 접근할 때는 다른 포트(예: NodePort, ServicePort 등)를 사용할 수 있습니다.
즉 Kubernetes에서는 다양한 포트가 있기 때문이다
- containerPort: 해당 컨테이너의 애플리케이션이 내부적으로 사용하고 있는 포트
- hostPort: 컨테이너가 실행되는 노드(호스트)에서 열리는 포트를 지정. curl http://<node-ip>:hostPort
- nodePort : Kubernetes 클러스터의 노드(물리/가상 머신)에서 열리는 포트. Service를 통해 외부 트래픽을 Pod로 전달할 때 사용합니다.
- targetPort : Service에서 트래픽을 Pod의 containerPort로 전달할 때 매핑되는 포트입니다
파드내부에 들어가서 디버깅해야할때 파약할 폴더들
파드 디버깅 방법
파드가 실행되는경우와 실행되지 않는경우 경우에따라 디버깅하는방법이 다르다.
먼저, 파드가 정상적으로 실행되지 않는경우
1. kubectl get pods 로 파드가 잘 생성됐는 지 파드 조회해본다. 그러면 STATUS에 어떤문제가 생겼는지 확인이 가능하다
2. 에러메시지 확인 옆의 명령어를 쳐서 kubectl describe pods [파드명]
파드가 정상적으로 실행되고나서 로그 보고싶은경우
- 파드 내부로들어가서 로그파일 확인하기
- 파드의 로그 확인하기 kubectl logs [파드명]
정리하면 실행안되면 describe 실행되면 파드내부나 logs명령어를 통해 확인하자
파드 내부로 들어갔는데 어떤 파일을 확인해야 할까?
애플리케이션에서 에러가 발생했다면 로그파일을 확인하자
일반적으로 /var/log디렉터리 안에 저장된 로그파일이 많다. 또 다른 파일들이 여러가지 있다 네트워크 문제인경우나 등등