
워크로드 = 파드의 집합 내에서 실행되는 애플리케이션.
파드 = 클러스터에서 실행중인 컨테이너의 집합
워크로드 리소스 = 사용자 대신 pod를 관리해줌 (Deployment, ReplicaSet...)
컨테이너의 집합이자 컨테이너 실행환경으로, 애플리케이션을 배포하기 위한 기본 단위이다.
일반적으로 파드를 직접 생성하지는 않고 디플로이먼트 등 워크로드 리소스 사용하여 생성하며,
특별한 이유 없다면 하나의 파드에는 하나의 컨테이너가 사용된다.
파드는 private ip 만 가지고 있기 때문에 외부에서 접근하기 위해서는 service 라는 오브젝트를 생성해야 함. (클러스터 노드에 ssh 접속해서 직접 접근은 가능)
쿠버네티스에서 도커 컨테이너가 아닌 '파드'라는 새로운 개념을 사용하는 이유는 여러 컨테이너들을 추상화된 집합으로 사용하기 위해서이다.
파드 안의 컨테이너들은 리눅스 네임스페이스의 공유 개념을 사용하여, 스토리지, 네트워크, 구동 방식을 공유하며 함께 스케줄되고 공유 컨텍스트에서 실행됨. (여러 컨테이너들이 cgroup 등으로 격리된 상태에서 공유 네임스페이스, 공유 파일시스템 갖는 환경 상상하면 된다.)
어떤 경우에 하나의 컨테이너/여러 컨테이너로 파드를 구성해야 할까?
-> 파드 = 하나의 완전한 애플리케이션이 되도록 잘 구성하기...
apiVersion: v1
kind: Pod
metadata:
name: my-nginx-pod
spec:
containers:
- name: my-nginx-container
image: nginx:latest
ports:
- containerPort: 80
protocol: TCP
- name: ubuntu-sidecar-container
image: alicek106/rr-test:curl
command: ["tail"]
args: ["-f", "/dev/null"] # 포드가 종료되지 않도록 유지합니다
위 예시에서는 엔진엑스 컨테이너 + 빈 우분투 컨테이너를 사용해 파드를 생성했다. 파드 내의 컨테이너들은 동일한 네트워크 환경을 가지므로 우분투 컨테이너의 로컬호스트에서 nginx 서버로 접근이 가능하다.
컨테이너 이미지란 모든 소프트웨어 의존성과 애플리케이션을 캡슐화한 실행 가능한 소프트웨어 번들.
일반적으로 애플리케이션의 컨테이너 이미지를 레지스트리에 푸시한 다음 파드에서 이미지를 참조하도록 구성하여 배포함
일정 개수의 파드를 유지해주는 컨트롤러
쿠버네티스는 보통 동일한 여러 외부 요청을 여러 파드로 적절히 분배하기 때문에 동일한 여러 파드가 필요하다. 레플리카셋은 정해진 수의 동일한 파드가 항상 실행되도록 관리하는 역할을 한다. (노드에 장애가 생기면 다른 노드에 파드를 새로 생성하는 등..)
레플리카셋에 정의된 라벨 셀렉터를 이용해 파드와 느슨한 연결을 유지한다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-nginx
spec:
replicas: 3
selector:
matchLabels:
app: my-nginx-pods-label
template: # 파드 템플릿 정의
metadata:
name: my-nginx-pod
labels:
app: my-nginx-pods-label
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
위와 같은 레플리카셋을 생성하면 app: my-nginx-pods-label 이라는 라벨을 가진 파드의 개수가 3개가 되도록 파드를 관리한다.
애플리케이션을 배포하고 관리하는 역할 담당.
실제 운영환경에서는 파드, 레플리카셋을 직접 사용하는 대신 디플로이먼트를 사용해 애플리케이션을 배포한다.
애플리케이션 업데이트 시 레플리카셋의 변경사항을 저장하는 리비전을 남겨 문제가 생기면 이전 버전으로 롤백 가능하게 해주고, 무중단 서비스를 위해 파드의 롤링 업데이트 전략을 지정할 수도 있다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-nginx
template:
metadata:
name: my-nginx-pod
labels:
app: my-nginx
spec:
containers:
- name: nginx
image: nginx:1.10
ports:
- containerPort: 80
kubelet 이 특정 이미지를 pull 하려고 할때
프로덕션 환경에서 이미지 버전 :latest 태그 사용은 지양하자
imagePullBackOff 오류: 쿠버네티스가 어떤 이유로 컨테이너 이미지를 가져올수 없을때 (쿠버네티스는 계속 이미지 가져오려고 시도함)
쿠버네티스 공식문서
시작하세요 도커 쿠버네티스