쿠버네티스 오브젝트란 쿠버네티스 API 서버로 생성하는 영속성을 가지는 모든 실체를 말한다. 애플리케이션을 실행하고 애플리케이션에 필요한 추가 리소스를 지정하고 고가용성 관련 설정을 하는 등 일련의 모든 쿠버네티스 작업은 다양한 오브젝트와 해당 오브젝트 옵션의 조합으로 실행한다.
쿠버네티스의 모든 오브젝트(파드, 디플로이먼트, 네임스페이스 등)는 API 서버로 생성하며, 사용자가 쿠버네티스 명령어를 실행하면 쿠버네티스는 해당 명령어의 API를 호출해서 오브젝트를 실행하는 방식으로 동작한다.
파드(Pod)는 쿠버네티스 환경에서 컨테이너 애플리케이션을 실행하는 기본 단위이다. 일반적으로 단일 컨테이너만 실행하지만 2개 이상의 컨테이너도 하나의 파드 안에서 실행 가능하다. 각 파드는 고유한 IP 주소와 볼륨을 소유한다.
쿠버네티스에서 컨테이너 형태의 애플리케이션을 실행하는 명령어는
$ kubectl run
이다.
$ kubectl get pod
$ kubectl get {object name}
으로 확인하면 된다.
$ kubectl get pod -o wide
로 확인한다.
앞서 말했듯이, 하드는 각기 고유의 IP주소를 가지며, 각각 고유의 볼륨(데이터)를 사용한다. 기본적으로 개별 파드가 사용하는 볼륨은 호스트 노드의 /var/lib/containers/{pod name}
디렉터리다. 해당 디렉터리에 각 파드별로 디렉터리가 구분돼 있다. 다시말해 파드별로 각기 고유한 네트워크와 스토리지를 가진다.
쿠버네티스에서는 파드 접속이 파드에 배시(bash)를 실행(exec)하는 것과 동일하다. 가상 머신 환경에서 원격 가상 머신에 ssh로 접속하는 것과 유사하다.
## 현재 떠 있는 파드 이름 확인
$ k get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 4d3h
nginx01 1/1 Running 0 5m23s
## 파드 접속(파드의 bash 실행)은 'exec -it - bash' 명령어 사용
$ kubectl exec -it nginx --bash
root@nginx:/# ps
bash: ps: command not found
## ps를 실행하기 위해 procps 패키지 설치
root@nginx:/# apt -y update && apt -y install procps
## 전체 프로세스 목록 확인
root@nginx:/# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 11424 7532 ? Ss Oct09 0:00 nginx: master process nginx -g daemon off;
nginx 29 0.0 0.0 11888 3024 ? S Oct09 0:00 nginx: worker process
nginx 30 0.0 0.0 11888 3024 ? S Oct09 0:00 nginx: worker process
nginx 31 0.0 0.0 11888 3024 ? S Oct09 0:00 nginx: worker process
nginx 32 0.0 0.0 11888 3024 ? S Oct09 0:00 nginx: worker process
root 33 0.0 0.0 4188 3412 pts/0 Ss 10:52 0:00 bash
root 223 0.0 0.0 8100 4064 pts/0 R+ 10:54 0:00 ps aux
## 실행중인 프로세스 개수
root@nginx:/# ps aux | wc -l
9
nginx 파드에서 실행 중인 전체 프로세스 목록을 확인(ps aux)하면 nginx 프로세스만 실행 중이고 다른 프로세스는 없는 것을 확인할 수 있다.
일반 가상 머신과 실행 중인 프로세스 목록을 비교하면 실행 중인 프로세스의 수가 아주 적은 것을 확인할 수 있다. 컨테이너는 가상 머신과 다르게 특정 프로세스만 실행중이며, 이미지 크기가 작고 실행 속도 역시 몇 초 내외로 매우 빠르다.
파드의 개수를 변경하려면 쿠버네티스 오브젝트 타입을 파드가 아닌 디플로이먼트(deployment)로 실행한다.
디플로이먼트(deployment)는 파드가 배포(deploy)되는 방법을 정의하는 오브젝트로서 파드의 개수, 이미지 종류, 배포 방법 등을 정의한다.
## 아파치 웹서버(httpd)이미지를 사용하는 디플로이먼트 생성
$ kubectl create deployment httpd --image=httpd
deployment.apps/httpd created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
httpd-65bfffd87f-222g6 1/1 Running 0 48s
nginx 1/1 Running 0 4d4h
디플로이먼트는 '[디플로이먼트 이름] + [임의의 해쉬값]'으로 파드 이름을 지정한다.
## --replicas에 원하는 파드 수량 입력
$ kubectl scale deployment httpd --replicas 10
deployment.apps/httpd scaled
## -w (waiting) 옵션
$ k get pod -w
NAME READY STATUS RESTARTS AGE
httpd-65bfffd87f-222g6 1/1 Running 0 3m31s
httpd-65bfffd87f-5xg7f 0/1 ContainerCreating 0 3s
httpd-65bfffd87f-8kf4g 0/1 ContainerCreating 0 3s
httpd-65bfffd87f-9lwfs 0/1 ContainerCreating 0 3s
httpd-65bfffd87f-dljwh 0/1 ContainerCreating 0 3s
httpd-65bfffd87f-f9ffs 0/1 ContainerCreating 0 3s
httpd-65bfffd87f-gpsl9 0/1 ContainerCreating 0 3s
httpd-65bfffd87f-lsfg8 0/1 ContainerCreating 0 3s
httpd-65bfffd87f-psrk8 0/1 ContainerCreating 0 3s
httpd-65bfffd87f-x7jx5 0/1 ContainerCreating 0 3s
nginx 1/1 Running 0 4d4h
nginx01 1/1 Running 0 29m
httpd-65bfffd87f-lsfg8 1/1 Running 0 3s
httpd-65bfffd87f-9lwfs 1/1 Running 0 4s
## --replicas=0 이면, 파드가 0개가 됨
$ k scale deployment httpd --replicas=0
deployment.apps/httpd scaled
## 확인해보면 httpd 이름을 가진 파드가 없음
$ k get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 4d4h
nginx01 1/1 Running 0 31m
## 다시 httpd 파드 1개 생성
$ k scale deployment httpd --replicas 1
deployment.apps/httpd scaled
$ k get pods
NAME READY STATUS RESTARTS AGE
httpd-65bfffd87f-hrxc7 0/1 ContainerCreating 0 3s
nginx 1/1 Running 0 4d4h
nginx01 1/1 Running 0 31m
디플로이먼트를 사용하면 임의로 파드의 수량을 늘리고 줄일 수 있다.
## 파드를 삭제 해봄
$ kubectl delete pod httpd-65bfffd87f-hrxc7
pod "httpd-65bfffd87f-hrxc7" deleted
## 기존 파드는 삭제되고 자동으로 새로운 파드가 생성 됨
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
httpd-65bfffd87f-9fpth 1/1 Running 0 10s
nginx 1/1 Running 0 4d4h
nginx01 1/1 Running 0 33m
삭제했지만 자동으로 파드가 생성되는 이유는 디플로이먼트는 속성으로 파드의 수량을 가지기 때문이다. 앞에서 파드의 수량을 1로(--replicas=1) 지정했었다. 의도한 상태의 파드 수량이 1이므로 시스템 장애 등에 의해 파드가 삭제되면 쿠버네티스는 해당 파드를 감시하고 있다가 자동으로 처음 의도한 상태인 파드 수량을 1로 유지하기 위해 자동으로 파드를 생성한다. 이를 자동 복구라고 한다.
## 디플로이먼트에서 현재 지정한 파드 수량과 실행중인 파드 수량 확인
$ kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
httpd 1/1 1 1 11m
## ns=namespace, 네임스페이스를 줄여서 ns로 사용 가능
$ kubectl create ns default01
namespace/default01 created
## 같은 네임스페이스 내에서는 동일한 이름으로 파드를 중복으로 생성할 수 없음
$ k run nginx --image=nginx
pod/nginx created
$ k run nginx --image=nginx
Error from server (AlreadyExists): pods "nginx" already exists
## 네임스페이스를 변경
$ k ns default01
Context "naritest-aks" modified.
Active namespace is "default01".
$ k run nginx --image=nginx
pod/nginx created
'역할 기반 접근 제어 설정'인 RBAC(Role-Based Access Control)을 이용하면 각 애플리케이션별로 개발자의 역할을 분리해서 각 개발자별로 특정 네임스페이스의 권한(create, get, delete emd)만 갖도록 설정 가능하다. 네임스페이스는 각 개발 담당자 별로 권한을 제한 할 때 구문하는 단위로 사용하기도 한다.
하지만 네임스페이스는 클러스터를 가상으로 구분하는 단위라서 물리적으로 완전하게 분리하지는 못한다. 기본 설정으로 임의의 네임스페이스에서 다른 네임스페이스로 네트워크 연결이 가능하다. 네임스페이스는 네트워크까지 차단되어 물리적으로 완전히 분리되는 환경을 제공하지는 않고 가상 수준에서 클러스터를 분리할 수 있다.