Initialer Commit – Prototyp mit Istio und Zero Trust
commit
91469b00e9
|
|
@ -0,0 +1,216 @@
|
|||
# Prototyp-Dokumentation: Sichere DevOps Microservices mit Istio (Mac + Docker Desktop)
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
✅ **Betriebssystem:**
|
||||
- macOS mit Adminrechten
|
||||
|
||||
✅ **Tools, die du installiert hast:**
|
||||
|
||||
1. **Homebrew (wenn nicht vorhanden):**
|
||||
```bash
|
||||
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||
```
|
||||
|
||||
2. **Mit Homebrew installiert:**
|
||||
```bash
|
||||
brew install kubectl
|
||||
brew install minikube
|
||||
brew install istioctl
|
||||
brew install helm
|
||||
```
|
||||
|
||||
3. **Docker Desktop für Mac** installieren und starten
|
||||
|
||||
---
|
||||
|
||||
## Cluster & Istio aufsetzen
|
||||
|
||||
```bash
|
||||
minikube start --driver=docker
|
||||
```
|
||||
|
||||
Istio installieren:
|
||||
```bash
|
||||
curl -L https://istio.io/downloadIstio | sh -
|
||||
cd istio-1.22.0
|
||||
export PATH=$PWD/bin:$PATH
|
||||
istioctl install --set profile=demo -y
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Namespace & Sidecar-Injection vorbereiten
|
||||
|
||||
```bash
|
||||
kubectl create namespace demo
|
||||
kubectl label namespace demo istio-injection=enabled
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Docker-Images erstellen & hochladen
|
||||
|
||||
**DockerHub:**
|
||||
- Accountname: `deinName!`
|
||||
|
||||
In den Verzeichnissen `metrics-api` und `dashboard`:
|
||||
```bash
|
||||
docker build -t deinName!/metrics-api:latest .
|
||||
docker push deinName!/metrics-api:latest
|
||||
|
||||
docker build -t deinName!/dashboard:latest .
|
||||
docker push deinName!/dashboard:latest
|
||||
```
|
||||
|
||||
**Hinweis:** Dockerfile wurde angepasst, damit `curl` installiert ist.
|
||||
|
||||
---
|
||||
|
||||
## Kubernetes YAMLs anpassen
|
||||
|
||||
In `k8s/metrics-api.yaml` und `k8s/dashboard.yaml`:
|
||||
```yaml
|
||||
image: deinName!/metrics-api:latest
|
||||
image: deinName!/dashboard:latest
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Deployments ausrollen
|
||||
|
||||
```bash
|
||||
kubectl apply -n demo -f k8s/metrics-api.yaml
|
||||
kubectl apply -n demo -f k8s/dashboard.yaml
|
||||
```
|
||||
|
||||
Optional vorher löschen:
|
||||
```bash
|
||||
kubectl delete -n demo -f k8s/*.yaml
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## mTLS und Zero Trust aktivieren
|
||||
|
||||
```bash
|
||||
kubectl apply -n demo -f k8s/peerauth-strict.yaml
|
||||
kubectl apply -n demo -f k8s/authorization-policy.yaml
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Funktion testen
|
||||
|
||||
### ✅ Zugriff aus dem autorisierten `dashboard`-Pod
|
||||
|
||||
```bash
|
||||
kubectl exec -n demo $(kubectl get pod -n demo -l app=dashboard -o jsonpath='{.items[0].metadata.name}') -c dashboard -- curl http://metrics-api:8000/metrics
|
||||
```
|
||||
|
||||
Erwartete Ausgabe:
|
||||
```json
|
||||
{
|
||||
"uptime": "72h",
|
||||
"build_status": "success",
|
||||
"deployment_frequency": "5/week"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 🔒 Zugriff aus dem nicht autorisierten `intruder`-Pod
|
||||
|
||||
```bash
|
||||
kubectl apply -n demo -f k8s/intruder.yaml
|
||||
kubectl exec -n demo -it intruder -- sh
|
||||
apk add curl
|
||||
curl http://metrics-api:8000/metrics
|
||||
```
|
||||
|
||||
Erwartete Ausgabe:
|
||||
```
|
||||
RBAC: access denied
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Optional: Kiali starten und Visualisierung öffnen
|
||||
|
||||
```bash
|
||||
kubectl apply -f samples/addons
|
||||
istioctl dashboard kiali
|
||||
```
|
||||
|
||||
Danach öffnet sich ein Browserfenster mit Kiali. Dort kannst du unter "Graph" die Kommunikation zwischen den Services (z. B. `dashboard → metrics-api`) sowie Policy-Durchsetzungen visualisieren.
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Prototyp erneut starten (nach Rechner-Neustart oder späterem Zeitpunkt)
|
||||
|
||||
### ✅ 1. Docker Desktop öffnen
|
||||
Stelle sicher, dass **Docker Desktop läuft**, bevor du mit Minikube arbeitest.
|
||||
|
||||
### ✅ 2. Minikube starten
|
||||
```bash
|
||||
minikube start --driver=docker
|
||||
```
|
||||
|
||||
> Falls du den Cluster vorher gelöscht hast, kannst du ihn mit `minikube delete` zurücksetzen und dann wieder starten.
|
||||
|
||||
### ✅ 3. (Falls nötig) Istio wieder installieren
|
||||
Nur wenn du Minikube komplett gelöscht hast:
|
||||
|
||||
```bash
|
||||
cd istio-1.22.0
|
||||
export PATH=$PWD/bin:$PATH
|
||||
istioctl install --set profile=demo -y
|
||||
kubectl create namespace demo
|
||||
kubectl label namespace demo istio-injection=enabled
|
||||
```
|
||||
|
||||
### ✅ 4. Deployments und Sicherheitsrichtlinien anwenden
|
||||
Navigiere in deinen YAML-Ordner:
|
||||
|
||||
```bash
|
||||
cd ~/devops-prototype/k8s
|
||||
```
|
||||
|
||||
Dann:
|
||||
|
||||
```bash
|
||||
kubectl apply -n demo -f metrics-api.yaml
|
||||
kubectl apply -n demo -f dashboard.yaml
|
||||
kubectl apply -n demo -f peerauth-strict.yaml
|
||||
kubectl apply -n demo -f authorization-policy.yaml
|
||||
kubectl apply -n demo -f intruder.yaml
|
||||
```
|
||||
|
||||
### ✅ 5. Warten bis die Pods laufen
|
||||
```bash
|
||||
kubectl get pods -n demo
|
||||
```
|
||||
|
||||
Die Pods sollten den Status `2/2 Running` haben.
|
||||
|
||||
### ✅ 6. Testen, ob alles läuft
|
||||
```bash
|
||||
kubectl exec -n demo $(kubectl get pod -n demo -l app=dashboard -o jsonpath='{.items[0].metadata.name}') -c dashboard -- curl http://metrics-api:8000/metrics
|
||||
```
|
||||
|
||||
Wenn du die JSON-Daten erhältst, funktioniert alles korrekt.
|
||||
|
||||
---
|
||||
|
||||
## Zusammenfassung – Was jetzt läuft
|
||||
|
||||
| Komponente | Status |
|
||||
|---------------------------------------------|--------|
|
||||
| Minikube mit Docker Driver | ✅ |
|
||||
| Istio mit Sidecars | ✅ |
|
||||
| Zwei FastAPI-Services (metrics-api, dashboard) | ✅ |
|
||||
| Kommunikation abgesichert mit mTLS (STRICT) | ✅ |
|
||||
| Zugriff beschränkt mit Zero Trust Policy | ✅ |
|
||||
| Test mit autorisiertem Zugriff (`dashboard`) | ✅ |
|
||||
| Test mit blockiertem Zugriff (`intruder`) | ✅ |
|
||||
| Visualisierung mit Kiali | ✅ |
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
FROM python:3.10-slim
|
||||
WORKDIR /app
|
||||
COPY main.py .
|
||||
RUN pip install fastapi uvicorn requests
|
||||
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
from fastapi import FastAPI
|
||||
import requests
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
@app.get("/")
|
||||
def read_metrics():
|
||||
res = requests.get("http://metrics-api:8000/metrics")
|
||||
return res.json()
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
apiVersion: security.istio.io/v1beta1
|
||||
kind: AuthorizationPolicy
|
||||
metadata:
|
||||
name: allow-dashboard-to-metrics
|
||||
namespace: demo
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: metrics-api
|
||||
rules:
|
||||
- from:
|
||||
- source:
|
||||
principals:
|
||||
- cluster.local/ns/demo/sa/dashboard-sa
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: dashboard-sa
|
||||
namespace: demo
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: dashboard
|
||||
namespace: demo
|
||||
labels:
|
||||
app: dashboard
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: dashboard
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: dashboard
|
||||
spec:
|
||||
serviceAccountName: dashboard-sa
|
||||
containers:
|
||||
- name: dashboard
|
||||
image: brick99/dashboard:latest
|
||||
ports:
|
||||
- containerPort: 8000
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: dashboard
|
||||
namespace: demo
|
||||
spec:
|
||||
selector:
|
||||
app: dashboard
|
||||
ports:
|
||||
- port: 8000
|
||||
targetPort: 8000
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: intruder
|
||||
namespace: demo
|
||||
labels:
|
||||
app: intruder
|
||||
spec:
|
||||
containers:
|
||||
- name: intruder
|
||||
image: alpine
|
||||
command: ["/bin/sh"]
|
||||
args: ["-c", "sleep 3600"]
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: metrics-api
|
||||
namespace: demo
|
||||
labels:
|
||||
app: metrics-api
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: metrics-api
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: metrics-api
|
||||
spec:
|
||||
containers:
|
||||
- name: metrics-api
|
||||
image: brick99/metrics-api:latest
|
||||
ports:
|
||||
- containerPort: 8000
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: metrics-api
|
||||
namespace: demo
|
||||
spec:
|
||||
selector:
|
||||
app: metrics-api
|
||||
ports:
|
||||
- port: 8000
|
||||
targetPort: 8000
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
apiVersion: security.istio.io/v1beta1
|
||||
kind: PeerAuthentication
|
||||
metadata:
|
||||
name: default
|
||||
namespace: demo
|
||||
spec:
|
||||
mtls:
|
||||
mode: STRICT
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
FROM python:3.10-slim
|
||||
WORKDIR /app
|
||||
COPY main.py .
|
||||
RUN pip install fastapi uvicorn requests
|
||||
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
from fastapi import FastAPI
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
@app.get("/metrics")
|
||||
def get_metrics():
|
||||
return {
|
||||
"uptime": "72h",
|
||||
"build_status": "success",
|
||||
"deployment_frequency": "5/week"
|
||||
}
|
||||
Loading…
Reference in New Issue