演習 - Kubernetes クラスターの機能を調べる

完了

Kubernetes をローカルで実行する場合、いくつかのオプションを使用できます。 物理マシンまたは VM に Kubernetes をインストールするか、Azure Kubernetes Service (AKS) などのクラウドベースのソリューションを使用することができます。

この演習の目標は、単一ノード クラスターを使用した Kubernetes のインストールを調べることです。 この演習では、設定と破棄が簡単な MicroK8s 環境を構成してインストールする方法を学習します。 次に、Kubernetes サービスをデプロイし、それを複数のインスタンスにスケールアウトして Web サイトをホストします。

Note

この演習は省略可能です。また、演習で使用するソフトウェアやリソースを削除およびアンインストールする方法を説明する手順が含まれています。

同じことをするために、MiniKube や、Docker での Kubernetes のサポートなどの他のオプションがあることを覚えておいてください。

MicroK8s とは

MicroK8s を使用すると、ワークステーションとモノのインターネット (IoT) デバイスを対象にした単一ノードの Kubernetes クラスターを 1 つのパッケージとしてデプロイすることができます。 Ubuntu Linux の作成元である Canonical が元々 MicroK8s を開発し、現在は保守しています。

MicroK8s は、Linux、Windows、および macOS にインストールできます。 ただし、インストール手順はオペレーティング システムごとに若干異なります。 ご使用の環境に最適なオプションを選択してください。

Linux に MicroK8s をインストールする

MicroK8s の Linux へのインストールは、手順の数が一番少ないインストール オプションです。 ターミナル ウィンドウに切り替え、以下の指示に従ってコマンドを実行します。

  1. MicroK8s Snap アプリをインストールします。 インターネット接続とデスクトップの速度によっては、この手順が完了するまでに数分かかる場合があります。

    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 をインストールする

Windows で MicroK8s を実行するには、Multipass を使用します。 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 Snap アプリをインストールします。 インターネット接続とデスクトップの速度によっては、この手順が完了するまでに数分かかる場合があります。

    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 をインストールするには、2 つのオプションがあります。 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 Snap アプリをインストールします。 インターネット接続とデスクトップの速度によっては、この手順が完了するまでに数分かかる場合があります。

    sudo snap install microk8s --classic
    

    インストールが成功すると、次のメッセージが表示されます。

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

これで、クラスターにアドオンをインストールする準備ができました。

クラスターを準備する

クラスターにインストールされているアドオンの状態を表示するには、MicroK8s の status コマンドを実行します。 これらのアドオンにはいくつかのサービスが用意されていますが、その一部は前に説明したものです。 1 つの例として、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 クラスター用の汎用的な Web ベースの 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 が単一ノードのクラスター インストールであることはわかっているので、ノードは 1 つしか表示されません。 ただし、このノードはクラスター内のコントロール プレーンであり、かつワーカー ノードでもあることに注意してください。 kubectl get nodes コマンドを実行して、この構成を確認します。 クラスター内のすべてのリソースに関する情報を取得するには、次のように kubectl get コマンドを実行します。

    sudo kubectl get nodes
    

    結果は次の例のようになります。これは、クラスター内に microk8s-vm という名前の 1 つのノードしかないことを示しています。 ノードが "準備完了" 状態であることに注意してください。 準備完了状態は、コントロール プレーンによってこのノードにワークロードをスケジュールできることを示しています。

    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
    

    結果は次の例のようになりますが、1 つのサービスのみが一覧表示されていることに注意してください。 前にクラスターにアドオンをインストールしたので、本来ならこれらのサービスも表示されるはずです。

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

    1 つのサービスだけが表示される理由は、Kubernetes が "名前空間" と呼ばれる概念を使用してクラスターを複数の仮想クラスターに論理的に分割するためです。

    すべての名前空間内のすべてのサービスをフェッチするには、次のように --all-namespaces パラメーターを渡します。

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

    結果は次の例のようになります。 クラスターに 3 つの名前空間があることがわかります。 それらの名前空間は、既定、container-registrykube-system です。 ここでは、インストールした registrykube-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
    

    これで、クラスターで実行されているサービスを確認できたので、ワーカー ノード上のワークロードをスケジュールすることができます。

クラスターに Web サーバーをインストールする

顧客向けに Web サイトのサービスを提供する Web サーバーをクラスター上にスケジュールします。 複数のオプションから選択できます。 この例では、NGINX を使用します。

前述のように、ポッド マニフェスト ファイルを使用してポッド、レプリカ セット、デプロイを記述し、ワークロードを定義することができます。 これらのファイルの詳細については学習していないため、kubectl を実行して API サーバーに情報を直接渡します。

kubectl を使うと便利ですが、マニフェスト ファイルを使用することをお勧めします。 マニフェスト ファイルを使用すると、クラスター内のデプロイを簡単にロール フォワードまたはロール バックできます。 これらのファイルは、クラスターの構成の文書化にも役立ちます。

  1. NGINX デプロイを作成するには、kubectl create deployment コマンドを実行します。 デプロイの名前とコンテナー イメージを指定して、ポッドの単一のインスタンスを作成します。

    sudo kubectl create deployment nginx --image=nginx
    

    結果は次の例のようになります。

    deployment.apps/nginx created
    
  2. デプロイに関する情報をフェッチするには、次のように kubectl get deployments を実行します。

    sudo kubectl get deployments
    

    結果は次の例のようになります。 デプロイの名前が指定した名前と一致し、この名前を持つ 1 つのデプロイが準備完了状態であり使用可能であることに注目してください。

    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    nginx   1/1     1            1           18s
    
  3. デプロイによってポッドが作成されました。 クラスターのポッドに関する情報をフェッチするには、次のように kubectl get pods コマンドを実行します。

    sudo kubectl get pods
    

    結果は次の例のようになります。 ポッドの名前が、デプロイの名前が先頭に付いた生成値であり、ポッドの状態が "実行中" であることに注目してください。

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

Web サイトのインストールをテストする

ポッドの IP アドレスを使用して Web サーバーに接続し、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. Web サイトにアクセスするには、前に示した 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]
    

クラスターでの Web サーバーのデプロイをスケーリングする

Web サイトにアクセスするユーザーが急増し、負荷のために Web サイトに障害が発生し始めたとします。 クラスターにサイトのインスタンスをさらにデプロイし、インスタンス間で負荷を分割できます。

デプロイ内のレプリカの数をスケーリングするには、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
    

    結果は次の例のようになります。 3 つの実行中のポッドが表示され、それぞれが一意の IP アドレスを持っていることに注目してください。

    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:~$
    

公開された Web サイトとして Web サイトを効果的に公開するためには、さらにいくつかの構成をクラスターに適用する必要があります。 たとえば、ロード バランサーをインストールし、ノードの IP アドレスをマッピングします。 この種類の構成は、今後調べる高度な側面に含まれます。 概要には、VM をアンインストールしてクリーンアップすることを選択した場合の手順があります。