website/content/en/docs/tutorials/hello-minikube.md

348 lines
10 KiB
Markdown

---
title: Hello Minikube
content_type: tutorial
weight: 5
card:
name: tutorials
weight: 10
---
<!-- overview -->
This tutorial shows you how to run a sample app on Kubernetes using minikube.
The tutorial provides a container image that uses NGINX to echo back all the requests.
## {{% heading "objectives" %}}
* Deploy a sample application to minikube.
* Run the app.
* View application logs.
## {{% heading "prerequisites" %}}
This tutorial assumes that you have already set up `minikube`.
See __Step 1__ in [minikube start](https://minikube.sigs.k8s.io/docs/start/) for installation instructions.
{{< note >}}
Only execute the instructions in __Step 1, Installation__. The rest is covered on this page.
{{< /note >}}
You also need to install `kubectl`.
See [Install tools](/docs/tasks/tools/#kubectl) for installation instructions.
<!-- lessoncontent -->
## Create a minikube cluster
```shell
minikube start
```
## Open the Dashboard
Open the Kubernetes dashboard. You can do this two different ways:
{{< tabs name="dashboard" >}}
{{% tab name="Launch a browser" %}}
Open a **new** terminal, and run:
```shell
# Start a new terminal, and leave this running.
minikube dashboard
```
Now, switch back to the terminal where you ran `minikube start`.
{{< note >}}
The `dashboard` command enables the dashboard add-on and opens the proxy in the default web browser.
You can create Kubernetes resources on the dashboard such as Deployment and Service.
To find out how to avoid directly invoking the browser from the terminal and get a URL for the web dashboard, see the "URL copy and paste" tab.
By default, the dashboard is only accessible from within the internal Kubernetes virtual network.
The `dashboard` command creates a temporary proxy to make the dashboard accessible from outside the Kubernetes virtual network.
To stop the proxy, run `Ctrl+C` to exit the process.
After the command exits, the dashboard remains running in the Kubernetes cluster.
You can run the `dashboard` command again to create another proxy to access the dashboard.
{{< /note >}}
{{% /tab %}}
{{% tab name="URL copy and paste" %}}
If you don't want minikube to open a web browser for you, run the `dashboard` subcommand with the
`--url` flag. `minikube` outputs a URL that you can open in the browser you prefer.
Open a **new** terminal, and run:
```shell
# Start a new terminal, and leave this running.
minikube dashboard --url
```
Now, you can use this URL and switch back to the terminal where you ran `minikube start`.
{{% /tab %}}
{{< /tabs >}}
## Create a Deployment
A Kubernetes [*Pod*](/docs/concepts/workloads/pods/) is a group of one or more Containers,
tied together for the purposes of administration and networking. The Pod in this
tutorial has only one Container. A Kubernetes
[*Deployment*](/docs/concepts/workloads/controllers/deployment/) checks on the health of your
Pod and restarts the Pod's Container if it terminates. Deployments are the
recommended way to manage the creation and scaling of Pods.
1. Use the `kubectl create` command to create a Deployment that manages a Pod. The
Pod runs a Container based on the provided Docker image.
```shell
# Run a test container image that includes a webserver
kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080
```
1. View the Deployment:
```shell
kubectl get deployments
```
The output is similar to:
```
NAME READY UP-TO-DATE AVAILABLE AGE
hello-node 1/1 1 1 1m
```
(It may take some time for the pod to become available. If you see "0/1", try again in a few seconds.)
1. View the Pod:
```shell
kubectl get pods
```
The output is similar to:
```
NAME READY STATUS RESTARTS AGE
hello-node-5f76cf6ccf-br9b5 1/1 Running 0 1m
```
1. View cluster events:
```shell
kubectl get events
```
1. View the `kubectl` configuration:
```shell
kubectl config view
```
1. View application logs for a container in a pod (replace pod name with the one you got from `kubectl get pods`).
```shell
kubectl logs hello-node-5f76cf6ccf-br9b5
```
The output is similar to:
```
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
```
{{< note >}}
For more information about `kubectl` commands, see the [kubectl overview](/docs/reference/kubectl/).
{{< /note >}}
## Create a Service
By default, the Pod is only accessible by its internal IP address within the
Kubernetes cluster. To make the `hello-node` Container accessible from outside the
Kubernetes virtual network, you have to expose the Pod as a
Kubernetes [*Service*](/docs/concepts/services-networking/service/).
1. Expose the Pod to the public internet using the `kubectl expose` command:
```shell
kubectl expose deployment hello-node --type=LoadBalancer --port=8080
```
The `--type=LoadBalancer` flag indicates that you want to expose your Service
outside of the cluster.
The application code inside the test image only listens on TCP port 8080. If you used
`kubectl expose` to expose a different port, clients could not connect to that other port.
2. View the Service you created:
```shell
kubectl get services
```
The output is similar to:
```
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
```
On cloud providers that support load balancers,
an external IP address would be provisioned to access the Service. On minikube,
the `LoadBalancer` type makes the Service accessible through the `minikube service`
command.
3. Run the following command:
```shell
minikube service hello-node
```
This opens up a browser window that serves your app and shows the app's response.
## Enable addons
The minikube tool includes a set of built-in {{< glossary_tooltip text="addons" term_id="addons" >}} that can be enabled, disabled and opened in the local Kubernetes environment.
1. List the currently supported addons:
```shell
minikube addons list
```
The output is similar to:
```
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
```
1. Enable an addon, for example, `metrics-server`:
```shell
minikube addons enable metrics-server
```
The output is similar to:
```
The 'metrics-server' addon is enabled
```
1. View the Pod and Service you created by installing that addon:
```shell
kubectl get pod,svc -n kube-system
```
The output is similar to:
```
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
```
1. Check the output from `metrics-server`:
```shell
kubectl top pods
```
The output is similar to:
```
NAME CPU(cores) MEMORY(bytes)
hello-node-ccf4b9788-4jn97 1m 6Mi
```
If you see the following message, wait, and try again:
```
error: Metrics API not available
```
1. Disable `metrics-server`:
```shell
minikube addons disable metrics-server
```
The output is similar to:
```
metrics-server was successfully disabled
```
## Clean up
Now you can clean up the resources you created in your cluster:
```shell
kubectl delete service hello-node
kubectl delete deployment hello-node
```
Stop the Minikube cluster
```shell
minikube stop
```
Optionally, delete the Minikube VM:
```shell
# Optional
minikube delete
```
If you want to use minikube again to learn more about Kubernetes, you don't need to delete it.
## Conclusion
This page covered the basic aspects to get a minikube cluster up and running. You are now ready to deploy applications.
## {{% heading "whatsnext" %}}
* Tutorial to _[deploy your first app on Kubernetes with kubectl](/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/)_.
* Learn more about [Deployment objects](/docs/concepts/workloads/controllers/deployment/).
* Learn more about [Deploying applications](/docs/tasks/run-application/run-stateless-application-deployment/).
* Learn more about [Service objects](/docs/concepts/services-networking/service/).