Rancherで簡単・本格Kubernetes


RancherによるKubernetes環境構築

Rancherはk8sの構築・運用を容易にしてくれるツールです。

今回は、検証用の簡易なk8s Cluster環境構築が目的なので、Linuxサーバ2台による構成とします。(Rancherサーバ用・Clusterサーバ用)

作業にあたり、事前に全てのサーバにdockerおよびdocker-compose.ymlをインストールしてください。
今回構築に用いた環境は以下の通りです。
・サーバOS:Ubuntu 18.04
・docker:19.03.8
・docker-compose:1.24.0

Rancher起動

  • Rancher自体もdockerコンテナで起動することになります。

docker-compose.ymlファイルを作成し、以下内容を記載します。

docker-compose.yml
version: "3"
services:
  rancher:
    container_name: rancher
    restart: unless-stopped
    image: rancher/rancher
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/rancher/auditlog:/var/log/auditlog
      - /var/rancher/rancher:/var/lib/rancher

上記例では/var/rancherディレクトリにデータ保存用のディレクトリを作成し、それらにコンテナのディレクトリをバインドしています。ボリュームについては必要に応じて設定してください。

docker-compose.ymlを作成したら、コンテナを起動します。

$ docker-compose up -d

起動コマンド実行後、コンテナの動作を確認します。

$ docker ps
CONTAINER ID  IMAGE            COMMAND          CREATED        STATUS        PORTS                                     NAMES
50b7e0da7e98  rancher/rancher  "entrypoint.sh"  3 minutes ago  Up 3 minutes  0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp  rancher

問題無く動作しているようでしたら、ブラウザからRancher http://(RancherサーバのIPまたはホスト名) にアクセスします。



初回接続時は上記のような画面が表示されます。
・adminのパスワード設定
Allow collection of anonymous atatisticsのチェックはOn/Offお好みで
I agree to the Terms and Conditions for using Rancher.にチェック
以上、入力を終えたらContinue押下します。



続いてRancherサーバのURLを設定する画面になります。IPアドレスまたはホスト名を入力しSave URL押下します。



これでRancherの利用準備はOKです。
簡単ですね!

Cluster構築

初期構築

では続いてClusterを作成していきます。
右上のAdd Clusterを押下します。



今回はオンプレのサーバでClusterを構築するので、左上のFrom existing Nodes (Custom)を選択します。



Cluster Nameに任意のClusterの名称を入力します。



「Cluster Options」は基本的にデフォルト設定で。
POD間通信に利用するNetwork Providerを変えたい人、コンテナのプライベートレジストリを運用している人などは必要に応じて適宜設定を変更してください。
設定が完了したらNextを押下します。



①Node Options でサーバに設定する役割を選択し、②コマンド右側にあるCopy to Clipboardボタンを押下します。
(今回は1台のサーバに全ての役割を担ってもらうのでetcd Controle Plane Worker全てをチェックしています。サーバの構成によって、チェックする項目を変更してください。)


Clusterサーバにて、上記でコピーしたコマンドを実行します。

$ sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:v2.4.3 --server https://192.168.0.1 --token XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --ca-checksum XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --etcd --controlplane --worker

コマンド実行すると、Clusterを構築するためのコンテナのDLや起動が実施されます。
Rancherの先程の画面でDoneを押下したあと、ClusterのステータスがProvisioningになっていることが確認できます。

数分待つと、ClusterのステータスがActiveになります。これでClusterの構築は完了です。

Cluster Name(例ではhoge-cluster)をクリックすると・・・

Clusterの状態が表示されますね!当然ですが生まれたてなのでリソースはほとんど消費していません。
上部メニューでNodesを選択すると・・・

Clusterを構成するサーバの一覧、および各サーバのステータス、ロールが表示されます。

Clusterへのサーバ追加

Clusterにサーバを追加するときは、上部メニューのClusterを選択し、右上のEditを押下します。
Edit Cluster: hoge-cluster (Custom)画面が表示されるので、最下部までスクロールします。

初期構築時と同様に、①Node Options でサーバに設定する役割を選択し、②コマンド右側にある「Copy to Clipboard」ボタンを押下します。
その後追加するサーバにてコピーしたコマンドを実行します。
あとは数分待って追加されたノードがActiveになれば、Clusterへのサーバの追加は完了です。

コンテナのデプロイ

Clusterの準備が出来たら、次は実際にサービスを提供するコンテナのデプロイです。

名前空間の作成

まずは名前空間の作成です。既存の「Default」を使ってもいいですが、より厳密にPODを管理したい場合は名前空間を作成しましょう。
RancherのクラスタTOP画面で、Projects/Namespacesを選択します。

次に右上のAdd Projectボタンを押下します。

プロジェクト(名前空間)の入力画面が表示されるので、必要事項入力のうえCreateボタンを押下します。

  • まずは、Project Nameに任意の名称を入力、その他項目はデフォルトでOKです。

これでプロジェクト(名前空間)ができました。上部メニューでクラスタ名→クラスタ名と辿り、今作成したプロジェクト(名前空間)を選択しましょう。

続いて、上部メニューよりResourcesWorkloadsを選択しましょう。

当然ですが、POD(コンテナ)が何も無い状態です。
POD(コンテナ)を展開するには、右上のDeployボタンを押下します。

展開するPOD(コンテナ)の各パラメータを設定します。

  • Name:任意のPOD(コンテナ)の名前。
  • Docker Image:dockerコンテナイメージ。
  • Namespace:任意の名前空間名称。プロジェクト(名前空間)内でさらに名前空間を作成しサービス同士を隔離することもできます。
  • Port Mapping
    • Port Name:任意のポート名。
    • Publish the container port:公開したいコンテナのポート番号。
    • Protocol:UDP or TCP
    • As a:ここではNodePort(On every node)とします。(Clusterの全Workerノードで待ち受ける。)
    • On listening port:As aでNode Port`を選択したので、「30000」~「327867」の範囲内で任意のポート番号を入力。外部からはこのポート番号で待ち受けることになります。

ほかボリューム等設定項目いろいろありますが、ここでは割愛します。
設定項目の入力を終えたら、下部のLaunchボタンを押下します。

StateがUpdatingと表示されます。しばらく待つとActiveに変わります。

これでPOD(コンテナ)の準備は完了です。
ブラウザでhttp://(ClusterサーバのIPまたはホスト名):30001(上記で設定したOn listening portの番号)にアクセスしてみましょう。

無事サービスが起動していますね。
基本的なPOD(コンテナ)のデプロイ手順は以上になります。GUIの操作のみでコンテナを起動できました。簡単ですね!

Rancher(k8s)監視

Rancherは様々な機能を具備しており、その中には監視機能もあります。
ここでは監視機能を有効化し、Clusterの監視を行えるようにしたいと思います。
まずはクラスタTOP画面で上部メニューよりToolsMonitoringを選択します。

設定画面が表示されます。入力項目がいろいろありますが、とりあえずデフォルトでOKです。
下部のEnableボタンを押下します。

上部メニューよりクラスタ画面に戻りましょう。
小さくMonitoring API is not readyと表示されていますね。

しばらく待つと下のような表示に切り替わります。

これで監視機能が働き始め、Clusterの各種メトリックを監視できるようになりました。
ちなみに監視には「Prometheus」が、ダッシュボードには「Grafana」が利用されています。
ただし、この状態では不便なところがあるので、設定に少し手を加えます。
メニューよりクラスタ名→クラスタ名と辿り「System」を選択してください。

「Namespace:cattle-prometheus」となっているところが監視を担うPOD群になります。

この中で「grafana-cluster-monitoring」の右にあるEditを選択します。

「grafana primary」のEditボタンを押下します。

grafanaの設定編集画面が表示されます。
まずはメール通知を有効にしたいので、環境変数に設定を追加していきます。
Environment Variablesの項目を展開表示させAdd Variablesボタンを押下し設定を追加していきます。

既存の設定に加え、以下設定を追加します。
・GF_SMTP_HOST=メールサーバのIPアドレスおよびポート番号
・GF_SMTP_FROM_NAME=メール送信元の任意の名前
・GF_SMTP_FROM_ADDRESS=メール送信元のアドレス
・GF_SMTP_ENABLED=true
・GF_SMTP_USER=メール送信時認証が必要となる場合のユーザ名
・GF_SMTP_PASSWORD=メール送信時認証が必要となる場合のパスワード

次に、grafanaの設定内容が揮発しないようにしたいので、ボリュームの設定を行います。
Volumesの項目を展開表示させ、まずはgrafana-storageを削除します。
grafana-storageの右にあるRemove Volumeボタンを押下します。

次に下部Add VolumeBind-mount a directory from the nodeを選択します。

ボリュームの各設定について入力します。

・Volume Name:任意のボリューム名
・Path on the Node:データを保存するノード上のディレクトリのパス
・Mount Point:ノード上のディレクトリにマウントするコンテナ内のディレクトリのパス

上記のように、環境変数とボリュームの設定を入力し終えたら、下部のSaveボタンを押下します。
しばらく待ってgrafana-cluster-monitoringのStateがActiveになったら準備完了です。

ClusterのTOP画面に戻りましょう。
所々に マークが表示されているのが分かります。

どこでもいいのでマークをクリックしてみましょう。
grafanaのダッシュボードが表示されましたね。
いろいろ見てみる前に、まずはgrafanaにログインしましょう。左下Sign inを選択します。

ユーザ名はadmin、初期パスワードもadminです。

ログインするとパスワード変更を求められます。任意のパスワードに変更しましょう。

晴れてログイン完了です。左のメニューアイコンが多く並んでいます。
また、ダッシュボードもデフォルトでいくつか作成されています。
これらを表示することでクラスタの様々なメトリックを確認できます。

grafanaの詳細な利用方法についての説明は割愛します。別サイト等を参照ください。
情報を参照するのみであればこのままでも構いませんが、通知を実施する場合にはデフォルト設定だとうまくいきません。
通知を実施する場合は、以下手順によりデータソースを作成してそれを用いるようにしてください。

まず左メニューよりData Sourcesを選択します。

デフォルトでRANCHER_MONITORINGというPrometheusのデータソースが存在します。
このデータソースを使って各種メトリック監視設定をすると、通知の際エラーとなってしまいます。
そこで新たなデータソースを作成します。
右のAdd data sourceボタンを押下し、続けてPrometheusを選択します。

Prometheusデータソースの設定画面が表示されますので必要事項を入力します。

・Name:任意のデータソース名
・Default:デフォルトのデータソースにする場合は有効にします(任意)
・URL:http://access-prometheus
・HTTP Method:GET
上記を入力したらSave & Testボタンを押下してください。

上のようにData source is workingの表示が出れば完了です。
通知を行う際は、ここで作成したデータソースを利用するようにしてください。

Rancher運用してみて

上記例は2台のサーバによる最小構成ですが、MasterノードおよびWorkerノードをそれぞれ複数台で構成すれば、それなりの規模のサービスの稼働にも耐えられますし、可用性の極めて高いシステムを稼働させることができます。その場合、Rancherサーバがシングル構成のままですが、Rancherが落ちても、ClusterやCluster上にあるPOD(コンテナ)は稼働し続けるためサービスは止まりませんし、オートヒーリングなどのk8sの機能も維持されます。上記例のようにRancherのデータをホスト上のディレクトリに外出ししておけば、再度docker-compose up -dするとRancherも元通り!なので、今のところ個人的にはRancherの冗長化まではあまり必要性を感じていません。(簡単な冗長化の手段が思い付かないだけですが・・・)
監視機能もついていますし新しいバージョンではIstioも付いてきます。
またここでの例では英語表示でしたが、日本語表示も可能です。
kubernetesの敷居をかなり低くしてくれるとても優れた仕組みだと感じます。
みなさんも是非利用してみてはいかがでしょうか。