Minikubeを触ってKubernetesの概念を知る

Minikubeとは、

Minikube is a tool that makes it easy to run Kubernetes locally. Minikube runs a single-node Kubernetes cluster inside a VM on your laptop for users looking to try out Kubernetes or develop with it day-to-day.

Running Kubernetes Locally via Minikube

こいつを触りつつ、Kubernetesの概念を掴んでいこうと思います。

環境情報

  • Windows10 Pro(10.0.17134 N/A ビルド 17134)
  • VirtualBox 5.2.30
  • minikube version: 1.1.0
  • kubectl version 1.14.2

インストール

minikubeのインストール

以下の通り、windows用exeをダウンロードして、exeファイル名を minikube.exe に変更します。exeファイルを置いたPathは、システム環境変数に登録しておきます。

PS> Invoke-WebRequest -Uri https://storage.googleapis.com/minikube/releases/v1.1.0/minikube-windows-amd64.exe -OutFile C:\tools\minikube\minikube.exe

実行確認。

> minikube version
minikube version: v1.1.0

Install Minikube

kubectlのインストール

kubernetes用のcliである kubectl をインストールします。こちらはscoop経由でインストール。

> scoop install kubectl
> kubectl version --client
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.2", GitCommit:"66049e3b21efe110454d67df4fa62b08ea79a19b", GitTreeState:"clean", BuildDate:"2019-05-16T16:23:09Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"windows/amd64"}

Install kubectl on Windows

kubernetes clusterの作成

以下のコマンドで、利用できるVirtual Machine上にkubernetesクラスタを作成してくれます。

> minikube start
* minikube v1.1.0 on windows (amd64)
* Downloading Minikube ISO ...
 131.28 MB / 131.28 MB [============================================] 100.00% 0s
* Creating virtualbox VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...
* Found network options:
  - NO_PROXY=192.168.99.100
* Configuring environment for Kubernetes v1.14.2 on Docker 18.09.6
  - env NO_PROXY=192.168.99.100
* Downloading kubeadm v1.14.2
* Downloading kubelet v1.14.2
* Pulling images ...
* Launching Kubernetes ...
* Verifying: apiserver proxy etcd scheduler controller dns
* Done! kubectl is now configured to use "minikube"
>
> minikube status
host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100

minikube start 処理では、Kubernetesクラスタを作成するのと同時に、kubectlに作成クラスタ向けのコンフィグ設定をしてくれます。

> kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority: C:\Users\yukari\.minikube\ca.crt
    server: https://192.168.99.100:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: C:\Users\yukari\.minikube\client.crt
    client-key: C:\Users\yukari\.minikube\client.key

なので、作成したクラスタ名を指定すると、クラスタから情報を取得できます。

> kubectl cluster-info minikube
Kubernetes master is running at https://192.168.99.100:8443
KubeDNS is running at https://192.168.99.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

kubernetes dashboardの表示

以下のコマンドを実行することで、Kubernetes上のダッシュボードに接続できるプロキシを用意してくれます。

> minikube dashboard
* Enabling dashboard ...
* Verifying dashboard health ...
* Launching proxy ...
* Verifying proxy health ...
* Opening http://127.0.0.1:60461/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy/ in your default browser...

Opening の後に出力されているURLにアクセスすると、ダッシュボードが表示されています。

Hello Minikube

ここから先は、公式サイトにあるtutorialに沿ってkubernetesを操作し、概念を学んでいきます。

Hello Minikube

Hello Worldを返す簡単なNode.jsのコンテナを、kubernetes上で起動するという内容です。Dockerfileの構成は、以下より確認できます。

Hello Minikube - Before you begin

Deploymentの作成

前述したNode.jsのコンテナを1つ持つ Pod 1つにより構成された、 Deployment を作成します。

Pod とは、

A Pod is the basic building block of Kubernetes–the smallest and simplest unit in the Kubernetes object model that you create or deploy. A Pod represents processes running on your Cluster.

A Pod encapsulates an application’s container (or, in some cases, multiple containers), storage resources, a unique network IP, and options that govern how the container(s) should run. A Pod represents a unit of deployment: a single instance of an application in Kubernetes, which might consist of either a single container or a small number of containers that are tightly coupled and that share resources.

AWS ECSの、 タスク にあたるような概念なのでしょうか。

Pod Overview

Deployment とは、上の説明では a single instance of an application in Kubernetes と紹介されていましたが、公式に記載されているUse Caseを読むのがイメージをつかみやすいでしょうか。

  • Create a Deployment to rollout a ReplicaSet. The ReplicaSet creates Pods in the background. Check the status of the rollout to see if it succeeds or not.
  • Declare the new state of the Pods by updating the PodTemplateSpec of the Deployment. A new ReplicaSet is created and the Deployment manages moving the Pods from the old ReplicaSet to the new one at a controlled rate. Each new ReplicaSet updates the revision of the Deployment.
  • Rollback to an earlier Deployment revision if the current state of the Deployment is not stable. Each rollback updates the revision of the Deployment.
  • Scale up the Deployment to facilitate more load.
  • Pause the Deployment to apply multiple fixes to its PodTemplateSpec and then resume it to start a new rollout.
  • Use the status of the Deployment as an indicator that a rollout has stuck.
  • Clean up older ReplicaSets that you don’t need anymore.

AWS ECSの、 サービス にあたるような概念なのでしょうか。

Deployment

実際のコマンド。

> kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node
deployment.apps/hello-node created

起動するコンテナイメージをGCPのGCRから持ってきて、 hello-node という名前のdeploymentを作成しています。

kubectl - create deployment

gcr.io/hello-minikube-zero-install/hello-node

作成したdeploymentの確認。

> kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   1/1     1            1           12m

作成したpodの確認。

> kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
hello-node-78cd77d68f-8sc2q   1/1     Running   0          2m39s

ログの確認。deployment、replicaset、podと順に作成されている。

> kubectl get events
LAST SEEN   TYPE     REASON                    OBJECT                             MESSAGE
3m          Normal   Scheduled                 pod/hello-node-78cd77d68f-8sc2q    Successfully assigned default/hello-node-78cd77d68f-8sc2q to minikube
3m          Normal   Pulling                   pod/hello-node-78cd77d68f-8sc2q    Pulling image "gcr.io/hello-minikube-zero-install/hello-node"
2m24s       Normal   Pulled                    pod/hello-node-78cd77d68f-8sc2q    Successfully pulled image "gcr.io/hello-minikube-zero-install/hello-node"
2m24s       Normal   Created                   pod/hello-node-78cd77d68f-8sc2q    Created container hello-node
2m24s       Normal   Started                   pod/hello-node-78cd77d68f-8sc2q    Started container hello-node
3m          Normal   SuccessfulCreate          replicaset/hello-node-78cd77d68f   Created pod: hello-node-78cd77d68f-8sc2q
3m          Normal   ScalingReplicaSet         deployment/hello-node              Scaled up replica set hello-node-78cd77d68f to 1

実際のDockerコンテナの状況を見てみます。以下のコマンドでminikube内のKubernetesクラスタsshログインできるので、

> minikube ssh

docker psコマンドで、コンテナの起動状況を確認。

$ docker ps
CONTAINER ID        IMAGE                                           COMMAND                  CREATED             STATUS              PORTS               NAMES
aa1e4ab36043        gcr.io/hello-minikube-zero-install/hello-node   "/bin/sh -c 'node se…"   6 minutes ago       Up 6 minutes                            k8s_hello-node_hello-node-78cd77d68f-8sc2q_default_9d559f24-85ba-11e9-83fd-080027270 1e7_0

Serviceの作成

上記のdocker psコマンド結果から分かる通り、コンテナ上のPortがExposeされていません。コンテナを外部アクセス可能とする仕組みとして Service があります。

A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them - sometimes called a micro-service. The set of Pods targeted by a Service is (usually) determined by a Label Selector

Service

以下のコマンドで、hello-nodeというdeploymentを、新しいServiceとして8080ポートでexposeしてくれています。

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

kubectl - expose

作成したService確認コマンド。

> kubectl get services
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
hello-node   LoadBalancer   10.110.132.212   <pending>     8080:31285/TCP   31s
kubernetes   ClusterIP      10.96.0.1        <none>        443/TCP          4d9h

上記情報から、exposeされているポートにアクセスすると、Node.jsプログラムのHello Worldが帰ってきます。

> curl http://192.168.99.100:31285/
Hello World!