Kubecademy
04. Dezember 2022

Minikube Tutorial

Gepostet am 04. Dezember 2022  •  10 Minuten  • 2054 Wörter  • Andere Sprachen:  English

Minikube installieren

Wie funktioniert Minikube?

Einen Cluster starten und verwalten

!minikube start
😄  minikube v1.28.0 auf Darwin 13.0 (arm64)
✨  Verwende den Treiber docker basierend auf der Benutzer-Konfiguration
📌  Using Docker Desktop driver with root privileges
👍  Starte Control Plane Node minikube in Cluster minikube
🚜  Ziehe das Base Image ...
🔥  Erstelle docker container (CPUs=2, Speicher=4000MB) ...
🐳  Vorbereiten von Kubernetes v1.25.3 auf Docker 20.10.20...
    ▪ Generiere Zertifikate und Schlüssel ...
    ▪ Starte Control-Plane ...
    ▪ Konfiguriere RBAC Regeln ...
🔎  Verifiziere Kubernetes Komponenten...
    ▪ Verwende Image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Addons aktiviert: default-storageclass, storage-provisioner
🏄  Fertig! kubectl ist jetzt für die standardmäßige (default) Verwendung des Clusters "minikube und des Namespaces "default" konfiguriert
!minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
!minikube pause
⏸️  Pausiere Node minikube ...
⏯️  14 Container pausiert in: kube-system, kubernetes-dashboard, storage-gluster, istio-operator
!minikube unpause
⏸️  Reaktiviere pausierten Node minikube ...
⏸️  Reaktiviere 14 pausierte Container in: kube-system, kubernetes-dashboard, storage-gluster, istio-operator
!minikube stop
✋  Stoppe Node "minikube" ...
🛑  minikube" wird über SSH ausgeschaltet...
🛑  1 Node angehalten.
!minikube delete
🔥  minikube" in docker wird gelöscht...
🔥  Lösche Container "minikube" ...
🔥  /Users/mitja/.minikube/machines/minikube wird entfernt...
💀  Alle Spuren des "minikube" Clusters wurden entfernt.

Kubeconfig und kubectl

!minikube start
😄  minikube v1.28.0 auf Darwin 13.0 (arm64)
✨  Verwende den Treiber docker basierend auf der Benutzer-Konfiguration
📌  Using Docker Desktop driver with root privileges
👍  Starte Control Plane Node minikube in Cluster minikube
🚜  Ziehe das Base Image ...
🔥  Erstelle docker container (CPUs=2, Speicher=4000MB) ...
🐳  Vorbereiten von Kubernetes v1.25.3 auf Docker 20.10.20...
    ▪ Generiere Zertifikate und Schlüssel ...
    ▪ Starte Control-Plane ...
    ▪ Konfiguriere RBAC Regeln ...
🔎  Verifiziere Kubernetes Komponenten...
    ▪ Verwende Image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Addons aktiviert: storage-provisioner, default-storageclass
🏄  Fertig! kubectl ist jetzt für die standardmäßige (default) Verwendung des Clusters "minikube und des Namespaces "default" konfiguriert
!kubectl get nodes
NAME       STATUS     ROLES           AGE   VERSION
minikube   NotReady   control-plane   12s   v1.25.3
!minikube kubectl -- get pods
No resources found in default namespace.

Persistente Konfiguration

!minikube config view
- driver: docker
- cache: map[gcr.io/kuar-demo/kuard-arm64:purple:<nil>]
!minikube config defaults kubernetes-version | grep 1.25
* v1.25.3
* v1.25.2
* v1.25.1
* v1.25.0
* v1.25.0-rc.1
* v1.25.0-rc.0
* v1.25.0-beta.0
* v1.25.0-alpha.3
* v1.25.0-alpha.2
* v1.25.0-alpha.1

Profile für mehrere Cluster

!minikube profile list
|----------|-----------|---------|--------------|------|---------|---------|-------|--------|
| Profile  | VM Driver | Runtime |      IP      | Port | Version | Status  | Nodes | Active |
|----------|-----------|---------|--------------|------|---------|---------|-------|--------|
| minikube | docker    | docker  | 192.168.49.2 | 8443 | v1.25.3 | Running |     1 | *      |
|----------|-----------|---------|--------------|------|---------|---------|-------|--------|
!minikube profile
minikube
!minikube start -p cluster2 --memory=4g --cpus=2
😄  [cluster2] minikube v1.28.0 auf Darwin 13.0 (arm64)
✨  Verwende den Treiber docker basierend auf der Benutzer-Konfiguration
📌  Using Docker Desktop driver with root privileges
👍  Starte Control Plane Node cluster2 in Cluster cluster2
🚜  Ziehe das Base Image ...
🔥  Erstelle docker container (CPUs=2, Speicher=4096MB) ...
🐳  Vorbereiten von Kubernetes v1.25.3 auf Docker 20.10.20...
    ▪ Generiere Zertifikate und Schlüssel ...
    ▪ Starte Control-Plane ...
    ▪ Konfiguriere RBAC Regeln ...
🔎  Verifiziere Kubernetes Komponenten...
    ▪ Verwende Image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Addons aktiviert: default-storageclass, storage-provisioner
🏄  Fertig! kubectl ist jetzt für die standardmäßige (default) Verwendung des Clusters "cluster2 und des Namespaces "default" konfiguriert
!minikube profile list
|----------|-----------|---------|--------------|------|---------|---------|-------|--------|
| Profile  | VM Driver | Runtime |      IP      | Port | Version | Status  | Nodes | Active |
|----------|-----------|---------|--------------|------|---------|---------|-------|--------|
| cluster2 | docker    | docker  | 192.168.58.2 | 8443 | v1.25.3 | Running |     1 |        |
| minikube | docker    | docker  | 192.168.49.2 | 8443 | v1.25.3 | Running |     1 | *      |
|----------|-----------|---------|--------------|------|---------|---------|-------|--------|
!minikube profile cluster2
✅  Minikube Profil wurde erfolgreich gesetzt auf cluster2
!minikube delete
🔥  cluster2" in docker wird gelöscht...
🔥  Lösche Container "cluster2" ...
🔥  /Users/mitja/.minikube/machines/cluster2 wird entfernt...
💀  Alle Spuren des "cluster2" Clusters wurden entfernt.
!minikube profile list
|----------|-----------|---------|--------------|------|---------|---------|-------|--------|
| Profile  | VM Driver | Runtime |      IP      | Port | Version | Status  | Nodes | Active |
|----------|-----------|---------|--------------|------|---------|---------|-------|--------|
| minikube | docker    | docker  | 192.168.49.2 | 8443 | v1.25.3 | Running |     1 | *      |
|----------|-----------|---------|--------------|------|---------|---------|-------|--------|

Minikube Addons

!minikube addons list
|-----------------------------|----------|--------------|--------------------------------|
|         ADDON NAME          | PROFILE  |    STATUS    |           MAINTAINER           |
|-----------------------------|----------|--------------|--------------------------------|
| ambassador                  | minikube | disabled     | 3rd party (Ambassador)         |
| auto-pause                  | minikube | disabled     | Google                         |
| cloud-spanner               | minikube | disabled     | Google                         |
| csi-hostpath-driver         | minikube | disabled     | Kubernetes                     |
| dashboard                   | minikube | disabled     | Kubernetes                     |
| default-storageclass        | minikube | enabled ✅   | Kubernetes                     |
| efk                         | minikube | disabled     | 3rd party (Elastic)            |
| freshpod                    | minikube | disabled     | Google                         |
| gcp-auth                    | minikube | disabled     | Google                         |
| gvisor                      | minikube | disabled     | Google                         |
| headlamp                    | minikube | disabled     | 3rd party (kinvolk.io)         |
| helm-tiller                 | minikube | disabled     | 3rd party (Helm)               |
| inaccel                     | minikube | disabled     | 3rd party (InAccel             |
|                             |          |              | [[email protected]])            |
| ingress                     | minikube | disabled     | Kubernetes                     |
| ingress-dns                 | minikube | disabled     | Google                         |
| istio                       | minikube | disabled     | 3rd party (Istio)              |
| istio-provisioner           | minikube | disabled     | 3rd party (Istio)              |
| kong                        | minikube | disabled     | 3rd party (Kong HQ)            |
| kubevirt                    | minikube | disabled     | 3rd party (KubeVirt)           |
| logviewer                   | minikube | disabled     | 3rd party (unknown)            |
| metallb                     | minikube | disabled     | 3rd party (MetalLB)            |
| metrics-server              | minikube | disabled     | Kubernetes                     |
| nvidia-driver-installer     | minikube | disabled     | Google                         |
| nvidia-gpu-device-plugin    | minikube | disabled     | 3rd party (Nvidia)             |
| olm                         | minikube | disabled     | 3rd party (Operator Framework) |
| pod-security-policy         | minikube | disabled     | 3rd party (unknown)            |
| portainer                   | minikube | disabled     | 3rd party (Portainer.io)       |
| registry                    | minikube | disabled     | Google                         |
| registry-aliases            | minikube | disabled     | 3rd party (unknown)            |
| registry-creds              | minikube | disabled     | 3rd party (UPMC Enterprises)   |
| storage-provisioner         | minikube | enabled ✅   | Google                         |
| storage-provisioner-gluster | minikube | disabled     | 3rd party (Gluster)            |
| volumesnapshots             | minikube | disabled     | Kubernetes                     |
|-----------------------------|----------|--------------|--------------------------------|
!minikube addons enable dashboard
💡  dashboard is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
    ▪ Verwende Image docker.io/kubernetesui/dashboard:v2.7.0
    ▪ Verwende Image docker.io/kubernetesui/metrics-scraper:v1.0.8
💡  Einige Dashboard Features erfordern das metrics-server Addon. Um alle Features zu aktivieren:

	minikube addons enable metrics-server	


🌟  Das Addon dashboard ist aktiviert
!minikube addons enable metrics-server
💡  metrics-server is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
    ▪ Verwende Image k8s.gcr.io/metrics-server/metrics-server:v0.6.1
🌟  Das Addon metrics-server ist aktiviert
!minikube dashboard
🤔  Verifiziere Dashboard Funktionalität ...
🚀  Starte Proxy ...
🤔  Verifiziere Proxy Funktionalität ...
🎉  Öffne http://127.0.0.1:52608/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ im Default-Browser...
^C

Services exponieren

!minikube kubectl -- create deployment hello --image=gcr.io/google-samples/hello-app:1.0
deployment.apps/hello created
!kubectl expose deployment hello --type=NodePort --port=8080
service/hello exposed
!minikube service hello --url
http://127.0.0.1:52975
❗  Weil Sie einen Docker Treiber auf darwin verwenden, muss das Terminal während des Ausführens offen bleiben.
^C

Eine bestehende Anwendung auf Minikube deployen

!minikube kubectl -- get nodes,ns
NAME            STATUS   ROLES           AGE    VERSION
node/minikube   Ready    control-plane   103s   v1.25.3

NAME                        STATUS   AGE
namespace/default           Active   101s
namespace/kube-node-lease   Active   103s
namespace/kube-public       Active   103s
namespace/kube-system       Active   103s
!minikube kubectl -- create ns hello
namespace/hello created
!minikube kubectl -- -n hello create deployment hello \
  --image gcr.io/kuar-demo/kuard-arm64:purple
deployment.apps/hello created
!minikube kubectl -- -n hello expose deployment hello \
  --type=NodePort \
  --port=8080
service/hello exposed
!minikube kubectl -- -n hello get service hello
NAME    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
hello   NodePort   10.101.41.229   <none>        8080:30008/TCP   3s
!minikube service -n hello hello --url
http://127.0.0.1:53059
❗  Weil Sie einen Docker Treiber auf darwin verwenden, muss das Terminal während des Ausführens offen bleiben.
^C
!minikube dashboard
🔌  Aktiviere Dashboard ...
    ▪ Verwende Image docker.io/kubernetesui/dashboard:v2.7.0
    ▪ Verwende Image docker.io/kubernetesui/metrics-scraper:v1.0.8
💡  Einige Dashboard Features erfordern das metrics-server Addon. Um alle Features zu aktivieren:

	minikube addons enable metrics-server	


🤔  Verifiziere Dashboard Funktionalität ...
🚀  Starte Proxy ...
🤔  Verifiziere Proxy Funktionalität ...
🎉  Öffne http://127.0.0.1:53086/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ im Default-Browser...
^C
!minikube kubectl -- delete ns hello
namespace "hello" deleted

Ein Container Image für eine Anwendung mit Minikube bauen und testen

!git clone https://github.com/mitja/flask-example
fatal: destination path 'flask-example' already exists and is not an empty directory.
!cd flask-example && minikube image build -t flask-example .
Sending build context to Docker daemon  74.24kB
Step 1/10 : FROM python:3.11-alpine
3.11-alpine: Pulling from library/python
a9eaa45ef418: Pulling fs layer
d462052b8b5e: Pulling fs layer
d39a1ce7ce55: Pulling fs layer
716a594288ba: Pulling fs layer
711e9c1e0bb1: Pulling fs layer
716a594288ba: Waiting
711e9c1e0bb1: Waiting
d462052b8b5e: Verifying Checksum
d462052b8b5e: Download complete
716a594288ba: Verifying Checksum
716a594288ba: Download complete
a9eaa45ef418: Verifying Checksum
a9eaa45ef418: Download complete
a9eaa45ef418: Pull complete
d462052b8b5e: Pull complete
711e9c1e0bb1: Verifying Checksum
711e9c1e0bb1: Download complete
d39a1ce7ce55: Download complete
d39a1ce7ce55: Pull complete
716a594288ba: Pull complete
711e9c1e0bb1: Pull complete
Digest: sha256:ca1298a74c3495b6bc539044352301fa371f6e10b0e085f93d2a4ef3e4c3fa6c
Status: Downloaded newer image for python:3.11-alpine
 ---> 09701b4c57d8
Step 2/10 : RUN adduser -D flask
 ---> Running in 87e9accc6ac2
Removing intermediate container 87e9accc6ac2
 ---> f770c98c3022
Step 3/10 : USER flask
 ---> Running in 8f7e63001248
Removing intermediate container 8f7e63001248
 ---> 8b6aab090307
Step 4/10 : WORKDIR /home/flask
 ---> Running in d134f79164eb
Removing intermediate container d134f79164eb
 ---> 3041a00df918
Step 5/10 : ENV PATH="/home/flask/.local/bin:${PATH}"
 ---> Running in 781437b76e4d
Removing intermediate container 781437b76e4d
 ---> c84a4061908e
Step 6/10 : COPY --chown=flask:flask requirements.txt requirements.txt
 ---> 256428e35f34
Step 7/10 : RUN pip install --user -r requirements.txt
 ---> Running in ba28c1ff17b7
Collecting Flask==2.2.2
  Downloading Flask-2.2.2-py3-none-any.whl (101 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 101.5/101.5 kB 2.6 MB/s eta 0:00:00
Collecting Werkzeug>=2.2.2
  Downloading Werkzeug-2.2.2-py3-none-any.whl (232 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 232.7/232.7 kB 6.0 MB/s eta 0:00:00
Collecting Jinja2>=3.0
  Downloading Jinja2-3.1.2-py3-none-any.whl (133 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 133.1/133.1 kB 6.0 MB/s eta 0:00:00
Collecting itsdangerous>=2.0
  Downloading itsdangerous-2.1.2-py3-none-any.whl (15 kB)
Collecting click>=8.0
  Downloading click-8.1.3-py3-none-any.whl (96 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 96.6/96.6 kB 6.3 MB/s eta 0:00:00
Collecting MarkupSafe>=2.0
  Downloading MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl (33 kB)
Installing collected packages: MarkupSafe, itsdangerous, click, Werkzeug, Jinja2, Flask
Successfully installed Flask-2.2.2 Jinja2-3.1.2 MarkupSafe-2.1.2 Werkzeug-2.2.2 click-8.1.3 itsdangerous-2.1.2
Removing intermediate container ba28c1ff17b7
 ---> 8340c47c3836
Step 8/10 : COPY --chown=flask:flask . .
 ---> f10e85d4f5bf
Step 9/10 : EXPOSE 5000
 ---> Running in c13f52b7ba0e
Removing intermediate container c13f52b7ba0e
 ---> dc3c08706b61
Step 10/10 : CMD ["python", "app.py"]
 ---> Running in b6b49707167e
Removing intermediate container b6b49707167e
 ---> d4adb787c5f4
Successfully built d4adb787c5f4
Successfully tagged flask-example:latest
!cat flask-example/deployment.yml | grep -B 4 imagePullPolicy
    spec:
      containers:
      - name: flask
        image: flask-example:latest
        imagePullPolicy: Never
!minikube kubectl -- apply -f flask-example/deployment.yml
deployment.apps/flask-example-deployment created
service/flask-example-service created
!minikube kubectl -- \
  run -it --rm --restart=Never \
  --image curlimages/curl my-shell -- \
  curl flask-example-service:5000
<!DOCTYPE html>

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flask Example</title>
</head>
<body>
    <h1>Flask Example</h1>
    <p>This is a Flask App containerised with Docker</p>
</body>
</html>pod "my-shell" deleted

Einen Web Service mit Ingress veröffentlichen

!minikube addons enable ingress
💡  ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
💡  Nachdem das Addon aktiviert wurde, führen Sie bitte "minikube tunnel" aus, dann sind ihre Resourcen über "127.0.0.1" erreichbar
    ▪ Verwende Image k8s.gcr.io/ingress-nginx/controller:v1.2.1
    ▪ Verwende Image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
    ▪ Verwende Image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
🔎  Verifiziere ingress Addon...
🌟  Das Addon ingress ist aktiviert
!minikube kubectl -- get pod,service -n ingress-nginx
NAME                                            READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-5kg4m        0/1     Completed   0          31s
pod/ingress-nginx-admission-patch-dmzwc         0/1     Completed   0          31s
pod/ingress-nginx-controller-5959f988fd-h9xkj   0/1     Running     0          31s

NAME                                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller             NodePort    10.111.21.253   <none>        80:30430/TCP,443:30276/TCP   31s
service/ingress-nginx-controller-admission   ClusterIP   10.108.57.79    <none>        443/TCP                      31s
!minikube kubectl -- \
  create deployment web \
  --image=gcr.io/google-samples/hello-app:1.0
deployment.apps/web created
!minikube kubectl -- \
  expose deployment web \
  --type=NodePort --port=8080
service/web exposed
!minikube service web --url
http://127.0.0.1:53321
❗  Weil Sie einen Docker Treiber auf darwin verwenden, muss das Terminal während des Ausführens offen bleiben.
^C
!cat example-ingress.yaml | grep -A 11 spec
spec:
  rules:
    - host: hello-world.info
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 8080
!minikube kubectl -- \
  apply -f example-ingress.yaml
ingress.networking.k8s.io/example-ingress created
!minikube kubectl get ingress
NAME              CLASS   HOSTS              ADDRESS   PORTS   AGE
example-ingress   nginx   hello-world.info             80      5s
!minikube ip
192.168.49.2

Füge diese Zeile zur /etc/hosts hinzu:

127.0.0.1 hello-world.info

und starte minikube tunnel (sudo / Administrator Rechte erforderlich)

!minikube delete

!minikube delete
🔥  minikube" in docker wird gelöscht...
🔥  Lösche Container "minikube" ...
🔥  /Users/mitja/.minikube/machines/minikube wird entfernt...
💀  Alle Spuren des "minikube" Clusters wurden entfernt.