Kubernetesオブザーバビリティチュートリアル:K8sクラスターのセットアップとデモ用アプリのデプロイ編

このブログ記事は、Kubernetesにオブザーバビリティを構築するチュートリアルブログシリーズで使用する環境の設定手順を説明します。まだ第1回:ログ監視と分析編をお読みになっていない方は、先にそちらの記事をご覧ください。本記事は単体の読み物ではなく、チューリアルシリーズの補足資料として提供されています。第1回の記事に目を通していただいた後、このページの手順に沿ってチュートリアル環境を立ち上げていただくことをお勧めします。

手順1.(無料の)Elasticsearch Serviceデプロイを立ち上げる

今回のチュートリアル用にElastic Stackを最も簡単な方法でセットアップするには、Elastic CloudのElasticsearch Serviceの無料トライアルを14日間試用します。クレジットカード登録の必要はなく、わずか数クリックでクラスターを立ち上げることができます。また、ローカルにElastic Stackをダウンロードしてインストール することも可能です。このチュートリアルの手順は、お使いのハードウェアで稼働するスタンドアローンのElasticsearchクラスター向けに簡単に修正することができます。 

手順2.MinikubeシングルノードKubernetesクラスターのセットアップ

Elastic Stackのデプロイが完了したら、Minikube環境を準備します。

Kubernetes環境を用意する

以下の手順に沿ってシングルノードのMinikube環境をセットアップすると、ログやメトリック、アプリケーションパフォーマンスデータの捕捉など、チュートリアルの他のアクティビティを実行できます。Strigo.ioクラスやGKE、AWSのスタンドアローンホストなど、このチュートリアルをサポートする環境を作成する方法は他にもいくつかあります。下の例はDebian 9ホスト環境の作成手順を概説したもので、スクリーンショットはGoogle Cloudで撮影しています。

注:クラウド環境や自前のサーバーで稼働中のKubernetesクラスターがある場合、この手順は不要です。現在使えるKubernetesクラスターがない場合のみ、この手順を実施してください。

初期設定

Debian 9サーバーを作成します。最初は低スペックな設定で開始し、必要に応じてあとで引き上げることができます。必要な仕様は以下の通りです。

  • CPU×2、または×4
  • 8GBまたは16GBのRAM
  • 100GBのディスク容量
  • Debian 9 Linux OS(Stretch)
  • 選択したサーバーの外部接続をかならずポート30080-30085に設定します。サーバーのファイアウォール設定が必要となる場合があります。

以下は、Google Cloudの設定例です。

必要なパッケージをインストールする

以下の手順で、Debian 9サーバーにKubernetesシングルノードクラスターをインストールすることができます。はじめに、以下のコマンドを実行します。

$ sudo apt-get install -y git tmux

Githubレポでコードを確認する

筆者のGithubレポジトリにあるサンプルコードをクローンして、以下のコマンドを実行します。

$ git clone https://github.com/michaelhyatt/k8s-o11y-workshop

必要なツールをインストールする

以下のコマンドを実行して、kubectl、Minikube、Dockerをインストールします。

$ cd k8s-o11y-workshop
$ ./install/install-debian9.sh

MinikubeとKubernetesを起動する

以下のコマンドで、Minikube環境が起動します。

$ ./install/start_k8s.sh

以下のコマンドを実行して、環境が正常に稼働しており、エラーがないことを確かめます。各種サービスのステータスがRunningになっていることを確認します。

$ kubectl get pods --namespace=kube-system

アウトプットは、以下のようになるはずです。

NAME                                 READY   STATUS    RESTARTS   AGE
coredns-5644d7b6d9-jhjlm             1/1     Running   0          106s
coredns-5644d7b6d9-npwr7             1/1     Running   0          105s
etcd-minikube                        1/1     Running   0          55s
kube-addon-manager-minikube          1/1     Running   0          43s
kube-apiserver-minikube              1/1     Running   0          57s
kube-controller-manager-minikube     1/1     Running   0          47s
kube-proxy-fm476                     1/1     Running   0          105s
kube-scheduler-minikube              1/1     Running   0          50s
kube-state-metrics-57cd6fdf9-gfgl8   1/1     Running   0          102s
storage-provisioner                  1/1     Running   0          101s

これでMinikubeシングルノードKubernetesクラスターが立ち上がりました。

手順3.デモ用アプリケーションをデプロイする

Kubernetesクラスターが立ち上がったので、次にデモ用アプリケーションをデプロイします。

接続の詳細とシークレットを作成、更新する

Theiaエディターが動作していることを検証します。vimやnanoなど、他のエディターを使ってinstall/create_secrets.shファイルを編集してもかまいません。

$ kubectl get pods

アウトプットは、以下のようになるはずです。

NAME                     READY   STATUS    RESTARTS   AGE
theia-86d9888954-npk7l   1/1     Running   0          74s

Elastic Cloudクラスターのセットアップから、以下の詳細をかならず記録しておきます。

  • cloud_id - “:”の形式です
  • cloud_auth - “elastic:”の形式です
  • apm_url - APMサーバーのURLはhttps://ではじまります
  • apm_token - APMサーバーに接続するためのシークレットトークンです

上記の詳細情報は、Elastic Cloudクラスターと共にこのサーバーで実行されるコンポーネントに接続するKubernetesシークレットの作成に使用します。

サーバーの公開IPアドレスを検索し、ブラウザーウインドウでhttp://:30083を開きます。

エディターでinstall/create_secrets.shファイルを開き、4つの詳細情報を上記の通りに更新します。最後に、ファイルを保存します。

ターミナルウインドウで以下のコマンドを実行し、シークレットを作成します。

$ ./install/create_secrets.sh

Beatsをセットアップする

Elastic Stackは、ElasticsearchにデータをシッピングするさまざまなBeatsを提供しています。k8sのログファイルをtailするには、Filebeatを使用します。Kubernetes自体を含め、Kubernetes内のアプリやシステムpodから多様なメトリックを収集するには、Metricbeatを使用します。

Beatsをセットアップするには、インジェストパイプライン、インデックステンプレート、設定不要のKibanaの可視化など、データインジェストに関わるすべてのアーティファクトを作成する必要があります。このすべての作業は1つのコマンドで実行でき、KubernetesクラスターにデプロイするBeatにつき1度コマンドを実行するだけで済みます。

Metricbeat、およびFilebeatのセットアップジョブを実行するには、以下の各コマンドを実行します。

$ kubectl create -f $HOME/k8s-o11y-workshop/filebeat/filebeat-setup.yml
$ kubectl create -f $HOME/k8s-o11y-workshop/metricbeat/metricbeat-setup.yml

次に、以下のkubectlコマンドを使い、ステータスがContainerCreationからRunning、最後にCompletedに変わるまで待ちます。Completedになれば、ジョブは完了しています。

$ kubectl get pods --namespace=kube-system

コマンド入力後、podステータスが以下のような結果になります。

NAME                                 READY   STATUS      RESTARTS   AGE
coredns-5644d7b6d9-jhjlm             1/1     Running     0          2d
coredns-5644d7b6d9-npwr7             1/1     Running     0          2d
etcd-minikube                        1/1     Running     0          2d
filebeat-init-nkghj                  0/1     Completed   0          2m
kube-addon-manager-minikube          1/1     Running     0          2d
kube-apiserver-minikube              1/1     Running     0          2d
kube-controller-manager-minikube     1/1     Running     0          2d
kube-proxy-fm476                     1/1     Running     0          2d
kube-scheduler-minikube              1/1     Running     0          2d
kube-state-metrics-57cd6fdf9-gfgl8   1/1     Running     0          2d
storage-provisioner                  1/1     Running     0          2d
metricbeat-init-gm6wj                0/1     Completed   0          2m

シークレットの作成を忘れた場合(念のため)

このステージで最もよくあるエラーの原因は、誤ったElastic Cloud資格情報の入力です。クラウドのクラスターに接続できないというエラーが生じた場合に限り、以下の手順を実行してください。

  1. 前のセクションの手順に沿って、クラウドとAPMの4つの値を検証します。
  2. 以下の通りに、資格情報とBeatsのセットアップジョブを削除します。
    $ kubectl delete secret cloud-secret --namespace=kube-system
    $ kubectl delete secret cloud-secret
    $ kubectl delete secret apm-secret
    
  3. 前のセクションの手順に沿って、Theia Webエディター、またはvim/nanoエディターで資格情報を更新します。
  4. 以下のコマンドを再度実行し、シークレットを作成します。
    $ ./install/create_secrets.sh
    
  5. Beatsのセットアップコマンドを再試行します。

Beatsをデプロイする

FilebeatとMetricbeatをデプロイするには、以下の2つのコマンドを実行します。

$ kubectl create -f $HOME/k8s-o11y-workshop/filebeat/filebeat.yml
$ kubectl create -f $HOME/k8s-o11y-workshop/metricbeat/metricbeat.yml

Beatsの動作検証のため、次のコマンドを実行します。

$ kubectl get pods --namespace=kube-system

Filebeat用に1つ、Metricbeat用に2つ、合計で3つの追加のKubernetes podが稼働しているはずです。

NAME                                 READY   STATUS      RESTARTS   AGE
coredns-5644d7b6d9-jhjlm             1/1     Running     0          2d
coredns-5644d7b6d9-npwr7             1/1     Running     0          2d
etcd-minikube                        1/1     Running     0          2d
filebeat-init-nkghj                  0/1     Completed   0          2d
filebeat-wnltr                       1/1     Running     0          4m
kube-addon-manager-minikube          1/1     Running     0          2d
kube-apiserver-minikube              1/1     Running     0          2d
kube-controller-manager-minikube     1/1     Running     0          2d
kube-proxy-fm476                     1/1     Running     0          2d
kube-scheduler-minikube              1/1     Running     0          2d
kube-state-metrics-57cd6fdf9-gfgl8   1/1     Running     0          2d
metricbeat-777d6c6c45-gzfwr          1/1     Running     0          4m
metricbeat-init-rjz4q                0/1     Completed   0          4m
metricbeat-vxbj5                     1/1     Running     0          4m
storage-provisioner                  1/1     Running     0          2d

BeatsからElasticsearchへのデータ送信を検証する

BeatsがElastic Cloudクラスターに問題なく接続され、データを送信しているか確認するもう1つの検証手順を実施するため、KibanaでLogsアプリとMetricsアプリを開きます。各アプリで、何らかのアクションが進行中であることを確認します。

アプリケーションコンポーネントをデプロイする

MySQLをデプロイします。

$ kubectl create -f $HOME/k8s-o11y-workshop/mysql/mysql.yml

Metricsアプリでpodが稼働していることを確認し、podメニューで選択してMySQLログをオブザーブすることにより、コンテナーが立ち上がっていることを検証します。

MySQLのログ行が“ready for connections”を表示するまで待機します。

petclinicアプリとNGINXプロキシをデプロイします。

$ kubectl create -f $HOME/k8s-o11y-workshop/petclinic/petclinic.yml
$ kubectl create -f $HOME/k8s-o11y-workshop/nginx/nginx.yml

すべてのコンポーネントが正常に立ち上がったことを確認する

KibanaのMetricsアプリで、すべてのコンポーネントが稼働中であることを確認します。

http://:30080で、petclinicのUIが使用可能であることを検証します。kubectl get servicesコマンドを使用して、petclinic Webアプリケーションの公開IPアドレスを入手できます。

これですべての準備が整いました。本編となるチュートリアル「Kubernetesオブザーバビリティチュートリアル:ログ監視と分析編」に戻ってチュートリアルを続行できます。