2018.07.09

Rancher Kubernetes Engineを使った爆速Kubernetes クラスタ構築


はじめに

こんにちは。次世代システム研究室のY.Kです。
次世代システム研究室ではこちらの記事(Kubernetes Introduction)で紹介したようにコンテナ技術、特にKubernetes(以下k8s)の調査を行い、実サービス運用への組み込みも行っております。
k8sがコンテナ運用のスタンダードになりつつある中、検証をするためにクラスタを構築するのはDocument通りに進めると手間がかかる部分もあります。
本記事ではk8sクラスタの可視化ツールRancherのコミュニティが公開しているRancher Kubernetes Engine(以下RKE)を用いて爆速でクラスタを構築したいと思います。


読むべき対象者

  • オンプレミスサーバー・VPS・クラウド環境にk8sクラスタを構築したい人
  • k8sで利用する仕組みのインストールの手間をかけずにk8sを試したい人

RKEを使うと何が出来るのか

RKEを使うと超簡単・爆速にk8sクラスタを構築することができます。
さらに、実行ファイルが設定ファイルを読み込んでクラスタの構築を行ってくれるため自動化も容易です。
したがって、新しくクラスタを構築する際にはもちろん、バージョンアップなどの検証用クラスタ構築に手間を掛けるということもなくなりますし、不幸にもクラスタがなにかの拍子に落ちてしまっても再構築が容易にできます。

minikube/kubeadmとの違い

minikubeはそもそもシングルノードで検証するためのものなのでクラスタを構築する際には利用できません。k8sを試すためには良いかもしれませんが、クラスタならではのネットワークや運用の検証などには向きません。
kubeadmはこちらの記事にあるような手順に従えばクラスタの構築はできますが、kubeletなどをホストに直接インストールしなくてはなりません。RKEはk8sに必要なプロセスはすべてDocker containerによって動作するのでそれらをインストールする必要はないですし、imageをpullするだけでそれらのバージョンアップも容易に可能です。そして何より、設定ファイルさえ用意してしまえばコマンド1つで構築できてしまうという簡単さも魅力的です。では、構築方法を見ていきましょう。


RKEを使うための事前準備

事前準備として必要なことは以下の3つです。
  • k8sで用いるポートの開放
  • クラスタノードへのDockerのインストール
  • RKEバイナリのダウンロード

ポートの開放

RKEのドキュメントには以下を開けるように記載がありますが、30000台などは利用するものだけ開けるようにしましょう。
      
  • 80/tcp
  • 443/tcp
  • 6443/tcp
  • 2379-2380/tcp
  • 10250-10256/tcp
  • 30000-32767/tcp
  • 8472/udp

Dockerのインストール

各ノードへログインして以下のコマンドだけで完了です。
sudo curl https://releases.rancher.com/install-docker/17.03(Docker-version).sh | sh

※iptablesを再起動するとDockerも再起動をしないとネットワークの反映がリセットされてしまうことがあるようなので注意が必要です。(参照

RKEのダウンロード

こちらは各ノードには必要なく、クラスタを管理したいサーバー1台にインストールすれば問題ありません。
#versionはこれからどんどん上がるはずなので注意
wget https://github.com/rancher/rke/releases/download/v0.1.7/rke
#実行権限付与
chmod +x rke

RKEで爆速クラスタ構築

さて、それではクラスタを構築しましょう。
設定ファイル(cluster.yml)を用意することで構築が可能です。
この設定ファイルは自分で作成することもできますし、対話的にコマンドを用いて作成することもできます。

自分で設定ファイルを用意する場合

以下が最低限の設定となります。
今回はmaster-node1台、worker-node1台の計2台構成ですが、設定ファイルのnodesを増やすだけで簡単に大規模クラスタが構築できます。
もっと詳しく知りたい場合はこちらを参照されたい。

# 各nodeのIP、ログインユーザー、sshキー、roleを設定
# roleはmasterの用途がcontrolplane、etcdを入れる場合etcd, 
# worker nodeにする場合workerを指定します
nodes:
  - address: XXX.XXX.XXX.XXX
    user: "hoge"
    role: [controlplane, etcd]
    ssh_key_path: "hoge.key.path"
  - address: XXX.XXX.XXX.XXX
    user: "hoge"
    role: [worker, etcd]
    ssh_key_path: "hoge.key.path"

# 以下で利用するサービスのDocker Imageを指定する
services:
  etcd:
    image: quay.io/coreos/etcd:v3.1.12
  kube-api:
    image: rancher/k8s:v1.8.1-rancher2
  kube-controller:
    image: rancher/k8s:v1.8.1-rancher2
  scheduler:
    image: rancher/k8s:v1.8.1-rancher2
  kubelet:
    image: rancher/k8s:v1.8.1-rancher2
  kubeproxy:
    image: rancher/k8s:v1.8.1-rancher2

RKEを用いて対話的に設定ファイルを作成する場合

RKEは対話的に設定ファイルを生成することも可能です。
※以下の実行ユーザーはrkeの実行権限さえあればrootである必要はありません。

./rke config

[+] Cluster Level SSH Private Key Path [~/.ssh/id_rsa]:
[+] Number of Hosts [1]: 2
[+] SSH Address of host (1) [none]: XXX.XXX.XXX.XXX
[+] SSH Port of host (1) [22]: 22
[+] SSH Private Key Path of host (XXX.XXX.XXX.XXX) [none]:
[-] You have entered empty SSH key path, trying fetch from SSH key parameter
[+] SSH Private Key of host (XXX.XXX.XXX.XXX) [none]:
[-] You have entered empty SSH key, defaulting to cluster level SSH key: ~/.ssh/id_rsa
[+] SSH User of host (XXX.XXX.XXX.XXX) [ubuntu]: hoge
[+] Is host (XXX.XXX.XXX.XXX) a control host (y/n)? [y]: y
[+] Is host (XXX.XXX.XXX.XXX) a worker host (y/n)? [n]: n
[+] Is host (XXX.XXX.XXX.XXX) an Etcd host (y/n)? [n]: y
[+] Override Hostname of host (XXX.XXX.XXX.XXX) [none]: kube-master
[+] Internal IP of host (XXX.XXX.XXX.XXX) [none]:
[+] Docker socket path on host (XXX.XXX.XXX.XXX) [/var/run/docker.sock]:
[+] SSH Address of host (2) [none]:
.
.
.
.
対話的に作成される設定ファイルの名前はcluster.ymlです。

クラスタ構築

設定ファイルを作成したら以下のコマンドを実行するだけです。(どーん
./rke up --config cluster.yml

INFO[0000] Building Kubernetes cluster
INFO[0000] [dialer] Setup tunnel for host [XXX.XXX.XXX.XXX]
INFO[0000] [dialer] Setup tunnel for host [XXX.XXX.XXX.XXX]
.
.
.
.
INFO[0077] [ingress] ingress controller nginx is successfully deployed
INFO[0077] [addons] Setting up user addons
INFO[0077] [addons] no user addons defined
INFO[0077] Finished building Kubernetes cluster successfully
# 上の記述が出れば完了!!!

成功するとkube_config_cluster.ymlというファイルが生成されているはずです。
ここまででクラスタは構築できました。が、このままではPODは展開できません。

RKEで構築したクラスタにPODを展開するには

kubectlをインストールして、構築したk8sクラスタを登録すると、ymlからPODのレプリカセットを展開することが可能になります。
以下が手順です。
kubectlのインストール方法はOSごとに違うので、こちらのページを参照してください。


インストールできたら、kubectlからクラスタを参照出来るようにします。
先程生成されたファイルをkubectlのconfigとして設定します。

mkdir ~/.kube
cp ~/kube_config_cluster.yml ~/.kube/config

これで、kubectlから作成したk8sクラスタを操作できるようになります。

> kubectl get nodes
XXX.XXX.XXX.XXX   Ready     controlplane,etcd   1m        v1.8.1
XXX.XXX.XXX.XXX   Ready     worker              1m        v1.8.1

ここまでくればPODの展開もdeployment.ymlを用意するだけ!!!
> kubectl apply -f deployment.yml
> kubectl get pods
NAME                                   READY     STATUS    RESTARTS   AGE
deployment-6b756bd465-2q7mt   1/1      Running    1          1m



まとめ

いかがでしたでしょうか?
少し前までは私もk8sの公式ドキュメントを読んでansibleでetcdやkubeletなどをインストールするroleを自前で作成していましたが、RKEを用いると、設定ファイルだけ書いてしまえば爆速でクラスタが構築できてしまいます。kubeadmよりも簡単に構築できるのではないでしょうか?
これからk8sを試そうと思っている方は是非利用してみてください。
次回はk8sクラスタの状態を可視化するRancher本体について紹介したいと思います。


最後に

次世代システム研究室では、コンテナ技術を用いてモダンな構成でサービス運用を助けていただけるエンジニアを募集しています。興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧からご応募をお願いします。