Kubernetes 맛보기

처음부터 쿠버네티스의 구조 및 작동원리 등을 배우는 것은 쿠버네티스를 처음에 배우는 사람에게는 자칫 지루해질 수도 있고 클러스터 관리자가 아닌 사용자 입장에서는 불필요할 수도 있다… 먼저 쿠버네티스에 등장하는 핵심 개념부터 몇개 살펴보자.

스토리텔링: NGINX 가 돌아가는 홈서버를 구축해보자.

  1. A씨는 설 명절에 집에서 할 것이 없어 간단하게 NGINX 가 돌아가는 홈서버를 구축보려 한다. 먼저 A씨는 감자마켓에서 서버로 사용할 컴퓨터를 하나 구입하고, 거기에 NGINX 를 설치한다.

  1. 설치를 완료한 후 localhost 로 접속해보니 잘 작동한다. 하지만 A씨는 조금 더 욕심을 내어 자신의 사이트를 외부에서도 접속이 되게 하고 싶다. 이를 위해 라우터를 설치하고 외부 접속을 위한 설정을 한다.

  1. A씨가 자신의 홈서버를 주변에 열심히 소문낸 결과, 접속자 수가 폭증하기 시작했다. A씨는 이에 대응하기 위해 동일한 서버를 한대 더 구비해 부하를 분산하고자 한다. 하지만 시간이 부족한 A씨는 친구 B씨를 데려와 서버 관리를 부탁한다. B씨는 한대가 고장나면 곧바로 다른 서버를 설치하는 등 항상 두개의 서버가 작동하고 있게 노력한다.

  1. 서버들을 사용하던 중, A씨는 서버들의 데이터를 외부에 보관하면 좋겠다는 생각을 하게 된다. 따라서 A씨는 외부 스토리지서버를 한대 구입한 후, 각 서버들이 사용할 수 있게 설정하였다.

위의 이야기를 그대로 쿠버네티스로…

  1. Pod: 파드는 A씨가 설치한 서버에 비유될 수 있는 개념으로, 쿠버네티스에서 가장 작은 컴퓨팅 유닛 오브젝트이다.
    • 서버에 여러개의 프로세스가 돌아갈 수 있는 것처럼, 파드에도 여러개의 프로세스가 작동할 수 있으며 이때 프로세스들은 컨테이너 형태로 구성된다.
  2. Service: 파드를 클러스터 내외부에 노출시켜 네트워크를 통해 접근할 수 있게 하는 오브젝트이다.
  3. Deployment: 파드를 관리하는 관리자로 비유될 수 있는 개념으로, 지정해준 개수의 파드가 항상 작동할 수 있도록 보장해주는 역할을 한다.
    • 엄밀히 말하면, 파드의 개수를 일정하게 유지시키는 것은 ReplicaSet 의 역할로, Deployment 는 ReplicaSet 를 관리하며 롤링 업데이트 등의 추가적인 기능을 제공한다.
    • 즉, Pod -> ReplicaSet -> Deployment 로 소속관계를 표현할 수 있다.
  4. Volume: 파드의 컨테이너가 사용할 수 있는 볼륨이다.

NGINX 배포 실습

Volume 관련 부분은 실습이 어렵기 때문에 일단은 제외하였습니다.

Pod 생성하기

  • 파드 생성
kubectl run nginx --image=nginx:stable
  • 생성된 파드 확인
kubectl get pod nginx
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          7m26s

Deployment 생성하기

  • 하지만, 파드를 단독으로 생성하는 경우는 거의 없고, Deployment 등의 다른 오브젝트를 생성하여 파드가 생성되도록 하는 것이 일반적이다.
  • 디플로이먼트 생성하기
kubectl create deployment nginx --image nginx:stable
  • 생성된 디플로이먼트 확인
kubectl get deployment nginx
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           3m42s
  • 디플로이먼트의 가장 중요한 역할은 파드를 여러개로 복제하고 항상 일정한 개수가 유지되도록 하는 것이다. 다음의 명령어를 통해 파드의 개수를 증가시켜보자.
kubectl scale deployment nginx --replicas 3
  • 디플로이먼트 확인
kubectl get deployment nginx
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           5m21s

Service 생성하기

본 실습에서는 LoadBalancer 타입의 서비스를 생성하는데, 이에 대한 자세한 내용은 이후에 배운다.

  • 다음의 명령어를 통해 Service 를 생성할 수 있다.
kubectl expose deployment nginx --type LoadBalancer --name nginx --port 80
  • 생성된 Service 확인
kubectl get service nginx
NAME    TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
nginx   LoadBalancer   10.103.178.141   localhost     80:32560/TCP   53s
  • 브라우저를 통해 localhost 로 접속해보면 다음과 같은 화면을 볼 수 있다.

리소스 삭제하기

  • 이후의 실습을 위해 생성했던 리소스들을 삭제한다.
  • 생성한 리소스는 kubectl delete $RESOURCE $NAME 을 통해 삭제할 수 있다.
kubectl delete pod nginx
kubectl delete deployment nginx
kubectl delete service nginx

YAML 을 이용해 배포하기

  • kubectl create deployment ... 등의 명령어를 통해 리소스들을 생성하는 것 이외에도, 리소스를 정의하는 YAML 파일을 통해 생성하는 것도 가능하다.
  • YAML 파일을 이용할 때에는 create 혹은 apply 명령어에 -f 옵션을 이용하여 파일을 명시해 주면 된다.

기본적으로 create 는 생성 명령어이고 apply 는 변경 명령어이나 생성에도 사용할 수 있습니다. 하지만, create 로 생성한 리소스에 apply 를 하게 되면 경고 문구가 출력되니 변경의 가능성이 적은 리소스는 create 를 사용하고 그렇지 않은 리소스는 apply 를 이용할 것을 권장합니다.

kubectl create -f $YAML_FILE
kubectl apply -f $YAML_FILE
  • 그럼 이제 위에서 배포한 것을 동일하게 YAML 파일로 배포하는 것을 실습해 보자.

NGINX 를 YAML 을 이용해 배포하기

  • 아래의 두 YAML 파일을 배포하면, 위 실습에서 생성했던 Deployment 와 Service 를 동일하게 배포할 수 있다.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:stable
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

YAML 을 이용하는 이유: 리소스의 코드화 (Infrastructure as Code, IaC)

  • YAML 파일을 이용하면 쿠버네티스 클러스터에 생성된 리소스들을 코드로써 관리할 수 있으며, 여기에는 다음과 같은 장점이 있다.
    1. 리소스 생성과 편집, 삭제가 간편해진다.
      • YAML 파일을 이용해 리소스를 생성하고, YAML 파일을 편집해 리소스를 변경하며, YAML 파일을 이용해 리소스를 삭제할 수 있다.
    2. git 과 같은 버전 관리 툴을 이용하여 변경 이력 추적을 간편하게 할 수 있다.
  • 코드로 관리하는 것 이외에도, YAML 파일을 이용하면 cli 툴에서 제공하지 않는 다양한 설정들이 가능하다.

추가적인 Kubectl 명령어

Kubectl get -o 옵션

  • -o wide: 기본 제공되는 정보 이외의 추가적인 정보들을 같이 출력한다.
kubectl get $RESOURCE $NAME -o wide
kubectl get deployment nginx -o wide
  • -o yaml: 배포된 리소스의 상태를 YAML 포맷으로 조회한다.
kubectl get $RESOURCE $NAME -o yaml
kubectl get deployment nginx -o yaml

Kubectl describe 명령어

  • describe 명령어는 배포된 리소스의 자세한 정보를 출력해준다.
kubectl describe $RESOURCE $NAME
kubectl describe deployment nginx