演習 - 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 へのインストールは、手順の数が一番少ないインストール オプションです。 ターミナル ウィンドウに切り替え、以下の指示に従ってコマンドを実行します。
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 マネージャーです。
GitHub から、Windows 用の Multipass の最新リリースをダウンロードしてインストールします。
コマンド コンソールで Multipass 起動コマンドを実行して、microk8s-vm イメージを構成して実行します。 インターネット接続とデスクトップの速度によっては、この手順が完了するまでに数分かかる場合があります。
multipass launch --name microk8s-vm --memory 4G --disk 40G
microk8s-vm の起動確認を受けた後、
multipass shell microk8s-vm
コマンドを実行して VM インスタンスにアクセスします。multipass shell microk8s-vm
マルチパスが機能したら、クラスターをホストする Ubuntu VM にアクセスして、MicroK8s をインストールできます。
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 マネージャーです。
macOS に Multipass をインストールするには、2 つのオプションがあります。 GitHub から macOS 用 Multipass の最新リリースをダウンロードしてインストールします。または、
brew cask install multipass
コマンドを使用して Multipass をインストールするには、Homebrew を使用します。brew install --cask multipass
コマンド コンソールで multipass 起動コマンドを実行して、microk8s-vm イメージを構成して実行します。 インターネット接続とデスクトップの速度によっては、この手順が完了するまでに数分かかる場合があります。
multipass launch --name microk8s-vm --memory 4G --disk 40G
microk8s-vm の起動確認を受けた後、
multipass shell microk8s-vm
コマンドを実行して VM インスタンスに入ります。multipass shell microk8s-vm
この時点で、クラスターをホストする Ubuntu VM にアクセスできます。 MicroK8s をインストールする必要があります。 次の手順に従います。
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 機能があります。
インストールの状態を確認するには、
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
一覧から、DNS、ダッシュボード、レジストリのアドオンを有効にする必要があります。 各アドオンの目的は次のとおりです。
アドオン 目的 DNS coreDNS
サービスをデプロイします。ダッシュボード kubernetes-dashboard
サービスとその機能をサポートする他のいくつかのサービスをデプロイします。 それは Kubernetes クラスター用の汎用的な Web ベースの UI です。レジストリ プライベート レジストリとその機能をサポートするいくつかのサービスをデプロイします。 プライベート コンテナーを格納するには、このレジストリを使用します。 アドオンをインストールするには、次のコマンドを実行します。
sudo microk8s.enable dns dashboard registry
これで、kubectl
を使ってクラスターにアクセスする準備ができました。
Kubernetes クラスターを調べる
MicroK8s には、新しい Kubernetes クラスターの操作に使用できる kubectl
のバージョンが用意されています。 この kubectl
のコピーを使用すると、別のシステム全体の kubectl
インスタンスの並列インストールを、その機能に影響を与えることなく行うことができます。
snap alias
コマンドを実行してmicrok8s.kubectl
のエイリアスkubectl
を作成します。 この手順によって使用方法が簡単になります。sudo snap alias microk8s.kubectl kubectl
コマンドが正常に終了すると、次の出力が表示されます。
Added: - microk8s.kubectl as kubectl
クラスター ノードの情報を表示する
前に説明したとおり、Kubernetes クラスターはコントロール プレーンとワーカー ノード外に存在します。 新しいクラスターを調べて、インストールされている内容を確認してみましょう。
クラスターで実行されているノードを確認します。
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
次の手順は、クラスターで実行されているサービスを調べることです。 ノードと同様に、クラスターで実行されているサービスに関する情報を見つけるには、
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-registry
、kube-system
です。 ここでは、インストールしたregistry
、kube-dns
、kubernetes-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
を使うと便利ですが、マニフェスト ファイルを使用することをお勧めします。 マニフェスト ファイルを使用すると、クラスター内のデプロイを簡単にロール フォワードまたはロール バックできます。 これらのファイルは、クラスターの構成の文書化にも役立ちます。
NGINX デプロイを作成するには、
kubectl create deployment
コマンドを実行します。 デプロイの名前とコンテナー イメージを指定して、ポッドの単一のインスタンスを作成します。sudo kubectl create deployment nginx --image=nginx
結果は次の例のようになります。
deployment.apps/nginx created
デプロイに関する情報をフェッチするには、次のように
kubectl get deployments
を実行します。sudo kubectl get deployments
結果は次の例のようになります。 デプロイの名前が指定した名前と一致し、この名前を持つ 1 つのデプロイが準備完了状態であり使用可能であることに注目してください。
NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/1 1 1 18s
デプロイによってポッドが作成されました。 クラスターのポッドに関する情報をフェッチするには、次のように
kubectl get pods
コマンドを実行します。sudo kubectl get pods
結果は次の例のようになります。 ポッドの名前が、デプロイの名前が先頭に付いた生成値であり、ポッドの状態が "実行中" であることに注目してください。
NAME READY STATUS RESTARTS AGE nginx-86c57db685-dj6lz 1/1 Running 0 33s
Web サイトのインストールをテストする
ポッドの IP アドレスを使用して Web サーバーに接続し、NGINX インストールをテストします。
ポッドのアドレスを見つけるには、
-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>
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
コマンドを実行します。 必要なレプリカの数とデプロイの名前を指定します。
NGINX ポッドの合計を 3 にスケーリングするには、次のように
kubectl scale
コマンドを実行します。sudo kubectl scale --replicas=3 deployments/nginx
結果は次の例のようになります。
deployment.apps/nginx scaled
scale コマンドを使用すると、インスタンス数をスケール アップまたはスケール ダウンできます。
実行中のポッドの数を確認するには、次のように
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 をアンインストールしてクリーンアップすることを選択した場合の手順があります。