第二システム部 第1課の小浜です。
前回の記事 の続きで、今回はRancher(RKE)を使ってシングルノードのKubernetesクラスタをWindows上で作成してみます。
背景解説
- Dockerコンテナ
プログラムの走行環境をまるごと一つのDockerイメージにまとめて配布&実行する入れ物です。
開発言語や開発環境によってはバージョンの組み合わせで動かないケースもあるのですが、
走行環境をまるごと1パックにまとめて配布&実行することでこの問題を解決します。
Dockerコンテナを複数種類同時に使う場合でも、互いに干渉しない独立環境となるので
環境衝突の心配もなく便利に使えます。 -
Kubernetes
KubernetesはDockerコンテナ実行環境のオーケストレーションツールです。
管弦楽団のオーケストラを想像してもらうとわかりやすいかもしれません。
Dockerコンテナが10個以上走行するようになると、人力で管理するのが大変になってきます。
そこで、コンテナの管理を手助けするツールがKubernetesです。 -
Rancher
Rancher 社が開発しているコンテナ管理、クラスタ管理の統合ソフトです。
元々はDockerコンテナを管理するソフトでしたが、Kubernetes対応を進めてRancher 2.0ではKubernetesツールになりました。
インストールが何かと面倒なKubernetesクラスタを比較的短い手間で建てる機能を持っています。(今回の記事ではこの特徴を使います。)
Kubernetesクラスタを10個以上管理することになると、色々大変なことになるので、複数のKubernetesクラスタを統合管理するソフトとしての性格も持っています。
VMWare上、Amazon 上、Google Cloud 上にKubernetesクラスタを建てる機能もあります。
(ただし、RancherがKubernetes Master Nodeになって管理する前提なので、Amazon EKSなどのKubernetesクラスタは管理できません。)
参考文献
- http://muramasa64.fprog.org/diary/?date=20151102#p01 VagrantでVirtualBoxのデフォルトNATネットワークのアドレスを変更する – 雑記帳(2015-11-02)
- https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce-1
- https://rancher.com/docs/rancher/v2.x/en/ 今回はこの手順に沿ってインストールスクリプトを作成しました。
前提とする構成
- Windows 10 Pro version 1809 Hyper-VはOFFである必要があります。
- Vagrant 2.2.4
- VirtualBox バージョン 6.0.6 r130049
- Windows機のメモリは8GB以上を想定しています。
作成する構成
- Docker version 18.09.0
- Kubernetes version 1.13.4
- VirtualBoxで作成する仮想マシンのうち、一つ目のネットワークアダプタは通常のNAT型とし、2つ目のネットワークアダプタをホストオンリー型に設定して、ホストPCからIPアドレス192.168.33.11を宛先とすると仮想マシンに通信可能なように構成します。(NATのみだと、仮想マシン内部に建てたサービスにアクセスするためにポートフォワード設定が必要になるため)
セットアップ準備
chocolateyによる各種ツールのインストール
Windowsにvagrantをインストールするため、chocolateyを使用します。
- https://chocolatey.org/ Chocolatey – The package manager for Windows
chocolateyはWindows向けのパッケージマネージャーです。
Mac OS Xで言うところのHomebrewのようなもので、Microsoft公式提供ではありませんが、色々なソフトウェアをコマンドラインからインストールすることができます。
chocolateyのインストールを行います。管理者権限で起動したWindows PowerShellから以下を入力します。
1
|
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
|
次に、Chocolateyを使ってツールをインストールしていきます。
- VirtualBox
VirtualBoxはOracle提供のOS仮想化アプリケーションです。
WindowsのHyper-Vはハイパーバイザー型であり、ホストOSのWindowsも内部的には仮想化されますが、VirtualBoxは仮想化アプリケーションなのでホストOS上で動作します。 - vagrant
vagrantはコマンドラインからVirtualBoxなどの仮想化アプリケーションを操作するラッパーコマンドです。 - git
この記事では、Git Bash for Windowsの実行環境(MSYS2)のGit Bashを利用します。 - docker-cli
dockerのclient側のコマンドをインストールします。利用例で使用します。 - kubernetes-cli
kubernetesのclient側のコマンドをインストールします。利用例で使用します。
管理者権限で起動したWindows PowerShellから以下を入力します。
1
2
3
4
5
|
choco install -y virtualbox
choco install -y vagrant
choco install -y git
choco install -y kubernetes-cli
choco install -y docker-cli
|
ここで、管理者権限で起動したWindows PowerShellを終了します。
vagrant box イメージの取得
新しくWindows PowerShellを起動します。
vagrantを使用して、CentOS7イメージを取得します。
- 参考 https://www.vagrantup.com/docs/index.html Documentation – Vagrant by HashiCorp
vagrant + virtualbox を使う場合は、ユーザー権限で起動したPowerShellから操作を行います。
1
2
|
# centos7イメージの取得
vagrant box add centos/7 --provider virtualbox
|
作業用zipの展開
今回はセットアップスクリプトが大きいので、zip形式で提供します。
HDD/SDDの空き容量が200GB程度あるドライブで展開してください。
zipファイルを展開すると、以下のようなディレクトリ構成になります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
├─vagrant
│├─310_centos_rancher_1node_rke_nfs
│││hoge.sh
│││rancher-get-token.sh
│││setup-rancher-kube-config.sh
│││setupscripts-1-base.sh
│││setupscripts-2-ansible-prepair.sh
│││setupscripts-3-rke-prepair.sh
│││setupscripts-4-rke-run.sh
│││setupscripts-5-storage.sh
│││setupscripts-6-utils.sh
│││Vagrantfile
│││
││└─playbooks
│││ansible.cfg
│││(中略)
││
│└─vagranthdd
|
ファイル内容の確認
セットアップ動作の入り口となるファイルについて、少し見ていきます。
Vagrantfileの内容の確認
vagrant/310_centos_rancher_1node_rke_nfs/Vagrantfileの内容を確認します。
- 仮想マシンのメモリ量は vb.memory = “4000” としています。
- 仮想マシンに仮想ディスクを2個付加しています。
一つはNFS用で、StorageClassから確保されるPV(Persistent Volume)用です。
もう一つは、/var/lib/dockerにマウントします。
巨大なDockerイメージを数多く扱うようになると、Dockerイメージ用のディスク領域が不足してくるので
外部ディスクとして50GBを追加しています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
# node 1 : rke実行。ansible実行はこちらから。
config.vm.define "node1" do |machine|
machine.vm.hostname = "node1.k8s.local"
machine.vm.network :private_network, ip: "192.168.33.11", private_network: "intnet"
machine.vm.provider "virtualbox" do |vb|
vb.memory = "4000"
vb.cpus = "2"
vb.customize ["modifyvm", :id, "--natnet1", "172.16.1.0/24"]
# add storage /dev/sdb
file_to_disk = "../vagranthdd/310_node1_sdb.vdi"
unless File.exist?(file_to_disk)
vb.customize ['createhd', '--filename', file_to_disk, '--size', 30 * 1024] # 30GB
end
vb.customize ['storageattach', :id, '--storagectl', 'IDE', '--port', 0, '--device', 1, '--type', 'hdd', '--medium', file_to_disk]
# add storage /dev/sdc
file_to_disk_c = "../vagranthdd/310_node1_sdc.vdi"
unless File.exist?(file_to_disk_c)
vb.customize ['createhd', '--filename', file_to_disk_c, '--size', 50 * 1024] # 50GB
end
vb.customize ['storageattach', :id, '--storagectl', 'IDE', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', file_to_disk_c]
end
# PROXY設定を環境変数PROXY_SERV_PORT,PROXY_USER,PROXY_PASSから読み込んでVM側に持ち込む
# https://qiita.com/hakomikan/items/860bb960699889849933 Vagrantfile をコミットするために - Qiita
machine.vm.provision "export env",
type: "shell",
run: "always",
privileged: true,
inline: <<-SHELL
echo "# vagrant script for every boot" > /etc/profile.d/vagrant.sh
echo export PROXY_SERV_PORT=#{ENV['PROXY_SERV_PORT']} >> /etc/profile.d/vagrant.sh
echo export PROXY_USER=#{ENV['PROXY_USER']} >> /etc/profile.d/vagrant.sh
echo export PROXY_PASS=#{ENV['PROXY_PASS']} >> /etc/profile.d/vagrant.sh
echo export PROXY_SKIP=#{ENV['PROXY_SKIP']} >> /etc/profile.d/vagrant.sh
echo "export INSECURE_REGISTRY=\\"#{ENV['INSECURE_REGISTRY']}\\"" >> /etc/profile.d/vagrant.sh
echo "export ADDITIONAL_ETC_HOSTS_1=\\"#{ENV['ADDITIONAL_ETC_HOSTS_1']}\\"" >> /etc/profile.d/vagrant.sh
echo "export ADDITIONAL_ETC_HOSTS_2=\\"#{ENV['ADDITIONAL_ETC_HOSTS_2']}\\"" >> /etc/profile.d/vagrant.sh
echo "export ADDITIONAL_ETC_HOSTS_3=\\"#{ENV['ADDITIONAL_ETC_HOSTS_3']}\\"" >> /etc/profile.d/vagrant.sh
chmod +x /etc/profile.d/vagrant.sh
SHELL
# shell provisioner インストールなど初期化処理を行う
machine.vm.provision "shell", path: "setupscripts-1-base.sh"
machine.vm.provision "shell", path: "setupscripts-2-ansible-prepair.sh"
machine.vm.provision "shell", path: "setupscripts-3-rke-prepair.sh"
machine.vm.provision "shell", path: "setupscripts-4-rke-run.sh"
machine.vm.provision "shell", path: "setupscripts-5-storage.sh"
machine.vm.provision "shell", path: "setupscripts-6-utils.sh"
end
end
|
hoge.shの内容の確認
よく使うvagrantコマンドをまとめて、hoge.shという名前のBashスクリプトにしています。
vagrant/310_centos_rancher_1node_rke_nfs/hoge.shの内容を確認します。
- bash hoge.sh clean とすると、仮想マシンと付加した全ディスクを消去します。
- bash hoge.sh build とすると、仮想マシンをセットアップして、その後にスナップショットを作成します。
- bash hoge.sh restore とすると、build時に作成したスナップショットの所まで戻します。
コメントで色々設定方法が書いてありますので、参考にしてください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
#!/bin/bash
set -e
# PROXY環境下では、vagrant起動前に以下の環境変数を指定すること。
# export PROXY_SERV_PORT=proxy.example.com:8080
# export PROXY_USER=proxy_user
# export PROXY_PASS=proxy_password
# export PROXY_SKIP=*.noproxy.example.com
# insecure registryを追加する場合は、vagrant起動前に以下を以下の環境変数を指定すること。半角スペース区切りで複数記述可能
export INSECURE_REGISTRY="$INSECURE_REGISTRY docker-registry-docker.defautl.svc.k8s.local:5000"
# /etc/hostsに追加したい設定がある場合は、vagrant起動前に以下を以下の環境変数を指定すること。
# export ADDITIONAL_ETC_HOSTS_1="192.168.33.11 master.default.svc.k8s.local master"
# export ADDITIONAL_ETC_HOSTS_2=
# export ADDITIONAL_ETC_HOSTS_3=
# HDDを追加するので、vdiファイルを置くディレクトリを作成しておくこと
mkdir -p ../vagranthdd
if [ $# -eq 0 ]; then
ARGS="up"
else
ARGS="$@"
fi
for MODE in $ARGS
do
if [ x"$MODE"x = x"clean"x ]; then
# vagrant 全部消去
ifvagrant $VAGRANT_OPT destroy -f; then
echo "success." > /dev/null
else
echo "vagrant destroy -f failure. but continue."
fi
fi
if [ x"$MODE"x = x"restore"x ]; then
# snapshotがある場合は、snapshotから復元
RESULT=$( vagrant snapshot list | grep -v " Moving on..." | tail -n 1 )
if [ ! -z "$RESULT" ]; then
# vagrant snapshot から resotre
vagrant snapshot restore $RESULT
else
echo "snapshot not found. abort."
exit 1
fi
fi
if [ x"$MODE"x = x"up"x -o x"$MODE"x = x"build"x]; then
# vagrant起動。node1
# node1からansible実行とrke実行を行う
vagrant $VAGRANT_OPT up node1
RC=$?
if [ x"$MODE"x = x"build"x ]; then
if [ $RC -eq 0 ]; then
# build成功時には snapshotを採取する
vagrant snapshot save snapshot-$(date +%Y%m%d-%H%M%S)
fi
fi
fi
done
|
セットアップ実行
Git-Bash for WindowsのBash端末を起動して、以下のコマンドでhoge.shを起動します。
セットアップスクリプトが自動実行されます。
大量にダウンロードしながら構築するので、数時間待ちます…。
1
2
|
cd vagrant/310_centos_rancher_1node_rke_nfs
bash hoge.sh clean build
|
以下のような表示になれば、セットアップは完了です。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
node1: ■ セットアップ完了
node1: ■ PCの windows/system32/drivers/etc/hosts ファイルに「192.168.33.11master.default.svc.k8s.localmaster」を追記。
node1: ■ PCのブラウザのプロキシ除外設定に「master.default.svc.k8s.local」を追加。
node1: ■ PCのブラウザからhttps://master.default.svc.k8s.local/にアクセスする
node1: ■ Rancher初期ユーザーadmin
node1: ■ Rancher初期パスワードxxxxxxxxxxxxx
node1: ■ Rancher Default Admin Tokentoken-xxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
node1: ■ bashからsource setup-kube-config.shすると、~/.kube/configファイルを上書き作成し、PCからkubectlコマンドを発行できます。
node1: ■ また、DOCKER_HOST環境変数を設定しているためdockerコマンドも使用できます。
==> node1: Snapshotting the machine as 'snapshot-20190504-192219'...
==> node1: Snapshot saved! You can restore the snapshot at any time by
==> node1: using `vagrant snapshot restore`. You can delete it using
==> node1: `vagrant snapshot delete`.
|
上のログにも表示されていますが、Windows PCのwindows/system32/drivers/etc/hosts ファイルに「192.168.33.11 master.default.svc.k8s.local master」を追記して、
ブラウザから https://master.default.svc.k8s.local/ にアクセスすると、Rancherの Web画面にアクセスできます。
使用例
仮想マシンにsshで接続してkubectl
それではちょっと使ってみましょう。
一般ユーザー権限のPowerShellから操作します。
1
2
|
# Power Shell の文字コードをUTF-8に変更します。
chcp 65001
|
vagrantマシンにsshで入ります。
1
|
vagrant ssh
|
vagrantの場合、最初はvagrantというユーザー名でログインすることになります。
kubernetesやdockerは、rootになって操作します。
1
|
sudo bash
|
以下のコマンドを入力し、kubernetesのシステムが動作しているか確認します。
1
|
kubectl -n kube-system get svc,pod
|
表示結果は以下のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[root@node1 vagrant]# kubectl -n kube-system get svc,pod
NAME TYPECLUSTER-IPEXTERNAL-IP PORT(S) AGE
service/kube-dns ClusterIP 10.43.0.10<none>53/UDP,53/TCP 25h
service/metrics-server ClusterIP 10.43.151.226 <none>443/TCP 25h
service/tiller-deployClusterIP 10.43.64.1<none>44134/TCP 25h
NAMEREADY STATUSRESTARTS AGE
pod/canal-s2tfw 2/2 Running 225h
pod/cert-manager-6464494858-tbcjp 1/1 Running 125h
pod/kube-dns-65cd5cdff5-jgw8w 3/3 Running 325h
pod/kube-dns-autoscaler-77bc5fd84-gnhkv 1/1 Running 125h
pod/metrics-server-58bd5dd8d7-4x99r 1/1 Running 125h
pod/rke-ingress-controller-deploy-job-l9v7m 0/1 Completed 025h
pod/rke-kube-dns-addon-deploy-job-wplrk 0/1 Completed 025h
pod/rke-metrics-addon-deploy-job-tjb6r0/1 Completed 025h
pod/rke-network-plugin-deploy-job-lfgmj 0/1 Completed 025h
pod/tiller-deploy-5b7c66d59c-x2l8s1/1 Running 125h
[root@node1 vagrant]#
|
Windows PCのGit Bashからkubectl
毎回仮想マシンにvagrant sshで入るのも大変なので、Windows PC側のGit Bash for Windowsから、仮想マシン内部のkubernetesに接続してみます。
Git Bash for WindowsのGit Bashを起動します。
以下のコマンドで、setup-rancher-kube-config.shをsourceすると、~/.kube/configファイルにKubernetesクラスタの接続先情報が書き込まれます。
1
2
|
cd vagrant/310_centos_rancher_1node_rke_nfs
source setup-rancher-kube-config.sh
|
これで、Windows PCから仮想内部マシン内部のKubernetesに接続して操作が可能になります。
以下、実行例を示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
$ kubectl -n kube-systemget svc,pod
NAME TYPECLUSTER-IPEXTERNAL-IP PORT(S) AGE
service/kube-dns ClusterIP 10.43.0.10<none>53/UDP,53/TCP 25h
service/metrics-server ClusterIP 10.43.151.226 <none>443/TCP 25h
service/tiller-deployClusterIP 10.43.64.1<none>44134/TCP 25h
NAMEREADY STATUSRESTARTS AGE
pod/canal-s2tfw 2/2 Running 225h
pod/cert-manager-6464494858-tbcjp 1/1 Running 125h
pod/kube-dns-65cd5cdff5-jgw8w 3/3 Running 325h
pod/kube-dns-autoscaler-77bc5fd84-gnhkv 1/1 Running 125h
pod/metrics-server-58bd5dd8d7-4x99r 1/1 Running 125h
pod/rke-ingress-controller-deploy-job-l9v7m 0/1 Completed 025h
pod/rke-kube-dns-addon-deploy-job-wplrk 0/1 Completed 025h
pod/rke-metrics-addon-deploy-job-tjb6r0/1 Completed 025h
pod/rke-network-plugin-deploy-job-lfgmj 0/1 Completed 025h
pod/tiller-deploy-5b7c66d59c-x2l8s1/1 Running 125h
$
|
Windows PCのGit Bashからdocker コマンド
仮想マシンにvagrant sshでログインすれば docker build コマンドも使用できますが、Windows PC側からも利用できると便利です。
環境変数 DOCKER_HOST に tcp://192.168.33.11:2375 と指定すると、dockerコマンドは仮想マシン内部のdockerデーモンに接続しに行くようになります。
※ dockerデーモンの設定で、暗号化無し、認証無しの接続を許可するのは本当は良くありませんが、今回は仮想マシンのprivate network(接続できるのはホストOSからのみ)ということで、特別に見逃してください。
以下、使用例です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
$ export DOCKER_HOST=tcp://192.168.33.11:2375
$ docker version
Client:
Version: 18.09.0
API version: 1.39
Go version:go1.10.3
Git commit:51668a30
Built: 11/09/2018 18:45:38
OS/Arch: windows/amd64
Experimental:false
Server: Docker Engine - Community
Engine:
Version:18.09.0
API version:1.39 (minimum version 1.12)
Go version: go1.10.4
Git commit: 4d60db4
Built:Wed Nov7 00:19:08 2018
OS/Arch:linux/amd64
Experimental: false
$
|