BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

minikube で kubernetes 入門 ( Hyper-V on Windows 10 )

前回の記事で minikube on Windows 10 環境を作ったのでちょっと動かしてみましょう。

TL;DR

  • 公式ドキュメントの Minikube の Quickstart を試す
  • オレオレ Quickstart(Nodeで動くアプリの docker image 作って Hello Minikube)する

公式ドキュメントの Quickstart

前回の続きになるので、minikube のクラスターが起動した状態から再開です。まず以下のコマンドでクラスターが Running になっていることが確認しておきます。

minikube status

f:id:beachside:20180413152154p:plain


公式ドキュメントの Quickstart を試しましょう(各コマンドの動作確認をするためのコマンドも追加してたたきます)。

kubectl run

まず、「echoserver」 という docker image をとってきて、「hello-minikube」という名前でクラスターへデプロイします。

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

run コマンドは、Docker image を取得して Pod (クラスター内の最小のデプロイ単位)を作成してくれるものです。以下のコマンドで Pod ができていることを確認しましょう。

kubectl get po

また、内部的には Deployment が生成されますので、以下のコマンドで確認できます。

kubectl get deployment

f:id:beachside:20180413152204p:plain


kubectl expose

次は、Deployment から Service を生成します。

kubectl expose deployment hello-minikube --type=NodePort

次に以下のコマンド

kubectl get service

(または kubectl get svc )をたたいて Service が生成されていることを確認しましょう。

f:id:beachside:20180413152213p:plain


Service にHTTPでアクセスしてみましょう。以下コマンドをたたくとブラウザーを開いてアクセスしてくれます(シェルは管理者権限で実行しないと動かなかったような...)。

minikube service hello-minikube

f:id:beachside:20180413152223p:plain

minikube service hello-minikube --url で url 取得して手作業でアクセスするってのもありですね。


無事に動いたのでお片付け。まず、Service を削除。

kubectl delete service hello-minikube

そして Deployment を削除。

kubectl delete deployment hello-minikube

f:id:beachside:20180413152233p:plain


ということでなんか物足りないので、もうちょっと遊んでみます。

オレオレ Quickstart

公式の面白そうなTutorial あるからやれよってのはさおき!)

これしよう♪

  • Node で動く簡易な JS アプリ作成
  • Docker の image 作って Docker Hub へ Push
  • minikube へデプロイ
  • スケールアウトして動作確認

Node で動く簡易な JS アプリ作成

まずは適当なディレクトリーを作って、その中にファイル名「server.js」を作り、コードは以下の通り。

var http = require('http');
var os = require('os');

http.createServer(
    function (request, response) {
        console.log(`Received request for URL: ${request.url}`);
        response.writeHead(200);
        response.end(`Hello Container World! (from ${os.hostname()})`);
    }
).listen(8080);

私の場合 VS Code 使ってるので、デバッグ実行してブラウザなどから http://localhost:8080/ にアクセスして正常に動作することを確認しておきます。

f:id:beachside:20180413162805p:plain


ブラウザでアクセスするとこんな感じに。

f:id:beachside:20180413152314p:plain


Docker image 作って Docker Hub へ Push

先ほどと同じディレクトリーにファイル名「Dockerfile」を作り、コードは以下の通り。

FROM mhart/alpine-node
EXPOSE 8080
COPY server.js .
CMD node server.js

シンプル♪「FROM node」だと Docker image のサイズが665MBくらいになるので、alpine に node がのった軽量の image 「mhart/alpine-node」を使わせて頂きました。そこに先ほどの JS をのせて実行するってやつです。 (公式にもあるけど)

では、docker hub にpush してしまいます。

今回は、コマンドプロンプトが Dockerfile があるディレクトリにいる、かつ、docker login してる前提です。Docker Hub は私のリポジトリ「beachside」、名前は「hello-node」でbuild したいので、こんなコマンドになりますね。

docker build -t beachside/hello-node .

images を docker images で確認してたら、DockerHub へ push してしまいましょう。

docker push beachside/hello-node

f:id:beachside:20180413152340p:plain


これで Docker Image の準備は整いました。

minikube へデプロイ

コマンドは、image を取得する先をかえるだけですね。Deployment の名前は「hello-mini-node」にしてみました。

kubectl run hello-mini-node --image=beachside/hello-node --port=8080

後はさっきやったチュートリアルと同じ流れで Service 作り

kubectl expose deployment hello-mini-node --type=NodePort

アクセスしてみます。

minikube service hello-mini-node

f:id:beachside:20180413152353p:plain


スケールアウトして動作確認

とりあえずスケールはすぐできるから試そうってだけです。そのために js でサーバー名をレスポンスに出してたわけです。

スケールは、例えば5台にするなら以下のコマンド。

kubectl scale --replicas=5 deployment/hello-mini-node
kubectl get deployment

kubectl get po

で5台になっていることが確認できます。

f:id:beachside:20180413163613p:plain


アクセスしてみると、サーバー名が変わることも確認できます(1同一クライアントだとちょっと変わりにくいので、ChromeとChromeのシークレットウインドウやPOSTMANを使ってアクセスするといい感じで変わります)。

f:id:beachside:20180413152424p:plain


ダッシュボードもついてるので、以下のコマンドで見てみるとよいかもですね。

minikube dashboard

後片付けは、適当に削除したり、

minikube stop

したりって感じですね。

おわりに

これでようやく kubernetes のスタート地点の1キロ手前に来た感じですかね。

今度は、Azure Antenna で公開されてる MS河野さんの kubernetes 神資料を試してみようかと妄想してます。
(資料の内容やるだけなのでブログに書きませんがね)