6.쿠버네티스의 주요 개념(리소스 개요,파드,네임스페이스,레플리카세트,디플로이먼트

docker container prune
docker container prune [options]
도커를 오래 사용하다 보면 디스케이 컨테이너와 이미지가 점점 늘어나게 된다. 이런 경우 prune 명령을 사용해 필요없는 컨테이너를 일괄 삭제할 수 있다.

docker image prune [options]
도커를 오래 사용하다 보면 디스케이 컨테이너와 이미지가 점점 늘어나게 된다. 이런 경우 prune 명령을 사용해 필요없는 이미지를 일괄 삭제할 수 있다.

docker system prune [options]
사용하지 않는 도커 이미지 및 컨테이너,볼륨,네트워크 등 모든 리소스를 일괄적으로 삭제할 수 있다.

쿠버네티스로 실행하는 애펄리케이션은 애플리케이션을 구성하는 다양한 리소스가 함께 연동해 동작한다.

리소스의 종류 및 용도

노드 : 컨테이너가 배치되는 서버
네임스페이스 : 쿠버네티스 클러스터 안의 가상 클러스터.
파드 : 컨테이너의 집합 중 가장 작은 단위로 컨테이너 실행 방법을 정의한다.
레플리카 세트: 같은 스펙을 갖는 파드를 여러개 생성하고 관리하는 역할을 한다.
디플로이먼트 : 레플리카 세트의 리비전을 관리한다.
서비스: 파드의 집합에 접근하기 위한 경로를 정의한다.
인그레스:서비스를 쿠버네티스 클러스터 외부로 노출시킨다.
컨피그맵 : 설정 정보를 정의하고 파드에 전달한다.
퍼시스턴트 볼륨 : 파드가 사용할 스토리지의 크기 및 종류를 정의.
퍼시스턴스 볼륨 클레임 : 퍼시스턴트 볼륨을 동적으로 확보.
스토리지 클래스 : 퍼시스턴트 볼륨이 확보하는 스토리지의 종류를 정의
스테이트풀 세트 : 같은 스펙으로 모두 동일한 파드를 여러개 생성하고 관리한다.
: 상주 실행을 목적으로 하지 않는 파드를 여러개 생성하고 정상적인 종료를 보장한다.
크론잡: 크론 문법으로 스케줄링되는 잡.
시크릿 : 인증 정보같은 기밀 데이터를 정의한다.
: 네임스페이스 안에서 조작 가능한 쿠버네티스 리소스의 규칙을 정의한다.
롤바인딩: 쿠버네티스 리소스 사용자와 롤을 연결 짓는다.
클러스터룰: 클러스터 전체적으로 조작 가능한 쿠버네티스 리소스의 규칙을 정의한다.
클러스터롤바인딩:쿠버네티스 리소스 사용자와 클러스터 롤을 연결 짓는다.
서비스 계정: 파드가 쿠버네티스 리소스를 조작할 때 사용하는 계정

쿠버네티스 클러스터와 노드

쿠버네티스 리소스 중에서 가장 큰 개념은 노드이다. 쿠버네티스는 클러스터 전체를 관리하는 서버인 마스터가 적어도 하나 이상 있어야 하며 쿠버네티스 클러스터는 마스터와 노드의 그룹으로 구성된다.

네임스페이스

쿠버네티스는 클러스터 안에 가상 클러스터를 또 다시 만들 수 있다. 이를 네임스페이스라 한다. 클러스터를 처음 구축하면 default, docker, kube-public, kube-system의 네임스페이스 4개가 이미 만들어져 있다.

파드

파드는 컨테이너가 모인 집합체의 단위로 적어도 하나 이상의 컨테이너로 이루어진다. 쿠버네티스에서는 결합이 강한 컨테이너를 파드로 묶어 일괄 배포한다.
파드 하나는 여러 노드에 걸쳐 배치될 수 없다. 함께 배포해야 정합성을 유지할 수 있는 컨테이너 등에도 해당 컨테이너를 같은 파드로 묶어두는 전략이 유용하다.
쿠버네티스에서는 관리용 서버인 마스터가 클러스터 전체를 제어하며 마스터 노드는 관리용 컴포넌트가 담긴 파드만 배포된 노드이다. 어플리케이션에 사용되는 파드는 배포할 수 없다.

파드생성 및 배포

파드생성은 kubectl만 사용해도 가능하지만, 버전관리 관점에서도 yaml파일로 정의하는것이 좋다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: v1  # 리소스의 유형을 지정하는 속성
kind: Pod
metadata: # 리소스에 부여되는 메타데이터. metadata.name 속성의 값이 리소스의 이름이 된다.
name: simple-echo
spec: # 리소스를 정의하기 위한 속성.
containers:
- name: nginx # 컨테이너 이름
image: gihyodocker/nginx:latest # 도커 허브에 저장된 이미지 태그값
env: # 환경변수
- name: BACKEND_HOST
value: localhost:8080
ports: # 컨테이너가 노출시킬 포트를 지정 (도커파일에서 지정한 경우 따로 지정할필요 x)
- containerPort: 80
- name: echo
image: gihyodocker/echo:latest
ports:
- containerPort: 8080

아래 명령어를 입력하여 클러스터에 배포할 수 있다.

1
2
3
$ kubectl apply -f simple-pod.yaml
$ kubectl get pod
를 입력하여 파드 정보를 볼 수 있다. READY에 분모는 파드에 정의된 컨테이너 수이고 분자는 실행 상태의 컨테이너 수 이다.

아래 명령어를 통해 파드안에 있는 컨테이너의 표준 출력을 화면에 출력할 수 있다.
뒤 -c는 컨테이너를 지정한것.

1
$ kubectl logs -f simple-echo -c echo

파드를 삭제하기 위해 다음명령어를 사용할 수 있다

1
$ kubectl delete pod simple-echo

매니페스트 파일로도 파드를 삭제할 수 있다. 이 경우 메니패스트에 작성된 리소스 전체가 삭제된다.

1
$ kubectl delete -f simple-pod.yaml

파드에는 각각 고유의 가상 IP주소가 할당된다. 이는 파드에 속하는 모든 컨테이너가 공유하며 이로인해 같은 파드 안의 모든 컨테이너의 가상 IP가 같기 때문에 컨테이너간 통신이 가능해진다.

레플리카세트

레플리카세트는 똑같은 정의를 갖는 파드를 여러개 생성하고 관리하기 위한 리소스다.

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
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: echo
labels:
app: echo
spec:
replicas: 3
selector:
matchLabels:
app: echo
template: # template 아래는 파드 리소스 정의와 같음
metadata:
labels:
app: echo
spec:
containers:
- name: nginx
image: gihyodocker/nginx:latest
env:
- name: BACKEND_HOST
value: localhost:8080
ports:
- containerPort: 80
- name: echo
image: gihyodocker/echo:latest
ports:
- containerPort: 8080

디플로이먼트

레플리카세트보다 상위에 해당하는 리소스로 디플로이먼트가 있다. 디플로이먼트는 어플리케이션 배포의 기본단위가 되는 리소스이다.
디플로이먼트의 정의는 레플리카세트의 정의와 크게 다르지 않다. 차이가 있다면 디플로이먼트가 레플리카세트의 리비전 관리를 할 수 있다는 점 정도다.

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
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo
labels:
app: echo
spec:
replicas: 3
selector:
matchLabels:
app: echo
template: # template 아래는 파드 리소스 정의와 같음
metadata:
labels:
app: echo
spec:
containers:
- name: nginx
image: gihyodocker/nginx:latest
env:
- name: BACKEND_HOST
value: localhost:8080
ports:
- containerPort: 80
- name: echo
image: gihyodocker/echo:patched
env:
- name: HOGE
value: fuga
ports:
- containerPort: 8080

레플리카세트의 생애주기

실제운영에서는 디폴로이먼트 매니페스트 파일을 통해 레플리카 세트를 다룬다.
디플로이먼트를 수정하면 레플리카세트가 새로 생성되고 기존 레플리카 세트와 교체된다.

레플리카 세트의 다양한 경우의 수

파드 개수만 수정할 경우 (replicas값을 3에서 4로) 레플리카세트가 새로 생성되지 않는다.

컨테이너 이미지가 수정된 경우 기존 파드는 단계적으로 정지된다. 또한 kubectl rollout history deployment echo를 입력해보면 새로운 리비전으로 변경된것을 확인할 수 있다.

롤백하기

undo를 실행하면 디플로이먼트가 바로 직전 리비전으로 롤백된다.

1
$ kubectl rollout undo deployment echo

디플로이먼트는 다음 명령어를 통해 삭제할 수 있다. 이와 관련된 레플리카세트와 파드가 함께 삭제된다.

1
$ kubectl delete -f simple-deployment.yaml
Share