연습 - Kubernetes 클러스터의 기능 탐색

완료됨

Kubernetes를 로컬로 실행할 때 여러 가지 옵션을 사용할 수 있습니다. 물리적 머신이나 VM에 Kubernetes를 설치하거나 AKS(Azure Kubernetes Service) 등의 클라우드 기반 솔루션을 사용할 수 있습니다.

그러나 이 연습의 목표는 단일 노드 클러스터가 포함된 Kubernetes 설치를 살펴보는 것입니다. 이 연습에서는 설정 및 해제가 쉬운 MicroK8s 환경을 구성하고 설치하는 방법을 알아봅니다. 그런 다음 Kubernetes Service를 배포하고 여러 인스턴스로 크기 조정하여 웹 사이트를 호스팅합니다.

참고 항목

이 연습은 선택 사항이며 연습에서 사용할 소프트웨어 및 리소스를 삭제하고 제거하는 방법을 보여 주는 단계를 포함합니다.

Docker에는 MiniKube, Kubernetes 지원 등의 동일한 기능을 수행하는 다른 옵션도 있습니다.

MicroK8s란?

MicroK8s는 단일 노드 Kubernetes 클러스터를 대상 워크스테이션 및 IoT(사물 인터넷) 디바이스에 단일 패키지로 배포하는 옵션입니다. Ubuntu Linux의 창시자인 Canonical은 원래 MicroK8을 개발하여 현재 유지 관리하고 있습니다.

Linux, Windows, macOS에 MicroK8s를 설치할 수 있습니다. 그러나 설치 지침은 운영 체제마다 약간 다릅니다. 사용자 환경에 가장 적합한 옵션을 선택합니다.

Linux에 MicroK8s 설치

MicroK8s의 Linux 설치는 단계 수가 가장 적은 설치 옵션입니다. 터미널 창으로 전환하고 다음 지침에 따라 명령을 실행합니다.

  1. MicroK8s 맞춤 앱을 설치합니다. 인터넷 연결 및 데스크톱 속도에 따라 이 단계를 완료하는 데 몇 분 정도 걸릴 수 있습니다.

    sudo snap install microk8s --classic
    

    설치에 성공하면 다음 메시지가 표시됩니다.

    2020-03-16T12:50:59+02:00 INFO Waiting for restart...
    microk8s v1.17.3 from Canonical✓ installed
    

이제 클러스터에 추가 기능을 설치할 준비가 되었습니다.

Windows에 MicroK8s 설치

Multipass를 사용하여 Windows에서 MicroK8s를 실행합니다. Multipass는 Linux, Windows, macOS용 간단한 VM 관리자입니다.

  1. GitHub에서 최신 릴리스의 Windows용 Multipass를 다운로드하여 설치합니다.

  2. 명령 콘솔에서 Multipass 시작 명령을 실행하여 microk8s-vm 이미지를 구성하고 실행합니다. 인터넷 연결 및 데스크톱 속도에 따라 이 단계를 완료하는 데 몇 분 정도 걸릴 수 있습니다.

    multipass launch --name microk8s-vm --memory 4G --disk 40G
    
  3. microk8s-vm에 대한 시작 확인을 받은 후 multipass shell microk8s-vm 명령을 실행하여 VM 인스턴스에 액세스합니다.

    multipass shell microk8s-vm
    

    멀티패스가 작동하면 Ubuntu VM에 액세스하여 클러스터를 호스팅하고 MicroK8s를 설치할 수 있습니다.

  4. MicroK8s 맞춤 앱을 설치합니다. 인터넷 연결 및 데스크톱 속도에 따라 이 단계를 완료하는 데 몇 분 정도 걸릴 수 있습니다.

    sudo snap install microk8s --classic
    

    설치되면 다음 메시지가 표시됩니다.

    2020-03-16T12:50:59+02:00 INFO Waiting for restart...
    microk8s v1.17.3 from Canonical✓ installed
    

이제 클러스터에 추가 기능을 설치할 준비가 되었습니다.

macOS에 MicroK8s 설치

macOS에서 MicroK8s를 실행하려면 Multipass를 사용합니다. Multipass는 Linux, Windows, macOS용 간단한 VM 관리자입니다.

  1. macOS에서 Multipass를 설치하는 두 가지 옵션이 있습니다. GitHub에서 최신 릴리스의 macOS용 Multipass를 다운로드하여 설치하거나, brew cask install multipass 명령으로 Multipass를 설치하려면 Homebrew를 사용합니다.

    brew install --cask multipass
    
  2. 명령 콘솔에서 Multipass 시작 명령을 실행하여 microk8s-vm 이미지를 구성하고 실행합니다. 인터넷 연결 및 데스크톱 속도에 따라 이 단계를 완료하는 데 몇 분 정도 걸릴 수 있습니다.

    multipass launch --name microk8s-vm --memory 4G --disk 40G
    
  3. microk8s-vm에 대한 시작 확인을 받은 후 multipass shell microk8s-vm 명령을 실행하여 VM 인스턴스에 들어갑니다.

    multipass shell microk8s-vm
    

    이제 Ubuntu VM에 액세스하여 클러스터를 호스팅할 수 있습니다. 여전히 MicroK8s를 설치해야 합니다. 다음 단계를 수행합니다.

  4. MicroK8s 맞춤 앱을 설치합니다. 인터넷 연결 및 데스크톱 속도에 따라 이 단계를 완료하는 데 몇 분 정도 걸릴 수 있습니다.

    sudo snap install microk8s --classic
    

    설치되면 다음 메시지가 표시됩니다.

    2020-03-16T12:50:59+02:00 INFO Waiting for restart...
    microk8s v1.17.3 from Canonical✓ installed
    

이제 클러스터에 추가 기능을 설치할 준비가 되었습니다.

클러스터 준비

클러스터에 설치된 추가 기능의 상태를 확인하려면 MicroK8s의 상태 명령을 실행합니다. 이 추가 기능은 이전에 설명한 몇 가지 서비스를 제공합니다. 한 가지 예는 DNS 기능입니다.

  1. 설치 상태를 확인하려면 microk8s.status --wait-ready 명령을 실행합니다.

    sudo microk8s.status --wait-ready
    

    클러스터에는 사용하지 않도록 설정된 추가 기능이 여러 개 있습니다. 인식하지 못하는 추가 기능에 관해 걱정할 필요가 없습니다.

    microk8s is running
    addons:
    cilium: disabled
    dashboard: disabled
    dns: disabled
    fluentd: disabled
    gpu: disabled
    helm3: disabled
    helm: disabled
    ingress: disabled
    istio: disabled
    jaeger: disabled
    juju: disabled
    knative: disabled
    kubeflow: disabled
    linkerd: disabled
    metallb: disabled
    metrics-server: disabled
    prometheus: disabled
    rbac: disabled
    registry: disabled
    storage: disabled
    
  2. 목록에서 DNS, 대시보드 및 레지스트리 추가 기능을 사용하도록 설정해야 합니다. 각 추가 기능의 목적은 다음과 같습니다.

    추가 기능 목적
    DNS coreDNS 서비스를 배포합니다.
    대시보드 kubernetes-dashboard 서비스와 해당 기능을 지원하는 다른 여러 서비스를 배포합니다. Kubernetes 클러스터의 범용 웹 기반 UI입니다.
    레지스트리 프라이빗 레지스트리와 해당 기능을 지원하는 여러 서비스를 배포합니다. 프라이빗 컨테이너를 저장하려면 이 레지스트리를 사용합니다.

    추가 기능을 설치하려면 다음 명령을 실행합니다.

    sudo microk8s.enable dns dashboard registry
    

이제 kubectl을 사용하여 클러스터에 액세스할 준비가 되었습니다.

Kubernetes 클러스터 탐색

MicroK8s는 새 Kubernetes 클러스터와 상호 작용하는 데 사용할 수 있는 kubectl 버전을 제공합니다. 이 kubectl 복사본을 사용하면 해당 기능에 영향을 주지 않고 다른 시스템 차원 kubectl 인스턴스의 병렬 설치를 수행할 수 있습니다.

  1. snap alias 명령을 실행하여 microk8s.kubectl의 별칭을 kubectl로 설정합니다. 이 단계에서는 사용을 단순화합니다.

    sudo snap alias microk8s.kubectl kubectl
    

    명령이 완료되면 다음 출력이 나타납니다.

    Added:
      - microk8s.kubectl as kubectl
    

클러스터 노드 정보 표시

앞에서 설명한 대로 Kubernetes 클러스터는 컨트롤 플레인 및 작업자 노드에 존재하지 않습니다. 새 클러스터를 탐색하여 설치되는 항목을 확인합니다.

  1. 클러스터에서 실행하는 노드를 확인합니다.

    MicroK8s는 단일 노드 클러스터 설치이므로 하나의 노드만 표시될 것으로 예상됩니다. 이 노드는 클러스터의 작업자 노드이자 컨트롤 플레인임을 염두에 두어야 합니다. kubectl get nodes 명령을 실행하여 이 구성을 확인합니다. 클러스터의 모든 리소스에 대한 정보를 검색하려면 kubectl get 명령을 실행합니다.

    sudo kubectl get nodes
    

    결과는 클러스터에 이름이 microk8s-vm인 노드가 하나만 있음을 보여주는 다음 예제와 유사합니다. 노드가 준비 상태입니다. 준비 상태가 되면 컨트롤 플레인이 노드의 워크로드를 예약할 수 있습니다.

    NAME          STATUS   ROLES    AGE   VERSION
    microk8s-vm   Ready    <none>   35m   v1.17.3
    

    요청된 특정 리소스에 관한 자세한 정보를 볼 수 있습니다. 예를 들어 노드의 IP 주소를 찾아야 한다고 가정해 보겠습니다. API 서버에서 추가 정보를 가져오려면 -o wide 매개 변수를 실행합니다.

    sudo kubectl get nodes -o wide
    

    결과는 다음 예제와 유사합니다. 이제 노드의 내부 IP 주소, 노드에서 실행하는 OS, 커널 버전 및 컨테이너 런타임을 볼 수 있습니다.

    NAME          STATUS   ROLES    AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
    microk8s-vm   Ready    <none>   36m   v1.17.3   192.168.56.132   <none>        Ubuntu 18.04.4 LTS   4.15.0-88-generic   containerd://1.2.5
    
  2. 다음 단계로 클러스터에서 실행하는 서비스를 탐색합니다. 노드와 마찬가지로 클러스터에서 실행하는 서비스에 대한 정보를 찾으려면 kubectl get 명령을 실행합니다.

    sudo kubectl get services -o wide
    

    결과는 다음 예와 비슷하지만 하나의 서비스만 나열됩니다. 이전에 클러스터에 추가 기능을 설치했으며 이러한 서비스도 표시될 것으로 예상됩니다.

    NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE   SELECTOR
    kubernetes   ClusterIP   10.152.183.1   <none>        443/TCP   37m   <none>
    

    단일 서비스를 나열한 이유는 Kubernetes가 네임스페이스라는 개념을 사용하여 클러스터를 여러 가상 클러스터로 논리적으로 나누기 때문입니다.

    모든 네임스페이스의 모든 서비스를 가져오려면 --all-namespaces 매개 변수를 전달합니다.

    sudo kubectl get services -o wide --all-namespaces
    

    결과는 다음 예제와 유사합니다. 클러스터에는 세 개의 네임스페이스가 있습니다. 해당 네임스페이스는 default, container-registrykube-system 네임스페이스입니다. 여기에서 설치한 registry, kube-dnskubernetes-dashboard 인스턴스를 볼 수 있습니다. 일부 추가 기능과 함께 설치된 지원 서비스도 있습니다.

    NAMESPACE            NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE   SELECTOR
    container-registry   registry                    NodePort    10.152.183.36    <none>        5000:32000/TCP           28m   app=registry
    default              kubernetes                  ClusterIP   10.152.183.1     <none>        443/TCP                  37m   <none>
    kube-system          dashboard-metrics-scraper   ClusterIP   10.152.183.130   <none>        8000/TCP                 28m   k8s-app=dashboard-metrics-scraper
    kube-system          heapster                    ClusterIP   10.152.183.115   <none>        80/TCP                   28m   k8s-app=heapster
    kube-system          kube-dns                    ClusterIP   10.152.183.10    <none>        53/UDP,53/TCP,9153/TCP   28m   k8s-app=kube-dns
    kube-system          kubernetes-dashboard        ClusterIP   10.152.183.132   <none>        443/TCP                  28m   k8s-app=kubernetes-dashboard
    kube-system          monitoring-grafana          ClusterIP   10.152.183.88    <none>        80/TCP                   28m   k8s-app=influxGrafana
    kube-system          monitoring-influxdb         ClusterIP   10.152.183.232   <none>        8083/TCP,8086/TCP        28m   k8s-app=influxGrafana
    

    이제 클러스터에서 실행하는 서비스를 볼 수 있으므로 작업자 노드에서 워크로드를 예약할 수 있습니다.

클러스터에 웹 서버 설치

고객에게 웹 사이트를 제공하기 위해 클러스터에서 웹 서버를 예약하려고 합니다. 여러 옵션 중에서 선택할 수 있습니다. 이 예에서는 NGINX를 사용합니다.

앞서 언급한 대로 Pod 매니페스트 파일을 사용하여 워크로드를 정의하는 Pod, 복제본 세트 및 배포를 설명할 수 있습니다. 해당 파일을 자세히 다루지 않았으므로 kubectl을 실행하여 API 서버에 직접 정보를 전달합니다.

kubectl 사용이 편리하더라도 매니페스트 파일을 사용하는 것이 좋습니다. 매니페스트 파일을 사용하면 클러스터에서 배포를 쉽게 롤포워드하거나 롤백할 수 있습니다. 해당 파일도 클러스터의 구성을 문서화하는 데 도움이 됩니다.

  1. NGINX 배포를 만들려면 kubectl create deployment 명령을 실행합니다. 배포의 이름과 컨테이너 이미지를 지정하여 Pod의 단일 인스턴스를 만듭니다.

    sudo kubectl create deployment nginx --image=nginx
    

    결과는 다음 예와 유사합니다.

    deployment.apps/nginx created
    
  2. 배포에 대한 정보를 가져오려면 kubectl get deployments을(를) 실행합니다.

    sudo kubectl get deployments
    

    결과는 다음 예제와 유사합니다. 배포 이름이 사용자가 지정한 이름과 일치하면 이 이름을 가진 하나의 해당 배포가 준비 상태이며 사용할 수 있습니다.

    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    nginx   1/1     1            1           18s
    
  3. 배포가 Pod를 만들었습니다. 클러스터 포드에 대한 정보를 가져오려면 kubectl get pods 명령을 실행합니다.

    sudo kubectl get pods
    

    결과는 다음 예제와 유사합니다. 포드의 이름은 배포 이름이 접두사로 붙은 생성된 값이고 포드의 상태는 실행 중입니다.

    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-86c57db685-dj6lz   1/1     Running   0          33s
    

웹 사이트 설치 테스트

Pod의 IP 주소를 통해 웹 서버에 연결하여 NGINX 설치를 테스트합니다.

  1. 포드의 주소를 찾으려면 -o wide 매개 변수를 전달합니다.

    sudo kubectl get pods -o wide
    

    결과는 다음 예제와 유사합니다. 이 명령은 노드의 IP 주소와 워크로드가 예약된 노드 이름을 둘 다 반환합니다.

    NAME                     READY   STATUS    RESTARTS   AGE     IP           NODE          NOMINATED NODE   READINESS GATES
    nginx-86c57db685-dj6lz   1/1     Running   0          4m17s   10.1.83.10   microk8s-vm   <none>           <none>
    
  2. 웹 사이트에 액세스하려면 이전에 나열된 IP에서 wget을 실행합니다.

    wget <POD_IP>
    

    결과는 다음 예와 유사합니다.

    --2020-03-16 13:34:17--  http://10.1.83.10/
    Connecting to 10.1.83.10:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 612 [text/html]
    Saving to: 'index.html'
    
    index.html                                    100%[==============================================================================================>]     612  --.-KB/s    in 0s
    
    2020-03-16 13:34:17 (150 MB/s) - 'index.html' saved [612/612]
    

클러스터에서 웹 서버 배포 스케일링

웹 사이트에 액세스할 수 있는 사용자 수가 갑자기 증가하여 부하 문제로 웹 사이트가 시작되지 않는 경우를 가정해 봅니다. 클러스터에서 더 많은 사이트 인스턴스를 배포하고 인스턴스 간에 부하를 분할할 수 있습니다.

배포에서 복제본 수를 스케일링하려면 kubectl scale 명령을 실행합니다. 필요한 복제본 수와 배포 이름을 지정합니다.

  1. 총 NGINX 포드를 3개로 확장하려면 kubectl scale 명령을 실행합니다.

    sudo kubectl scale --replicas=3 deployments/nginx
    

    결과는 다음 예와 유사합니다.

    deployment.apps/nginx scaled
    

    scale 명령을 사용하여 인스턴스 개수를 스케일 업 또는 다운할 수 있습니다.

  2. 실행 중인 포드 수를 확인하려면 kubectl get 명령을 실행하고 -o wide 매개 변수를 다시 전달합니다.

    sudo kubectl get pods -o wide
    

    결과는 다음 예제와 유사합니다. 이제 각각 고유한 IP 주소를 사용하여 실행 중인 세 개의 Pod가 표시됩니다.

    NAME                     READY   STATUS    RESTARTS   AGE     IP           NODE          NOMINATED NODE   READINESS GATES
    nginx-86c57db685-dj6lz   1/1     Running   0          7m57s   10.1.83.10   microk8s-vm   <none>           <none>
    nginx-86c57db685-lzrwp   1/1     Running   0          9s      10.1.83.12   microk8s-vm   <none>           <none>
    nginx-86c57db685-m7vdd   1/1     Running   0          9s      10.1.83.11   microk8s-vm   <none>           <none>
    ubuntu@microk8s-vm:~$
    

웹 사이트를 공용 웹 사이트로 효과적으로 노출하려면 클러스터에 몇 가지 추가 구성을 적용해야 합니다. 예제에는 부하 분산 장치를 설치하고 노드 IP 주소를 매핑하는 작업이 포함됩니다. 이 구성 유형은 앞으로 탐색할 고급 측면의 일부를 형성합니다. 요약에는 VM을 제거하고 정리하기로 선택한 경우의 지침이 있습니다.