# Привет, Minikube

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

---

<!-- overview -->

Это руководство демонстрирует, как запустить простое приложение в Kubernetes
с помощью minikube. Для этого используется образ контейнера с NGINX, который
выводит обратно текст всех запросов.


## Цели

* Развернуть простое приложение в minikube.
* Запустить приложение.
* Посмотреть логи приложения.

## Подготовка к работе


Руководство подразумевает, что вы уже настроили `minikube`.
См. документацию [minikube start](https://minikube.sigs.k8s.io/docs/start/) для инструкций по его установке.

Вам также потребуется установить `kubectl`.
См. [Установку и настройку kubectl](/ru/docs/tasks/tools/install-kubectl/) для инструкций по его установке.


<!-- lessoncontent -->

## Создание кластера minikube

```shell
minikube start
```

## Запуск панели (dashboard)

Откройте панель 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 для запуска</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> активирует дополнение dashboard и открывает прокси в веб-браузере по умолчанию.
В этой панели можно создавать такие Kubernetes-ресурсы, как Deployment и Service.</p>
<p>Если вы работаете в окружении с правами root, см. вкладку «Копирование URL для запуска».</p>
<p>По умолчанию панель доступна только из внутренней виртуальной сети Kubernetes.
Команда <code>dashboard</code> создаёт временный прокси, чтобы панель была доступна извне внутренней виртуальной сети Kubernetes.</p>
<p>Чтобы остановить работу прокси, выполните <code>Ctrl+C</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 запускал веб-браузер, выполните команду <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>Теперь можно вернуться к терминалу, где вы запускали <code>minikube start</code>.</p>
</div></div>


## Создание деплоймента

[*Под*](/docs/concepts/workloads/pods/pod/) Kubernetes — это группа из одного или более контейнеров, связанных друг с другом для удобного администрирования и организации сети. В данном руководстве под включает в себя один контейнер. Деплоймент ([*Deployment*](/docs/concepts/workloads/controllers/deployment/)) в Kubernetes проверяет здоровье пода и перезагружает контейнер пода в случае, если он прекратил работу. Деплойменты — рекомендуемый способ создания и масштабирования подов.

1. Используйте команду `kubectl create` для создания деплоймента, который будет управлять подом. Под запустит контейнер с указанным Docker-образом.

    ```shell
    # Запуск тестового образа контейнера с веб-сервером
    kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.53 -- /agnhost netexec --http-port=8080
    ```

1. Посмотреть информацию о Deployment:

    ```shell
    kubectl get deployments
    ```

    Вывод будет примерно следующим:

    ```shell
    NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    hello-node   1         1         1            1           1m
    ```

1. Посмотреть информацию о поде:

    ```shell
    kubectl get pods
    ```
    Вывод будет примерно следующим:

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

1. Посмотреть события кластера:

    ```shell
    kubectl get events
    ```

1. Посмотреть конфигурацию `kubectl`:

    ```shell
    kubectl config view
    ```


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примечание:</h4>Больше информации о командах <code>kubectl</code> см. в <a href="/ru/docs/reference/kubectl/">обзоре kubectl</a>.</div>


## Создание сервиса

По умолчанию под доступен только при обращении по его внутреннему IP-адресу внутри кластера Kubernetes. Чтобы сделать контейнер `hello-node` доступным вне виртуальной сети Kubernetes, необходимо представить под как сервис [*Service*](/docs/concepts/services-networking/service/) Kubernetes.

1. Сделать под доступным для публичного интернета можно с помощью команды `kubectl expose`:

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

    Флаг `--type=LoadBalancer` показывает, что сервис должен быть виден вне кластера.
    
    Код приложения в тестовом образе прослушивает только TCP-порт 8080. Если вы сделали приложение доступным по другому порту командой `kubectl expose`, клиенты не смогут подключиться к этому порту.

2. Посмотреть только что созданный сервис:

    ```shell
    kubectl get services
    ```

    Вывод будет примерно следующим:

    ```shell
    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
    ```

    Для облачных провайдеров, поддерживающих балансировщики нагрузки, для доступа к сервису будет предоставлен внешний IP адрес. В Minikube тип `LoadBalancer` делает сервис доступным при обращении с помощью команды `minikube service`.

3. Выполните следующую команду:

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

    Откроется окно браузера, в котором запущено ваше приложение и выводится его ответ.

## Активация дополнений

В minikube есть набор встроенных дополнений (<a class='glossary-tooltip' title='Resources that extend the functionality of Kubernetes.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ru/docs/concepts/cluster-administration/addons/' target='_blank' aria-label='addons'>addons</a>), которые могут быть включены, выключены и открыты в локальном окружении Kubernetes.

1. Отобразить текущие поддерживаемые дополнения:

    ```shell
    minikube addons list
    ```

    Вывод будет примерно следующим:

    ```
    addon-manager: enabled
    dashboard: enabled
    default-storageclass: enabled
    efk: disabled
    freshpod: disabled
    gvisor: disabled
    heapster: 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
    ```

    Вывод:

    ```shell
    metrics-server was successfully enabled
    ```

3. Посмотреть Pod и Service, которые вы только что создали:

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

    Вывод будет примерно следующим:

    ```shell
    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
    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 (опционально):

```shell
minikube delete
```

Если вы планируете использовать minikube в дальнейшем, чтобы больше узнать про Kubernetes, удалять инструмент не нужно.

## Что дальше


* Руководство по _[деплою первого приложения в Kubernetes с kubectl](/ru/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/)_.
* Больше об [объектах Deployment](/docs/concepts/workloads/controllers/deployment/).
* Больше о [развёртывании приложения](/docs/user-guide/deploying-applications/).
* Больше об [объектах Service](/docs/concepts/services-networking/service/).
