In dieser Übung werden Sie lernen, wie Sie Ihre Anwendung in Kubernetes absichern können. Die Aufgabe umfasst die folgenden Schritte:
Schritt-für-Schritt-Anleitung:
kubectl create secret, um das Secret zu
erstellen.1. Erstellen eines Secrets:
Erstellen Sie ein Secret für die Datenbank-Anmeldeinformationen:
kubectl create secret generic db-secret --from-literal=username=myuser --from-literal=password=mypassword2. Erstellen eines Deployments, das das Secret verwendet:
Erstellen Sie eine Datei deployment.yaml mit folgendem
Inhalt:
apiVersion: apps/v1
kind: Deployment
metadata:
name: secure-app
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: secure-app
template:
metadata:
labels:
app: secure-app
spec:
containers:
- name: secure-app
image: myapp:latest
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: passwordDeployen Sie die Anwendung:
kubectl apply -f deployment.yaml3. Konfigurieren von RBAC für den Zugriff auf das Secret:
Erstellen Sie eine Datei role.yaml mit folgendem
Inhalt:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get"]Erstellen Sie eine Datei rolebinding.yaml mit folgendem
Inhalt:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-secrets
namespace: default
subjects:
- kind: ServiceAccount
name: default
namespace: default
roleRef:
kind: Role
name: secret-reader
apiGroup: rbac.authorization.k8s.ioErstellen Sie die Role und das RoleBinding:
kubectl apply -f role.yaml
kubectl apply -f rolebinding.yaml4. Überprüfen des Zugriffs auf das Secret:
Starten Sie einen Pod, der versucht, auf das Secret zuzugreifen:
apiVersion: v1
kind: Pod
metadata:
name: secret-access
namespace: default
spec:
containers:
- name: secret-access
image: busybox
command: ["sh", "-c", "sleep 3600"]Verwenden Sie kubectl exec, um auf den Pod zuzugreifen
und das Secret zu überprüfen:
kubectl exec -it secret-access -- shInnerhalb des Pods:
cat /var/run/secrets/kubernetes.io/serviceaccount/namespaceWenn der Zugriff korrekt konfiguriert ist, sollten Sie die Werte des Secrets anzeigen können.
Diese Übung demonstriert die Grundlagen der Absicherung von Anwendungen in Kubernetes durch die Verwendung von Secrets und RBAC. Indem Sie sensible Daten in Secrets speichern und den Zugriff mit RBAC kontrollieren, können Sie die Sicherheit Ihrer Anwendungen und Daten im Kubernetes-Cluster erheblich verbessern.
Ingress-Objekte in Kubernetes ermöglichen es, den Zugriff auf HTTP-
und HTTPS-basierte Dienste von außerhalb des Clusters zu steuern. Sie
bieten eine höhere Ebene der Abstraktion als Services und können eine
Vielzahl von Services unter einer einheitlichen IP-Adresse
zusammenführen. Im Folgenden wird ein Ingress-Objekt konfiguriert, das
den externen HTTP-Zugriff auf den bereits definierten Nginx-Webserver
über einen ClusterIP Service steuert.
Bevor ein Ingress-Objekt erstellt wird, muss ein Ingress Controller im Cluster vorhanden sein. Der Ingress Controller ist verantwortlich für die Implementierung der Regeln, die in den Ingress-Ressourcen definiert sind. Gängige Ingress Controller sind Nginx, Traefik oder HAProxy.
Angenommen, der Ingress Controller ist bereits im Cluster installiert und konfiguriert, kann nun eine Ingress-Ressource definiert werden, die den Zugriff auf den Nginx Service regelt.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /web
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80Dieses Ingress-Objekt hat folgende Bedeutung:
nginx-ingress./ des Nginx-Servers umgeschrieben werden./web.Prefix bedeutet, dass alle Pfade,
die mit /web beginnen, an diesen Service weitergeleitet
werden.nginx-service.80.Sobald der Ingress definiert und vom Ingress Controller übernommen
wurde, können Clients den Nginx-Webserver erreichen, indem sie Anfragen
an die vom Ingress Controller bereitgestellte IP-Adresse senden, mit dem
Pfad /web. Der Controller leitet die Anfragen entsprechend
an den ClusterIP Service und von dort an den Nginx Pod
weiter.
In diesem aktualisierten Diagramm:
Ingress Controller nimmt eingehenden Traffic vom
Ingress Objekt entgegen.Ingress Objekt hat eine externe IP und eine
DNS-Zuweisung, was es von außerhalb des Clusters erreichbar macht.Ingress Objekt und
von dort an den Ingress Controller gesendet.Ingress Controller leitet den Traffic gemäß den
Ingress-Regeln an den entsprechenden Service, in diesem Fall
Service A, weiter.podA1 und podA2 sind über
Service A erreichbar, das intern im Cluster über einen
ClusterIP verfügt.Um Ingress-Ressourcen auf einen konkreten DNS-Namen zu setzen, werden
Host-Regeln in der Ingress-Konfiguration definiert. Hier ist ein
Beispiel für einen Ingress, der für den DNS-Namen
example.com konfiguriert ist und den Verkehr an den bereits
vorhandenen Nginx-Service weiterleitet:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80example.com) an, auf den der Ingress reagieren soll.
Anfragen an diesen Hostnamen werden entsprechend den definierten
Pfadregeln weitergeleitet./) des Hosts
example.com an den Service weitergeleitet werden
sollen.Um den Ingress unter dem spezifizierten DNS-Namen erreichbar zu
machen, muss dieser DNS-Name in der DNS-Zone, die für die Domain
example.com zuständig ist, auf die IP-Adresse des Ingress
Controllers gesetzt werden. Dies geschieht in der Regel außerhalb von
Kubernetes bei dem DNS-Provider, der die Domain verwaltet. Nachdem der
DNS-Eintrag propagiert wurde, kann der Ingress-Controller Anfragen, die
an example.com gerichtet sind, an den
nginx-service weiterleiten.