2018年3月14日水曜日

minikube を使って kubernetes に入門してみた

概要

minikube はローカルで kubernetes クラスタを構築することができるツールです
今回は VirtualBox と minikube を使ってローカル環境に kubernetes 環境を構築してみました

環境

  • macOS 10.13.2
  • minikube 0.25.0
  • kubectl 1.9.2
  • VertualBox 5.1.30r118389

minikube インストール

brew を使って簡単にインストールできます

  • brew cask install minikube

インストールできたか確認してみましょう

  • brew cask info minikube
  • minikube version

minikube コマンドおよび kubectl コマンドが使えるようになっています

minikube ノードを起動する

minikube ノードは kubernetes 内で起動するマスターノードになります
今回ノードを作成する環境は VirtualBox にしています
minikube は VirtualBox 以外の仮想環境 (virtualbox xhyve vmwarefusion hyperkit) もサポートしているので VirtualBox 以外が良いという場合は別の環境を準備してそちらに構築しても OK です

  • minikube start
Starting local Kubernetes v1.9.0 cluster...
Starting VM...
Downloading Minikube ISO
 142.22 MB / 142.22 MB [============================================] 100.00% 0s
Getting VM IP address...
Moving files into cluster...
Downloading localkube binary
 162.38 MB / 162.41 MB [============================================]  99.98% 0s
 0 B / 65 B [----------------------------------------------------------]   0.00%
 65 B / 65 B [======================================================] 100.00% 0s
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.

--vm-driver というオプションで VM を管理するインフラを指定します
デフォルトだと「virtualbox」が指定されるようです
ISO のダウンロードが始まり minikube 内で VM が起動します

これで VirtualBox 上に minikube というノードが構築されます

  • VBoxManage list runningvms

"minikube" {43f30a82-89d7-4341-bc66-adad08d6b21c}

kubectl get nodes しても確認することができます

NAME       STATUS    ROLES     AGE       VERSION
minikube   Ready     <none>    58m       v1.9.0

とりあえずコンテナを構築してみる

ノードが構築できたらとりあえずコンテナを作ってみましょう

deployment の作成 (コンテナも起動)

deployment はコンテナ定義になります
run コマンドを使うことで deployment の作成とコンテナの起動を同時に行えます

  • kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.4 --port=8080

今回は echoserver という Web アプリのイメージを使います
8080 ポートでアプリが起動するようにオプションを付与しています

  • kubectl get deployments

これで deployment ができているか確認しましょう

service の作成

service は deployment の上位的な概念でコンテナのスケールやバランシングを行います
今回は作成したコンテナを外部に公開するために使います

  • kubectl expose deployment hello-minikube --type=NodePort

NodePort はコンテナにアクセスのにノードのポートを使ってアクセスすることが出来るタイプです

  • kubectl get services

とするとサービスの一覧を確認することができます

動作確認

あとはコンテナにアクセスしてみましょう

  • kubectl get pod

でコンテナが起動していることを確認して

  • curl $(minikube service hello-minikube --url)

でアクセスしてみましょう
今回の Web アプリはリクエスト情報をダンプするようなアプリなのでヘッダやボディの情報が返ってくると思います

今度は動きを確認しながら別のコンテナを起動してみる

deployment と service の動きをもう少し確認してみたいと思います
今後は別のコンテナを起動してみましょう
まずは deployment だけ作成してみます

  • kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080

google-samples/kubernetes-bootcamp は簡単な nodejs アプリです
8080 で LISTEN するようにします

この状態ではコンテナ外部からアプリにアクセスすることはできません
なので今度はコンテナに直接入ってみます

  • kubectl get pods

で起動したコンテナの名前を確認しましょう
そして exec コマンドを使って bash を起動しコンテナに入ってみます

  • kubectl exec -it kubernetes-bootcamp-5dbf48f7d4-bt9b5 bash

これでコンテナに入れると思います
コンテナ内で直接アプリにアクセスできることを確認しましょう

  • curl localhost:8080

これだとノード経由でコンテナにアクセスできないので、そのために serivce を定義してあげます

  • kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

これで kubectl get services を確認すると 8080 ポートがノード側のポートに動的にバインドされているのが確認できます
ノード側は今回は minikube しかないので minikube のポートにアクセスしています

NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes            ClusterIP   10.96.0.1       <none>        443/TCP          1h
kubernetes-bootcamp   NodePort    10.110.89.189   <none>        8080:32127/TCP   2m

あとはバインドされたノード側のポートにアクセスすればコンテナにアクセスできるようになります

  • curl $(minikube ip):32127

後処理

service -> deployment -> minikube 停止とすれば OK です

  • kubectl delete service hello-minikube
  • kubectl delete deployment hello-minikube
  • minikube stop

当然ですが service を delete した段階ではコンテナは削除されず deployment を削除したタイミングでコンテナも削除されます

Tips

minikube の管理用 UI を開く

  • minikube dashboard

ラベルを指定して pod を取得する (ラベルは describe service で取得できます)

  • kubectl get pods -l run=kubernetes-bootcamp

最後に

minikube を使ってローカルに kubernetes を試せる環境を構築してみました
かなり簡単に kubernetes を試せるようになったなと感じました

実際にプロダクジョンに適用する場合は minikube ではなく kubeadm という管理ツールがあるのでそれを使ってちゃんとサーバを構築してください

あとは minikube と kubectl コマンドが混同しないようにしましょう
kubectl は kubernetes クラスタ内に存在するコンテナやサービスの操作に使います
minikube は kubernetes クラスタ自体の操作に使うコマンドになります

docker swarm に慣れてしまっている人でも基本的な概念などは似ているのでそこまで取っ付きにくくないかなと思います
機能的には kubernetes のほうが多いので複雑なコンテナマネージメントをやりたい場合には kubernetes を使うことになると思います

参考サイト

2 件のコメント:

  1. VirtualBox 上に作成した minikube 用のインスタンスにログインするには minikube ssh します

    返信削除
  2. お掃除は

    kubectl delete service hello-minikube
    kubectl delete deployment hello-minikube

    でできます
    deployment を削除することで pod, deployment, replicaset が削除されます

    返信削除