Kubernates (k8s) を試したり、複数の物理ホストを使ってクラスタを組みたくなったのですが、何度も作っては壊しをしたいため Vagrantfile を作成してみました。これを使えば複数の物理サーバ上でも簡単に k8s クラスタを構築できます。
今回は以下のように物理ホストが 2 台あって、それぞれでWorker を動かし、片方で master を動かす構成で紹介します。
私の使用している環境では、最低限必要な、master と 1 つの worker の構築は 8分8秒 で完了し、追加となる 2つ目の worker の構築は 3分16秒で完了しました。workerの作成は各 host でパラレルに実行しても大丈夫です。
※構築時間はhostのマシン性能、ネットワーク転送の性能、プライベートリポジトリの存在など環境に大きく依存します。
クラスタの構築には Vagrant を使用し、Vagrant のプロバイダは Oracle VirtualBox 5.1 を使用します。Vagrant プラグインはvagrant-proxyconf
とvagrant-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/ホスト名を設定します。
worker
はmaster
同様にリソース量と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.yml
のhostname
に指定した名前が、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.yml
をhost2
へコピーしましょう。ネットワークが変わらなければ、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-proxyconf
とvagrant-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 では、以下のように環境変数KUBECONFIG
にkubectl.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.