kubectl 명령어로 익히는 쿠버네티스의 주요 오브젝트
kubectl의 주요 명령어와 쿠버네티스의 주요 오브젝트(파드, 디플로이먼트, 네임스페이스 등)를 알아보자.
쿠버네티스에서는 kubectl 명령어로 쿠버네티스 오브젝트를 생성하고 생성한 리스트들을 확인할 수 있다.
이번에 알아볼 kubectl 주요 명령어들은 다음과 같다.
- run, create : 파드와 디플로이먼트 생성
- get, exec : 생성된 파드 현황 조회 및 파드 내 bash 스크립트 실행(파드 접속)
- scale, delete : 파드의 수량 증가/감소 및 오브젝트 삭제
- create namespace : 네임스페이스 생성
쿠버네티스 오브젝트란 쿠버네티스 API 서버로 생성하는 영속성을 가지는 모든 실체를 말한다.
애플리케이션을 실행하고 애플리케이션에 필요한 추가 리소스를 지정하고 고가용성 관련 설정을 하는 등 일련의 모든 쿠버네티스 작업은 다양한 오브젝트와 해당 오브젝트 옵션의 조합으로 실행한다.
쿠버네티스의 모든 오브젝트는 API 서버로 생성한다.
사용자가 쿠버네티스 명령어를 실행하면 쿠버네티스는 해당 명령어의 API를 호출해 오브젝트를 실행하는 방식으로 동작한다.
복잡한 옵션의 오브젝트 APU 호출이 필요한 경우에는 명령어가 아닌 YAML 파일을 사용한다.
NGINX 파드 실행과 bash 실행
파드를 생성하고 파드에 접속하는 실습을 해보자.
파드 : 쿠버네티스 환경에서 컨테이너 애플리케이션을 실행하는 기본 단위
일반적으로 단일 컨테이너만 실행하지만 2개 이상의 컨테이너도 하나의 파드 안에서 실행 가능하다.
이제, 파드를 직접 만들어보자.
쿠버네티스에서 컨테이너 형태의 애플리케이션을 실행하는 명령어는 kubectl run이다.
--help 옵션으로 명령어의 사용법을 확인할 수 있다.
이제 다음 명령어로 nginx라는 이름의 NGINX 컨테이너 이미지를 갖는 파드를 실행하자.
kubectl run nginx --image=nginx
alias 등록해둔 kgp(kubectl get pod -o wide) 명령어로 실행 중인 파드의 목록을 확인할 수 있다.
kubectl get pod -A -o wide
명령어로 모든 네임스페이스의 파드를 조회할 수도 있다.
위 사진을 보면 모든 파드가 고유의 IP 주소를 가지는 것도 확인할 수 있다.
파드는 고유의 IP 주소, 고유의 볼륨(데이터)를 사용한다. (각각의 네트워크와 스토리지를 갖는다는 말)
기본적으로 개별 파드가 사용하는 볼륨은 호스트 노드의 /var/lib/containers/{파드 이름} 디렉터리이다.
해당 디렉터리에 각 파드별로 디렉터리가 구분돼 있다.
이번에는 파드에 접속해서 더 자세한 정보를 확인해보자.
쿠버네티스에서의 파드 접속은 파드에 배시(bash)를 실행(exec)하는 것과 같다.
(가상 머신 환경에서 원격 가상 머신에 ssh로 접속하는 것과 유사)
kubectl exec -it {파드 이름} -- bash
이 명령어를 처음 볼 때 들었던 궁금증이 있다.
난 zsh(oh-my-zsh)을 쓰는데, bash말고 zsh을 입력해야 하나?
아니다. 그래도 bash를 입력해야 한다. 로컬에서 사용하는 쉘의 종류는 상관없다.
kubectl exec 명령어는 컨테이너 내부의 bash를 실행하는 명령어이기 때문이다.
아래 명령어로 컨테이너 내부에 어떤 쉘이 설치되어 있는지 확인할 수 있고, bash 대신 zsh로 명령어를 입력하면 오류가 나는 것도 확인할 수 있다.
이제 다시 돌아가서, ps를 실행하기 위해 procps 패키지를 설치하자.
apt update && apt install -y procps
NGINX 파드에서 실행 중인 전체 프로세스 목록을 확인하면 nginx 프로세스만 실행 중이고 다른 프로세스는 없는 것을 확인할 수 있다. 일반 가상 머신과 실행 중인 프로세스 개수(아래 사진)를 비교하면 수가 아주 적은 것을 확인할 수 있다.
디플로이먼트의 파드 개수 변경과 삭제
이번에는 파드의 개수를 변경하고 삭제하는 작업을 해보자.
파드의 개수를 변경하려면 쿠버네티스 오브젝트 타입을 파드가 아닌 디플로이먼트(deployment)로 실행해야 한다.
디플로이먼트는 파드가 배포(deploy)되는 방법을 정의하는 오브젝트로서 파드의 개수, 이미지 종류, 배포 방법 등을 정의한다.
디플로이먼트는 아래 명령어를 사용한다.
kubectl create deployment
아파치 웹서버(httpd) 이미지를 사용하는 디플로이먼트를 생성해보자.
kubectl create deployment httpd --image=httpd
디플로이먼트는 {디플로이먼트 이름} + {해쉬값}으로 파드의 이름을 지정한다.
kubectl scale 명령어로 파드 개수를 10개로 변경해보자.
kubectl scale deployment httpd --replicas 10
명령어 입력 후 kubectl get pod -w 명령어를 입력하면, 실시간으로 변경되는 파드의 수량도 확인할 수 있다. (-w 옵션 : watch)
kubectl scale 명령어는 인자로 디플로이먼트 이름과 수량을 받는다.
위처럼 --relicas={수량} 옵션으로 파드 수량을 조정할 수 있다.
이번에는 파드 삭제를 해보자.
쿠버네티스의 모든 오브젝트는 아래 명령어로 삭제할 수 있다.
kubectl delete {오브젝트} {이름}
삭제를 요청한 파드(파란색 해시값)은 삭제가 됐는데, httpd 파드(빨간색 해시값)가 새롭게 생성됐다.
쿠버네티스는 항상 의도한 상태를 자동으로 유지하려고 하기 때문이다.
디플로이먼트는 속성으로 파드의 수량을 갖는다. 앞에서 파드의 수량을 1로(--replicas 1) 지정했기 때문에 파드가 삭제되면 쿠버네티스는 자동으로 수량을 1로 유지한다.
아래 명령어로 디플로이먼트에서 지정한 파드 수량과 실행 중인 파드 수량을 확인할 수 있다.
네임스페이스 생성
쿠버네티스 오브젝트는 create 명령어로 생성할 수 있다.
대부분의 오브젝트는 주로 YAML 파일을 이용해 생성하지만, 간단한 오브젝트는 kubectl 명령으로도 생성할 수 있다.
대표적으로 디플로이먼트(deployment), 시크릿(secret), 네임스페이스(namespace) 등이 있다.
kubectl create ns {이름}
네임스페이스는 클러스터를 구분하는 가상 클러스터 단위이다.
같은 네임스페이스 내에서는 같은 이름의 오브젝트를 만들지 못하지만 네임스페이스가 다르면 같은 이름의 오브젝트를 생성할 수 있다.
기존에 실행중이던 파드와 디플로이먼트를 삭제한 뒤에 nginx 파드를 중복으로 생성해보자.
두번째 요청에서는 이미 존재한다고 에러가 나온다.
하지만, 좀 전에 생성한 default01로 네임스페이스를 변경하면 어떨까?
이번에는 잘 생성됐다.
현업에서는 네임스페이스를 주로 애플리케이션을 구분하는 단위로 사용한다고 한다.
예를 들어, 웹(NGINX), 웹 애플리케이션 서버(Tomcat), 데이터베이스(MySQL), 레디스(Redis) 등 각 애플리케이션마다 네임스페이스를 별도로 지정하는 것이다.
또, 나중에 다룰 RBAC(Rold-Based Access Control)을 이용하면 각 애플리케이션 별로 개발자의 역할을 분리해서 각 개발자별로 특정 네임스페이스의 권한(create, get, delete 등)만 갖도록 설정할 수도 있다고 한다.
그래서 현업에서는 네임스페이스를 각 개발 담당자 별로 권한을 제할할 때 구분하는 단위로 사용한다고 한다.
하지만 네임스페이스는 클러스터를 가상으로 구분하는 단위라서 물리적으로 완전하게 분리하지는 못한다.
예를 들어, 기본 설정으로 임의의 네임스페이스에서 다른 네임스페이스로 네트워크 연결이 가능하다.
다음 사진과 같이 2개의 네임스페이스에서 실행 중인 파드는 각 파드 간에 통신이 가능하다.
ping 실행을 위해 iputils-ping 패키지를 설치
default01 네임스페이스의 파드(10.233.87.12)에서 default 네임스페이스의 파드(10.233.82.12)로 통신이 가능하다.
이처럼 네임스페이스는 네트워크까지 차단되어 물리적으로 완전히 분리되는 환경을 제공하지는 않고 가상 수준에서 클러스터를 분리할 수 있다.