猫でもわかるWebプログラミングと副業

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

Hello Minikube チュートリアルで Kubernetes を学ぶ

f:id:yoshiki_utakata:20210626215710p:plain

Hello Minikube とは

Kubernetes 公式の、一番最初のチュートリアルです。とりあえず Kubernetes を動かしてみよう、というやつ。

https://kubernetes.io/ja/docs/tutorials/hello-minikube/

Minikube とは

Minikube とは、ローカルのPCなどにインストールして動かす、シンプルな Kubernetes クラスタです。

今回は Minikube をつかって Mac 上に Kubernetes クラスタを立ち上げ、そこにデプロイするということをやります。

Mac に Minikube と kubectl をインストール

今回は Mac に Minikube と kubectl をインストールします。

kubectl は、Kubernetes クラスタに命令を送って、アプリケーションを操作するための CLI です。

両方とも brew でインストールします。

brew install kubectl
brew install minikube

Minikube の起動

minikube start コマンドで Kubernetes クラスタが起動します。

特に何も指定しない場合は、 Docker で Kubernetes クラスタが立ち上がるようです。

$ minikube start
😄  Darwin 10.14.6 上の minikube v1.21.0
✨  dockerドライバーが自動的に選択されました。他の選択肢:  hyperkit, virtualbox, ssh
👍  コントロールプレーンのノード minikube を minikube 上で起動しています
🚜  イメージを Pull しています...
💾  Kubernetes v1.20.7 のダウンロードの準備をしています
    > preloaded-images-k8s-v11-v1...: 492.20 MiB / 492.20 MiB  100.00% 30.52 Mi
    > gcr.io/k8s-minikube/kicbase...: 359.09 MiB / 359.09 MiB  100.00% 10.88 Mi
🔥  docker container (CPUs=2, Memory=3888MB) を作成しています...
🐳  Docker 20.10.7 で Kubernetes v1.20.7 を準備しています...
    ▪ 証明書と鍵を作成しています...
    ▪ Control Plane を起動しています...
    ▪ RBAC のルールを設定中です...
🔎  Kubernetes コンポーネントを検証しています...
    ▪ イメージ gcr.io/k8s-minikube/storage-provisioner:v5 を使用しています
🌟  有効なアドオン: default-storageclass, storage-provisioner
🏄  完了しました! kubectl が「"minikube"」クラスタと「"default"」ネームスペースを使用するよう構成されました

ちなみに minikube dashboard とすると、ブラウザでダッシュボードがみられます。今回は使いません。

Kubernetes のノードと kubectl

Kubernetes クラスタは、 ノード の集合でできています。

ノードにはマスターノードワーカーノードがあります。

マスターノードはKubernetesクラスタを管理しているノード、ワーカーノードは、アプリケーションがデプロイされるノードです。

Kubernetes クラスタには Kubernetes API という API が生えており、 kubectl はこの API を叩くことで、クラスタの管理やデプロイなどを実行します。

Pod と Deployment

Pod とは、いくつかの Docker コンテナが集まったようなものです。イメージとしては、1つのアプリケーションが1つの Pod に対応し、その Pod の中では、 Web サーバーのコンテナやアプリケーションのコンテナがあるイメージ。

Pod はどこかのノードで動いています。一つのノードで、複数の Pod を動かすことができます。

Deployment とは、

  • Pod の中にどのようなコンテナを起動するか
  • どんなイメージを利用するか
  • いくつの Pod を起動するか

といったことを定義したものです。

Deployment の作成

Deployment を作成すると、その Deployment の定義を元に、 Kubernetes クラスタにアプリケーションが立ち上がります。

kubectl コマンドを利用し、

  • hello-node という名前のデプロイ定義を作成し
  • k8s.gcr.io/echoserver:1.4 というイメージをもとにアプリケーションを立ち上げます
$ kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4
deployment.apps/hello-node created

get deployments や get pods を叩くと、なんとなく起動していることがわかります。ここでは、細かい数字の意味には触れません。

$ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   1/1     1            1           30s

$ kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
hello-node-7567d9fdc9-b4dcr   1/1     Running   0          3m36s

ちなみに、 kubectl config view としるつお、どのような定義で起動しているのかがわかります。

Service を作成してコンテナにアクセス

Deployment を作成して、コンテナは立ち上がりましたが、現状だと Kubernetes クラスタの中からしかアクセスできません(もちろん Mac からもアクセスできません)。

アクセスできるようにするには、 Service というものを作成し、外から Pods にアクセスできるようにする必要があります。

公開するには、 kubectl expose を使います。type は LoadBalancer を使います(細かい説明はここではしません)。

$ kubectl expose deployment hello-node --type=LoadBalancer --port=8080
service/hello-node exposed

get services すると、 LoadBalancer が増えていることがわかります。

$ kubectl get services
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
hello-node   LoadBalancer   10.111.83.137   <pending>     8080:32737/TCP   36s
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP          4h53m

minikube service コマンドを実行すると、どの URL でアクセスできるかわかります。

$ minikube service hello-node
|-----------|------------|-------------|---------------------------|
| NAMESPACE |    NAME    | TARGET PORT |            URL            |
|-----------|------------|-------------|---------------------------|
| default   | hello-node |        8080 | http://192.168.49.2:32737 |
|-----------|------------|-------------|---------------------------|
🏃  Starting tunnel for service hello-node.
|-----------|------------|-------------|------------------------|
| NAMESPACE |    NAME    | TARGET PORT |          URL           |
|-----------|------------|-------------|------------------------|
| default   | hello-node |             | http://127.0.0.1:62563 |
|-----------|------------|-------------|------------------------|
🎉  Opening service default/hello-node in default browser...
❗  Dockerドライバーをdarwin上で動かしているため、実行するにはターミナルを開く必要があります。

http://127.0.0.1:62563 にアクセスすると、レスポンスが帰ってきます。

アドオンについて

Kubernetes クラスタでは様々なアドオンが使えて、チュートリアルでは metrics-server という、多分メトリクスを見られるようなアドオンを追加&削除しているのですが、ここでは省略します。

Kubernetes クラスタ上のリソースの削除

Service や Deployment の削除を行います。

$ kubectl delete service hello-node
service "hello-node" deleted

$ kubectl delete deployment hello-node
deployment.apps "hello-node" deleted

Minikube の終了

Minikube が動いている VM を停止します。

$ minikube stop
✋  ノード "minikube" を停止しています...
🛑  SSH 経由で「minikube」の電源をオフにしています...
🛑  1台のノードが停止しました。

Minikube が動いていた Docker コンテナを削除します。

$ minikube delete
🔥  docker の「minikube」を削除しています...
🔥  コンテナ "minikube" を削除しています...
🔥  /Users/yoshiyuki_sakamoto/.minikube/machines/minikube を削除しています...
💀  クラスタ "minikube" の全てのトレースを削除しました。

以上でチュートリアル「Hello Minikube」は終了です。