朝日ネット 技術者ブログ

朝日ネットのエンジニアによるリレーブログ。今、自分が一番気になるテーマで書きます。

microservicesはじめました (3)

前回の記事で作成したmicroservicesを運用するべく、コンテナオーケストレーションツールの定番といえるKubernetesに入門します。

Kubernetesについて

kubernetes.io

Kubernetes("k8s"と略されることも)は、コンテナ化されたアプリケーションを管理するツールです。 コンテナのデプロイやスケールを自動化できます。 Googleで使われていたツールがオープンソース化したもので、その性能に関しては問題ないでしょう。

Minikubeのインストール

Kubernetesを動かすにはコンテナが動作するクラスタが必要なのですが、ここではローカル環境でもKubernetesクラスタを作れるMinikubeを導入します。

github.com

使用環境

前回までの記事は、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を使える環境を整えたところで、サービスを動かしてみようと思います。

採用情報

朝日ネットでは新卒採用・キャリア採用を行っております。


  1. --vm-driver=noneで仮想化なしでも動きますが、WARNINGで出る通りセキュリティ上の問題があります: The 'none' driver will run an insecure kubernetes apiserver as root that may leave the host vulnerable to CSRF attacks