前回の記事で作成したmicroservicesを運用するべく、コンテナオーケストレーションツールの定番といえるKubernetesに入門します。
Kubernetesについて
Kubernetes("k8s"と略されることも)は、コンテナ化されたアプリケーションを管理するツールです。 コンテナのデプロイやスケールを自動化できます。 Googleで使われていたツールがオープンソース化したもので、その性能に関しては問題ないでしょう。
Minikubeのインストール
Kubernetesを動かすにはコンテナが動作するクラスタが必要なのですが、ここではローカル環境でもKubernetesクラスタを作れるMinikubeを導入します。
使用環境
前回までの記事は、Windows 10の上でVirtualBoxで仮想化したCentOS 7を動かしていました。 MinikubeではKubernetesクラスタVMを動かす必要がある1ためVirtualBox VM上では動作しません。 そこで、Nested VirtualizationができそうなHyper-Vを採用し、その上で動くCentOS 7を使います。
Hyper-Vを有効にする
Windows 10 Proなら使えますが、初期状態では無効になっているようなので、有効にします。
参考: Windows 10 での Hyper-V の有効化 | Microsoft Docs
Nested Vitualizationを有効にする
こちらもHyper-Vの設定で初期状態では無効になっているようなので有効化します。
参考: ついに実現したNested Hyper-V を体感してみる - GMOインターネット株式会社
ホストのWindowsでPowerShellを管理者で実行し、Nested Virtualizationを有効にするPowerShellスクリプトをダウンロードします。
> Invoke-WebRequest https://raw.githubusercontent.com/Microsoft/Virtualization-Documentation/master/hyperv-tools/Nested/Enable-NestedVm.ps1 -OutFile D:\Enable-NestedVm.ps1
ポリシーでPSスクリプトを実行できないようになっているので実行ポリシーを変更します。
> Get-ExecutionPolicy Restricted > Set-ExecutionPolicy Unrestricted 実行ポリシーの変更 実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170) で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか? [Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): Y > Get-ExecutionPolicy Unrestricted
スクリプトを実行して、Nested Virtualizationを有効にします。
> D:\Enable-NestedVm.ps1 -VmName "my-k8s-vm" This script will set the following for my-k8s-vm in order to enable nesting: Virtualization extensions will be enabled Dynamic memory will be disabled Optionally enable mac address spoofing Optionally set vm memory to 4GB Input Y to accept or N to cancel:Y Mac Address Spoofing isn't enabled (nested guests won't have network). Would you like to enable MAC address spoofing? (Y/N)Y VM memory is set less than 4GB, without 4GB or more, you may not be able to start VMs. Would you like to set Vm memory to 4GB? (Y/N)Y
安全のため実行ポリシーをRestrictedに戻しておきます。
> Set-ExecutionPolicy -ExecutionPolicy Restricted
Minikube
ここまででホスト側の準備が整ったので、ここからゲストのCentOSで作業します。 https://github.com/kubernetes/minikube#linux に従います。
# curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \ && chmod +x minikube \ && sudo cp minikube /usr/local/bin/ \ && rm minikube
インストール確認
% minikube version minikube version: v0.28.2
kubectl
Kubernetesクラスタを操作するコマンドです。 こちらも https://kubernetes.io/docs/tasks/tools/install-kubectl/ に従ってインストールします。
# cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF # yum install -y kubectl
インストール確認
% kubectl version --client Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.2", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:17:28Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
KVM2 driver
KVMでKubernetesノードをうごかすためのドライバーです。 https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#kvm2-driver に従ってインストールします。
# yum install libvirt-daemon-kvm qemu-kvm libvirt-client # curl -Lo docker-machine-driver-kvm2 https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-kvm2 \ && chmod +x docker-machine-driver-kvm2 \ && cp docker-machine-driver-kvm2 /usr/local/bin/ \ && rm docker-machine-driver-kvm2
実行ユーザをlibvirt
グループにします。
# usermod -a -G libvirt <user>
動かそうとするとまだエラーになって、
% minikube start --vm-driver kvm2 Starting local Kubernetes v1.10.0 cluster... Starting VM... Downloading Minikube ISO 160.27 MB / 160.27 MB [============================================] 100.00% 0s E0907 12:09:28.504060 15847 start.go:174] Error starting host: Error creating host: Error creating machine: Error in driver during machine creation: creating network: checking network default: virError(Code=43, Domain=19, Message='Network not found: no network with matching name 'default'').
KVMのネットワーク設定がなかったので追加します。
参考: https://github.com/kubernetes/minikube/issues/828#issuecomment-374131237
# virsh net-list Name State Autostart Persistent ---------------------------------------------------------- # virsh net-define <(curl -s https://raw.githubusercontent.com/libvirt/libvirt/v3.9.0/src/network/default.xml) Network default defined from /dev/fd/63 # virsh net-autostart default Network default marked as autostarted # virsh net-start default Network default started # virsh net-list Name State Autostart Persistent ---------------------------------------------------------- default active yes yes
起動
ようやく動かせます。
% minikube start --vm-driver=kvm2 Starting local Kubernetes v1.10.0 cluster... Starting VM... Getting VM IP address... Moving files into cluster... Setting up certs... Connecting to cluster... Setting up kubeconfig... Starting cluster components... Kubectl is now configured to use the cluster. Loading cached images from config file. % kubectl get nodes NAME STATUS ROLES AGE VERSION minikube Ready master 5m v1.10.0
動作確認
Minikubeが動いているかどうか、コンテナを動かして確認してみます。
ここでは、チュートリアルで使われているgcr.io/google-samples/kubernetes-bootcamp:v1
を動かします。
% kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080 deployment.apps/kubernetes-bootcamp created % kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 1 1 1 1 9s
kubectl proxy
でクラスタにアクセスできるようにします。
% kubectl proxy Starting to serve on 127.0.0.1:8001
curlでアクセスしてみます。動いているようですね。
% kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-5c69669756-j45f8 1/1 Running 0 1m % curl http://localhost:8001/api/v1/namespaces/default/pods/kubernetes-bootcamp-5c69669756-j45f8/proxy/ Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-j45f8 | v=1
次回
Minikubeを使える環境を整えたところで、サービスを動かしてみようと思います。
採用情報
朝日ネットでは新卒採用・キャリア採用を行っております。
-
--vm-driver=none
で仮想化なしでも動きますが、WARNINGで出る通りセキュリティ上の問題があります:The 'none' driver will run an insecure kubernetes apiserver as root that may leave the host vulnerable to CSRF attacks
↩