# Hello Minikube

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

このチュートリアルでは、minikubeを使用して、Kubernetes上でサンプルアプリケーションを動かす方法を紹介します。
このチュートリアルはNGINXを利用してすべての要求をエコーバックするコンテナイメージを提供します。

## 目標

* minikubeへのサンプルアプリケーションのデプロイ
* アプリケーションの実行
* アプリケーションログの確認

## 始める前に


このチュートリアルは、`minikube`がセットアップ済みであることを前提としています。
インストール手順は[minikube start](https://minikube.sigs.k8s.io/docs/start/)の __Step 1__ を参照してください。

<div class="alert alert-info" role="note"><h4 class="alert-heading">備考:</h4><strong>Step 1, Installation</strong> の手順のみ実行してください。それ以降の手順はこのページで説明します。</div>


また、`kubectl`をインストールする必要があります。
インストール手順は[ツールのインストール](/docs/tasks/tools/#kubectl)を参照してください。


<!-- lessoncontent -->

## minikubeクラスターの作成

```shell
minikube start
```

## ダッシュボードを開く

Kubernetesダッシュボードを開きます。これには二通りの方法があります:

<ul class="nav nav-tabs" id="tabs-dashboard" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-dashboard-0" role="tab" aria-controls="tabs-dashboard-0" aria-selected="true">ブラウザーを起動</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-dashboard-1" role="tab" aria-controls="tabs-dashboard-1">URLをコピー&amp;ペースト</a></li></ul>

<div class="tab-content" id="tabs-dashboard-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-dashboard-0" role="tabpanel" aria-labelledby="tabs-dashboard-0-tab" tabindex="dashboard"><p><strong>新しい</strong>ターミナルを開き、次のコマンドを実行します:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># 新しいターミナルを起動し、以下を実行したままにします</span>
</span></span><span class="line"><span class="cl">minikube dashboard
</span></span></code></pre></div><p><code>minikube start</code>を実行したターミナルに戻ります。</p>
<div class="alert alert-info" role="note"><h4 class="alert-heading">備考:</h4><p><code>dashboard</code>コマンドは、ダッシュボードアドオンを有効にし、デフォルトのWebブラウザーでプロキシを開きます。
ダッシュボード上で、DeploymentやServiceなどのKubernetesリソースを作成できます。</p>
<p>ターミナルから直接ブラウザーを起動させずに、WebダッシュボードのURLを取得する方法については、「URLをコピー&amp;ペースト」タブを参照してください。</p>
<p>デフォルトでは、ダッシュボードはKubernetesの仮想ネットワーク内部からのみアクセス可能です。
<code>dashboard</code>コマンドは、Kubernetes仮想ネットワークの外部からダッシュボードにアクセス可能にするための一時的なプロキシを作成します。</p>
<p>プロキシを停止するには、<code>Ctrl+C</code>を実行してプロセスを終了します。
<code>dashboard</code>コマンドが終了した後も、ダッシュボードはKubernetesクラスター内で実行を続けます。
再度<code>dashboard</code>コマンドを実行すれば、新しい別のプロキシを作成してダッシュボードにアクセスできます。</p>
</div>
</div><div class="tab-body tab-pane fade"
        id="tabs-dashboard-1" role="tabpanel" aria-labelledby="tabs-dashboard-1-tab" tabindex="dashboard"><p>minikubeが自動的にWebブラウザーを開くことを望まない場合、<code>dashboard</code>サブコマンドを<code>--url</code>フラグと共に実行します。
<code>minikube</code>は、お好みのブラウザーで開くことができるURLを出力します。</p>
<p><strong>新しい</strong>ターミナルを開き、次のコマンドを実行します:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># 新しいターミナルを起動し、以下を実行したままにします</span>
</span></span><span class="line"><span class="cl">minikube dashboard --url
</span></span></code></pre></div><p>URLをコピー&amp;ペーストし、ブラウザーで開きます。
<code>minikube start</code>を実行したターミナルに戻ります。</p>
</div></div>


## Deploymentの作成

Kubernetesの[*Pod*](/docs/concepts/workloads/pods/)は、コンテナの管理やネットワーキングの目的でまとめられた、1つ以上のコンテナのグループです。このチュートリアルのPodがもつコンテナは1つのみです。Kubernetesの[*Deployment*](/docs/concepts/workloads/controllers/deployment/)はPodの状態を確認し、Podのコンテナが停止した場合には再起動します。DeploymentはPodの作成やスケールを管理するために推奨される方法(手段)です。

1. `kubectl create`コマンドを使用してPodを管理するDeploymentを作成してください。Podは提供されたDockerイメージを元にコンテナを実行します。

    ```shell
    # Webサーバーを含むテストコンテナイメージを実行する
    kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.53 -- /agnhost netexec --http-port=8080
    ```

2. Deploymentを確認します:

    ```shell
    kubectl get deployments
    ```

    出力は下記のようになります:

    ```
    NAME         READY   UP-TO-DATE   AVAILABLE   AGE
    hello-node   1/1     1            1           1m
    ```

    (Podが利用可能になるまで時間がかかる場合があります。"0/1"と表示された場合は、数秒後にもう一度確認してみてください。)

3. Podを確認します:

    ```shell
    kubectl get pods
    ```

    出力は下記のようになります:

    ```
    NAME                          READY     STATUS    RESTARTS   AGE
    hello-node-5f76cf6ccf-br9b5   1/1       Running   0          1m
    ```

4. クラスターイベントを確認します:

    ```shell
    kubectl get events
    ```

5. `kubectl`で設定を確認します:

    ```shell
    kubectl config view
    ```

6. Podで実行されているコンテナのアプリケーションログを確認します(Podの名前は`kubectl get pods`で取得したものに置き換えてください)。

   
<div class="alert alert-info" role="note"><h4 class="alert-heading">備考:</h4><code>kubectl logs</code>コマンドの引数<code>hello-node-5f76cf6ccf-br9b5</code>は、<code>kubectl get pods</code>コマンドで取得したPodの名前に置き換えてください。</div>


   ```shell
   kubectl logs hello-node-5f76cf6ccf-br9b5
   ```

   出力は下記のようになります:

   ```
   I0911 09:19:26.677397       1 log.go:195] Started HTTP server on port 8080
   I0911 09:19:26.677586       1 log.go:195] Started UDP server on port  8081
   ```


<div class="alert alert-info" role="note"><h4 class="alert-heading">備考:</h4><code>kubectl</code>コマンドの詳細な情報は<a href="/ja/docs/reference/kubectl/">コマンドラインツール(kubectl)</a>を参照してください。</div>


## Serviceの作成

通常、PodはKubernetesクラスター内部のIPアドレスからのみアクセスすることができます。`hello-node`コンテナをKubernetesの仮想ネットワークの外部からアクセスするためには、Kubernetesの[*Service*](/docs/concepts/services-networking/service/)としてPodを公開する必要があります。

<div class="alert alert-danger" role="note"><h4 class="alert-heading">警告:</h4>agnhostコンテナには<code>/shell</code>エンドポイントがあり、デバッグには便利ですが、インターネットに公開するのは危険です。
インターネットに接続されたクラスターや、プロダクション環境のクラスターで実行しないでください。</div>


1. `kubectl expose`コマンドを使用してPodをインターネットに公開します:

    ```shell
    kubectl expose deployment hello-node --type=LoadBalancer --port=8080
    ```

    `--type=LoadBalancer`フラグはServiceをクラスター外部に公開したいことを示しています。

    テストイメージ内のアプリケーションコードはTCPの8080番ポートのみを待ち受けます。
    `kubectl expose`で8080番ポート以外を公開した場合、クライアントはそのポートに接続できません。

2. 作成したServiceを確認します:

    ```shell
    kubectl get services
    ```

    出力は下記のようになります:

    ```
    NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    hello-node   LoadBalancer   10.108.144.78   <pending>     8080:30369/TCP   21s
    kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP          23m
    ```

    ロードバランサーをサポートするクラウドプロバイダーでは、Serviceにアクセスするための外部IPアドレスが提供されます。
    minikubeでは、`LoadBalancer`タイプは`minikube service`コマンドを使用した接続可能なServiceを作成します。

3. 次のコマンドを実行します:

    ```shell
    minikube service hello-node
    ```

    アプリケーションとその応答が表示されるブラウザーウィンドウが開きます。

## アドオンの有効化

minikubeはビルトインの<a class='glossary-tooltip' title='Kubernetesの機能を拡張するリソース。' data-bs-toggle='tooltip' data-bs-placement='top' href='/ja/docs/concepts/cluster-administration/addons/' target='_blank' aria-label='アドオン'>アドオン</a>があり、有効化、無効化、あるいはローカルのKubernetes環境に公開することができます。

1. サポートされているアドオンをリストアップします:

    ```shell
    minikube addons list
    ```

    出力は下記のようになります:

    ```
    addon-manager: enabled
    dashboard: enabled
    default-storageclass: enabled
    efk: disabled
    freshpod: disabled
    gvisor: disabled
    helm-tiller: disabled
    ingress: disabled
    ingress-dns: disabled
    logviewer: disabled
    metrics-server: disabled
    nvidia-driver-installer: disabled
    nvidia-gpu-device-plugin: disabled
    registry: disabled
    registry-creds: disabled
    storage-provisioner: enabled
    storage-provisioner-gluster: disabled
    ```

2. ここでは例として`metrics-server`のアドオンを有効化します:

    ```shell
    minikube addons enable metrics-server
    ```

    出力は下記のようになります:

    ```
    The 'metrics-server' addon is enabled
    ```

3. 作成されたPodとサービスを確認します:

    ```shell
    kubectl get pod,svc -n kube-system
    ```

    出力:

    ```
    NAME                                        READY     STATUS    RESTARTS   AGE
    pod/coredns-5644d7b6d9-mh9ll                1/1       Running   0          34m
    pod/coredns-5644d7b6d9-pqd2t                1/1       Running   0          34m
    pod/metrics-server-67fb648c5                1/1       Running   0          26s
    pod/etcd-minikube                           1/1       Running   0          34m
    pod/influxdb-grafana-b29w8                  2/2       Running   0          26s
    pod/kube-addon-manager-minikube             1/1       Running   0          34m
    pod/kube-apiserver-minikube                 1/1       Running   0          34m
    pod/kube-controller-manager-minikube        1/1       Running   0          34m
    pod/kube-proxy-rnlps                        1/1       Running   0          34m
    pod/kube-scheduler-minikube                 1/1       Running   0          34m
    pod/storage-provisioner                     1/1       Running   0          34m

    NAME                           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
    service/metrics-server         ClusterIP   10.96.241.45    <none>        80/TCP              26s
    service/kube-dns               ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP       34m
    service/monitoring-grafana     NodePort    10.99.24.54     <none>        80:30002/TCP        26s
    service/monitoring-influxdb    ClusterIP   10.111.169.94   <none>        8083/TCP,8086/TCP   26s
    ```

4. `metrics-server`の出力を確認します:

    ```shell
    kubectl top pods
    ```

    出力は下記のようになります:

    ```
    NAME                         CPU(cores)   MEMORY(bytes)
    hello-node-ccf4b9788-4jn97   1m           6Mi
    ```

    次のメッセージが表示された場合は、しばらく待ってから再度実行してください:

    ```
    error: Metrics API not available
    ```

5. `metrics-server`を無効化します:

    ```shell
    minikube addons disable metrics-server
    ```

    出力は下記のようになります:

    ```
    metrics-server was successfully disabled
    ```

## クリーンアップ

クラスターに作成したリソースをクリーンアップします:

```shell
kubectl delete service hello-node
kubectl delete deployment hello-node
```

minikubeクラスターを停止します

```shell
minikube stop
```

(オプション)minikubeのVMを削除します:

```shell
# オプション
minikube delete
```

Kubernetesの学習で再度minikubeを使用したい場合、minikubeのVMを削除する必要はありません。

## まとめ
このページでは、minikubeクラスターを立ち上げて実行するための基本的な部分を説明しました。
これでアプリケーションをデプロイする準備が整いました。

## 次の項目


* _[kubectlで初めてのアプリケーションをKubernetesにデプロイする](/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/)_。
* [Deploymentオブジェクト](/docs/concepts/workloads/controllers/deployment/)について学ぶ。
* [アプリケーションのデプロイ](/docs/tasks/run-application/run-stateless-application-deployment/)について学ぶ。
* [Serviceオブジェクト](/docs/concepts/services-networking/service/)について学ぶ。
