第二システム部 第1課の小浜です。
前々回の記事と、前回の記事 の続きで、今回はkubeadmを使ってシングルノードのKubernetesクラスタをWindows上で作成してみます。
背景解説
- Dockerコンテナ
プログラムの走行環境をまるごと一つのDockerイメージにまとめて配布&実行する入れ物です。
開発言語や開発環境によってはバージョンの組み合わせで動かないケースもあるのですが、
走行環境をまるごと1パックにまとめて配布&実行することでこの問題を解決します。
Dockerコンテナを複数同時に使う場合でも、互いに干渉しない独立環境となるので
衝突の心配もなく便利に使えます。 -
Kubernetes
KubernetesはDockerコンテナ実行環境のオーケストレーションツールです。
管弦楽団のオーケストラを想像してもらうとわかりやすいかもしれません。
Dockerコンテナが10個以上走行するようになると、人力で管理するのが大変になってきます。
そこで、コンテナの管理を手助けするツールがKubernetesです。 -
kubeadm
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 docker-ce インストール for CentOS
- https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ kubeadmを使ったインストール
前提とする構成
- Windows 10 Pro version 1903 Hyper-VはOFFである必要があります。
- Vagrant 2.2.5
- VirtualBox バージョン 6.0.12 r133076
- Git for Windows 2.23.0
- Windows機のメモリは8GB以上を想定しています。
- Windows機の空きHDD容量は300GB以上必要です。
作成する構成
- Docker version 19.03.1
- Kubernetes version v1.15.4
- VirtualBoxで作成する仮想マシンのうち、一つ目のネットワークアダプタは通常のNAT型とし、2つ目のネットワークアダプタをホストオンリー型に設定して、ホストPCからIPアドレス192.168.33.10を宛先とすると仮想マシンに通信可能なように構成します。(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
19
20
|
vagrant
├─320-centos-kubeadm-1node-nfs
││hoge.sh
││README.md
││setup-kube-config.sh
││setupscripts-1-base.sh
││setupscripts-2-ansible-prepair.sh
││setupscripts-3-kubeadm-prepair.sh
││setupscripts-4-kubeadm-run.sh
││setupscripts-5-storage.sh
││setupscripts-6-utils.sh
││setupscripts.sh
││Vagrantfile
││
│└─playbooks
││ansible.cfg
│(中略)
│
└─vagranthdd
README.md
|
ファイル内容の確認
セットアップ動作の入り口となるファイルについて、少し見ていきます。
Vagrantfileの内容の確認
vagrant/320-centos-kubeadm-1node-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
62
|
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
config.vm.boot_timeout = 600
# master1 node
config.vm.define "master1" do |master1|
master1.vm.hostname = "master1"
master1.vm.network "private_network", ip: "192.168.33.10", private_network: "intnet"
master1.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/02_master1_sdb.vdi"
unless File.exist?(file_to_disk)
vb.customize ['createhd', '--filename', file_to_disk, '--size', 50 * 1024] # 50GB
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/02_master1_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
master1.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 インストールなど初期化処理を行う
master1.vm.provision "shell", path: "setupscripts-1-base.sh"
master1.vm.provision "shell", path: "setupscripts-2-ansible-prepair.sh"
master1.vm.provision "shell", path: "setupscripts-3-kubeadm-prepair.sh"
master1.vm.provision "shell", path: "setupscripts-4-kubeadm-run.sh"
master1.vm.provision "shell", path: "setupscripts-5-storage.sh"
master1.vm.provision "shell", path: "setupscripts-6-utils.sh"
end
end
|
hoge.shの内容の確認
よく使うvagrantコマンドをまとめて、hoge.shという名前にbashスクリプトにしています。
vagrant/320-centos-kubeadm-1node-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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
#!/bin/bash
function f-hoge() {
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.10 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 全部消去
while true
do
ifvagrant $VAGRANT_OPT destroy -f; then
echo "success." > /dev/null
sleep 15
break
else
echo "vagrant destroy -f failure. but continue."
sleep 15
fi
done
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 ]; then
# vagrant起動。
for i in master1
do
vagrant $VAGRANT_OPT up $i
RC=$?
if [ $RC -ne 0 ]; then echo "vagrant up $i failed. abort." ; return 1 ;fi
sleep 15
done
fi
if [ x"$MODE"x = x"halt"x ]; then
# vagrant終了
for i in master1
do
vagrant $VAGRANT_OPT halt $i
RC=$?
if [ $RC -ne 0 ]; then echo "vagrant halt $i failed. abort." ; return 1 ;fi
sleep 15
done
fi
if [ x"$MODE"x = x"build"x ]; then
# vagrant構築
for i in master1
do
vagrant $VAGRANT_OPT up $i
RC=$?
if [ $RC -ne 0 ]; then echo "vagrant up $i failed. abort." ; return 1 ;fi
done
# snapshot採取
for i in master1
do
# build成功時には snapshotを採取する
# 多ノードの場合、まとめてsnapshotをとるとflannelが死ぬ
SNAP_DATE=$(date +%Y%m%d-%H%M%S)
echo "snapshot save $i "
vagrant snapshot save $i snapshot-$i-$SNAP_DATE
RC=$?
if [ $RC -ne 0 ]; then echo "vagrant snapshot save $i failed. abort." ; return 1 ;fi
sleep 15
done
fi
done
}
f-hoge "$@"
|
セットアップ実行
Git-Bash for WindowsのBash端末を起動して、以下のコマンドでhoge.shを起動します。
セットアップスクリプトが自動実行されます。
大量にダウンロードしながら構築するので、数時間待ちます…。
1
2
|
cd vagrant/320-centos-kubeadm-1node-nfs
bash hoge.sh clean build
|
以下のような表示になれば、セットアップは完了です。
1
2
3
4
5
6
7
8
|
master1: ■ セットアップ完了
master1: ■ bashからsource setup-kube-config.shすると、~/.kube/configファイルを上書き作成し、PCからkubectlコマンドを発行できます。
master1: ■ また、DOCKER_HOST環境変数を設定しているためdockerコマンドも使用できます。
snapshot save master1
==> master1: Snapshotting the machine as 'snapshot-master1-20190916-210353'...
==> master1: Snapshot saved! You can restore the snapshot at any time by
==> master1: using `vagrant snapshot restore`. You can delete it using
==> master1: `vagrant snapshot delete`.
|
使用例
仮想マシンに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
|
[root@master1 vagrant]# kubectl -n kube-system get svc,pod
NAMETYPECLUSTER-IPEXTERNAL-IP PORT(S)AGE
service/kube-dnsClusterIP 10.0.0.10 <none>53/UDP,53/TCP,9153/TCP 9m53s
service/tiller-deploy ClusterIP 10.0.38.214 <none>44134/TCP9m19s
NAMEREADY STATUSRESTARTS AGE
pod/coredns-5c98db65d4-j52tb1/1 Running 29m15s
pod/coredns-5c98db65d4-t576z1/1 Running 29m14s
pod/etcd-master11/1 Running 08m50s
pod/kube-apiserver-master11/1 Running 09m52s
pod/kube-controller-manager-master1 1/1 Running 19m47s
pod/kube-flannel-ds-amd64-9z9r6 1/1 Running 09m15s
pod/kube-proxy-2gt6z1/1 Running 09m15s
pod/kube-scheduler-master11/1 Running 08m52s
pod/tiller-deploy-8557598fbc-5ktcs1/1 Running 19m15s
[root@master1 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/320-centos-kubeadm-1node-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
|
$ kubectl -n kube-systemget svc,pod
NAMETYPECLUSTER-IPEXTERNAL-IP PORT(S)AGE
service/kube-dnsClusterIP 10.0.0.10 <none>53/UDP,53/TCP,9153/TCP 10m
service/tiller-deploy ClusterIP 10.0.38.214 <none>44134/TCP9m51s
NAMEREADY STATUSRESTARTS AGE
pod/coredns-5c98db65d4-j52tb1/1 Running 29m47s
pod/coredns-5c98db65d4-t576z1/1 Running 29m46s
pod/etcd-master11/1 Running 09m22s
pod/kube-apiserver-master11/1 Running 010m
pod/kube-controller-manager-master1 1/1 Running 110m
pod/kube-flannel-ds-amd64-9z9r6 1/1 Running 09m47s
pod/kube-proxy-2gt6z1/1 Running 09m47s
pod/kube-scheduler-master11/1 Running 09m24s
pod/tiller-deploy-8557598fbc-5ktcs1/1 Running 19m47s
$
|
Windows PCのGit Bashからdocker コマンド
仮想マシンにvagrant sshでログインすれば docker build コマンドも使用できますが、Windows PC側からも利用できると便利です。
環境変数 DOCKER_HOST に tcp://192.168.33.10:2375 と指定すると、dockerコマンドは仮想マシン内部のdockerデーモンに接続しに行くようになります。
※ dockerデーモンの設定で、暗号化無し、認証無しの接続を許可するのは本当は良くありませんが、今回は仮想マシンのprivate network(接続できるのはホストOSからのみ)ということで、特別に見逃してください。
以下のコマンドで、Windows PC側からdockerコマンドが使用できます。
1
2
|
export DOCKER_HOST=tcp://192.168.33.10:2375
docker version
|
以下に動作結果例を示します。
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.10:2375
$ docker version
Client:
Version: 19.03.1
API version: 1.39 (downgraded from 1.40)
Go version:go1.12.5
Git commit:5b38d82a-
Built: 09/04/2019 20:40:07
OS/Arch: windows/amd64
Experimental:false
Server: Docker Engine - Community
Engine:
Version:18.09.6
API version:1.39 (minimum version 1.12)
Go version: go1.10.8
Git commit: 481bc77
Built:Sat May4 02:02:43 2019
OS/Arch:linux/amd64
Experimental: false
$
|
上では docker version を表示しただけですが、Dockerfileを用意すれば docker build も可能になります。