#chiroito ’s blog

Java を中心とした趣味の技術について

8 分で Kubernates クラスタを構築する

Kubernates (k8s) を試したり、複数の物理ホストを使ってクラスタを組みたくなったのですが、何度も作っては壊しをしたいため Vagrantfile を作成してみました。これを使えば複数の物理サーバ上でも簡単に k8s クラスタを構築できます。

今回は以下のように物理ホストが 2 台あって、それぞれでWorker を動かし、片方で master を動かす構成で紹介します。

f:id:chiroito:20171103032843p:plain

私の使用している環境では、最低限必要な、master と 1 つの worker の構築は 8分8秒 で完了し、追加となる 2つ目の worker の構築は 3分16秒で完了しました。workerの作成は各 host でパラレルに実行しても大丈夫です。

※構築時間はhostのマシン性能、ネットワーク転送の性能、プライベートリポジトリの存在など環境に大きく依存します。

クラスタの構築には Vagrant を使用し、Vagrant のプロバイダは Oracle VirtualBox 5.1 を使用します。Vagrant プラグインはvagrant-proxyconfvagrant-disksizeを使用します。host で事前にインストールする作業は一番最後に記載してます。

k8sBuilderのダウンロード

まずは Vagrantfile を含む k8sBuilder を落としてきます。

> git clone https://github.com/chiroito/k8sBuilder.git
> cd k8sBuilder
> ls
Vagrantfile  build_registry.sh  config.yml  master.sh  os.sh  prepare_registry.sh

k8sの環境設定

config.ymlが設定ファイルです。大きく分けて以下の 5 つに分かれています。

  • host
  • network
  • docker
  • master
  • worker

hostは仮想マシンを動かすhostの設定です。ブリッジするNICと、共有ストレージの設定をします。 networkはネットワークとプロキシの設定です。 dockerはDockerレジストリの設定で、プライベートレジストリを使うことも、master 構築時に作成することもできます。 masterはk8sを管理するmaster の設定です。リソース量とIP/ホスト名を設定します。 workermaster同様にリソース量とIP/ホスト名を設定しますが、masterとは異なり複数のノード分の設定を書けます。複数のhostで使用する全workerを1つのconfig.ymlにまとめて書けます。

以下はプライベートリポジトリを使わずに 2 つのworkerを構築する例です。

config.yaml

host:
  interface: "enp3s0"
  shared_dir: "/mnt/vbshared"
network:
  netmask: "255.255.255.0"
  gateway: "192.168.0.254"
  dns: "192.168.0.254"
  domain: ""
  proxy_host: ""
  proxy_port: ""
  no_proxy: ""
docker:
  kube_repo: ""
  secure_repo: false
  build_registry: false
  prepare_registry: false
master:
  cpu: 1
  memory: 2048
  disksize: "40GB"
  ip: "192.168.0.51"
  hostname: "master"
worker:
  cpu: 1
  memory: 2048
  disksize: "40GB"
  members:
    1:
      ip: "192.168.0.101"
      hostname: "worker1"
    2:
      ip: "192.168.0.102"
      hostname: "worker2"

構築処理

k8sBuilder ではconfig.ymlhostnameに指定した名前が、OS, Vagrant, k8s 上で透過的に使えるようにしています。まずは、host1 上で master と 1 つの worker の構成で k8s を構築してみます。

> vagrant up master worker1
(略)
Please input user and password @container-registry.oracle.com.
Username(mail): <メールアドレスを入力>
Password: <パスワードを入力(表示されません)>
(略)
==> master:   kubeadm-setup.sh join --token 0e1731.c703c7cfe076e07a 192.168.0.51:6443
(略)
Please input k8s token.
Token: 0e1731.c703c7cfe076e07a
(略)
==> worker1: NAME          STATUS     AGE       VERSION
==> worker1: worker1       NotReady   3s        v1.7.4+0c1a5fc
==> worker1: master        Ready      6m        v1.7.4+0c1a5fc

途中でユーザ名とパスワードを聞かれます。これはOracleが公開しているDockerレジストリのものです。以下でアカウントを無料で作成できます。
Register for an Oracle Container Registry Account
このレジストリでは、Kubernates、OpenStack、MySQL などの OSS よりのソフトウェアのほか、Oracle Database や WebLogic Server などの商用ソフトウェアのイメージもあります。

masterの構築が終わるとトークンが表示されます。このトークン(この例では0e1731.c703c7cfe076e07a)はworkerの構築時に必要となりますので必ず控えてください。worker構築時にPlease input k8s token.と出力されたら先ほどのトークンを入力してください。

構築が完了すると、ノードの一覧が出力されます。上記のログでは worker1 は NotReady ですが、すぐに Ready になります。

masterの構築が終わった時点で、shared_dir に指定したディレクトリにkubectl.confというファイルがありますのでこちらのファイルを使用して k8s へ接続できます。

次に、host2上で 2 つめの worker を起動します。まずは、host1で使用したconfig.ymlhost2へコピーしましょう。ネットワークが変わらなければ、host2 用へ修正する必要はありません。

> vagrant up worker2
(略)
==> worker2: NAME          STATUS     AGE       VERSION
==> worker2: worker1       Ready      3m        v1.7.4+0c1a5fc
==> worker2: worker2       NotReady   3s        v1.7.4+0c1a5fc
==> worker2: master        Ready      10m       v1.7.4+0c1a5fc

これで、複数ホスト上で Kubernates を構築することができました。処理時間が長く掛かった場合、多くの場合はレジストリから Kubernates 関連のイメージをダウンロードすることに時間が掛かっています。同一ネットワーク内にプライベートレジストリを作成して、Kubernates 関連のイメージをPushしておくことで大幅な速度向上が見込めます。k8s を何度も作っては壊すを繰り返す場合にはプライベートレジストリの作成をお奨めします。

Kubernates 関連のイメージをプッシュするスクリプトを含めています。既存のプライベートレジストリのIPが192.168.0.1、ポートが5000の場合は以下のように実行し、config.ymlは以下のように設定します。

> docker login container-registry.oracle.com
> prepare_registry.sh 192.168.0.1:5000

config.yml

docker:
  kube_repo: "192.168.0.1:5000"
  secure_repo: false
  build_registry: false
  prepare_registry: false

環境の作成例

今回試したそれぞれのバージョンは以下です。

  • Vagrant 2.0.0
  • vagrant-proxyconf (1.5.2)
  • vagrant-disksize (0.1.2)
  • VirtualBox 5.1.30

host

host が Oracle Linux 7.4 の場合は、root ユーザで以下を実行すると必要な環境が揃います。Vagrant のプロバイダには Oracle VirtualBox 5.1 を使用します。Vagrant のプラグインはvagrant-proxyconfvagrant-disksizeを使用します。

yum install -y --enablerepo ol7_addons VirtualBox-5.1
wget https://releases.hashicorp.com/vagrant/2.0.0/vagrant_2.0.0_x86_64.rpm
yum localinstall -y vagrant_2.0.0_x86_64.rpm
vagrant plugin install vagrant-proxyconf
vagrant plugin install vagrant-disksize

k8s client (Windows)

k8s に接続する Windows では、以下のように環境変数KUBECONFIGkubectl.confを指定してからkubectlを使用します。

Windows 用のkubectlはこちらからダウンロードします。
https://storage.googleapis.com/kubernetes-release/release/v1.7.4/bin/windows/amd64/kubectl.exe

> set KUBECONFIG=C:\xxx\kubectl.conf
> kubectl get nods
NAME          STATUS     AGE       VERSION
worker1       Ready      3m        v1.7.4+0c1a5fc
worker2       Ready      5s        v1.7.4+0c1a5fc
master        Ready      10m       v1.7.4+0c1a5fc

参考

Oracle® Linux 7 Oracle Linux Container Services for use with Kubernetes User's Guide
Oracle Blogs 日本語のまとめ: [Docker] Announcing Oracle Linux Container Services for use with Kubernetes
Oracle Blogs 日本語のまとめ: [Linux] Now available: Oracle Linux Vagrant Box
Oracle Linux Vagrant Boxes | Oracle, Software. Hardware. Complete.