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://
エディターで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資格情報の入力です。クラウドのクラスターに接続できないというエラーが生じた場合に限り、以下の手順を実行してください。
- 前のセクションの手順に沿って、クラウドとAPMの4つの値を検証します。
- 以下の通りに、資格情報とBeatsのセットアップジョブを削除します。
$ kubectl delete secret cloud-secret --namespace=kube-system $ kubectl delete secret cloud-secret $ kubectl delete secret apm-secret
- 前のセクションの手順に沿って、Theia Webエディター、またはvim/nanoエディターで資格情報を更新します。
- 以下のコマンドを再度実行し、シークレットを作成します。
$ ./install/create_secrets.sh
- 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://kubectl get services
コマンドを使用して、petclinic Webアプリケーションの公開IPアドレスを入手できます。
これですべての準備が整いました。本編となるチュートリアル「Kubernetesオブザーバビリティチュートリアル:ログ監視と分析編」に戻ってチュートリアルを続行できます。