Sichere Kommunikation in Kubernetes mit Consul Connect und Vault Agent Injector
Sichere Kommunikation in Kubernetes mit Consul Connect und Vault Agent Injector In modernen cloud-nativen Kubernetes-Umgebungen ist Sicherheit von größter
In modernen cloud-nativen Kubernetes-Umgebungen ist Sicherheit von größter Bedeutung. Eine der wichtigsten Herausforderungen besteht darin, sichere Kommunikation zwischen Microservices zu gewährleisten und gleichzeitig Secrets sicher zu verwalten. Ob Sie eine monolithische Anwendung oder eine Reihe von Microservices in Kubernetes betreiben - die Sicherung der Service-zu-Service-Kommunikation und des Secret-Managements ist entscheidend, um unbefugten Zugriff zu verhindern und den Datenschutz zu gewährleisten. Hier kommen HashiCorp Consul Connect in Kombination mit HashiCorp Vault Agent Injector ins Spiel und bringen die gleiche bewährte Service-Mesh-Lösung aus dem HashiCorp-Ökosystem nach Kubernetes.
In diesem Blog-Beitrag erkunden wir, wie Sie die Kommunikation Ihrer Workloads in Kubernetes mit HashiCorp Consul Connect Service Mesh sichern können, während Sie gleichzeitig Vault Agent Injector für dynamisches Secret-Management nutzen und dabei eine direkte Kubernetes-Entsprechung zu unseren Nomad-Beispielen bereitstellen.
Hinweis: Dieser Artikel demonstriert, wie Sie die gleiche HashiCorp Consul Connect Service Mesh-Technologie, die in unserem Beitrag Sichere Kommunikation auf HashiCorp Nomad mit Consul Connect gezeigt wurde, in Kubernetes verwenden können. Er baut auch auf den Secret-Management-Konzepten aus Kubernetes und Vault Agent Injector: Dynamisches Secrets Management auf.
Consul Connect ist HashiCorps Service-Mesh-Lösung, die sichere Service-zu-Service-Kommunikation in Ihrer Infrastruktur bereitstellt. Sie erreicht dies durch die Aktivierung von mutual Transport Layer Security (mTLS) zwischen Services. Jeder Service erhält seine eigene Identität, und Consul stellt sicher, dass nur vertrauenswürdige Services miteinander kommunizieren können. Durch die Verwendung von Connect wird die Service-Kommunikation authentifiziert und verschlüsselt, wodurch sichergestellt wird, dass die Netzwerksicherheit auch in feindlichen oder kompromittierten Umgebungen aufrechterhalten wird.
Während Kubernetes hervorragende Orchestrierungsmöglichkeiten bietet, fehlen ihm native Service-Mesh-Features für verschlüsselte Kommunikation zwischen Services. Consul Connect schließt diese Lücke, indem es HashiCorps bewährte Service-Mesh-Technologie in Kubernetes-Umgebungen bringt. In Kombination mit Vault Agent Injector erhalten Sie:
consul.example.com:8500
vault.example.com:8200
Installieren Sie nur die Consul Connect Injector-Komponenten, um sich direkt mit einem externen Consul-Cluster zu verbinden, ohne Consul-Clients bereitzustellen:
1# HashiCorp Helm Repository hinzufügen
2helm repo add hashicorp https://helm.releases.hashicorp.com
3helm repo update
4
5# consul-values.yaml für externe Consul-Konfiguration erstellen
6cat > consul-values.yaml <<EOF
7global:
8 name: consul
9 datacenter: dc1
10 # Konfiguration für direkte Nutzung externer Consul-Server
11 consulAPITimeout: 5s
12
13# Server-Installation deaktivieren - wir verwenden externen Consul
14server:
15 enabled: false
16
17# Client deaktivieren - Connect Injector kommuniziert direkt mit externem Consul
18client:
19 enabled: false
20
21# Connect Injection für externen Consul aktivieren
22connectInject:
23 enabled: true
24 default: false # Wir aktivieren explizit pro Service
25 # Injector für direkten externen Consul-Zugriff konfigurieren
26 consulNode:
27 meta:
28 pod-name: \${HOSTNAME}
29 node-name: \${NODE_NAME}
30 # Externe Consul-Server
31 k8sAllowNamespaces: ["*"]
32 k8sDenyNamespaces: []
33
34controller:
35 enabled: true
36
37# UI deaktivieren, da wir externen Consul verwenden
38ui:
39 enabled: false
40
41# DNS deaktivieren, da keine Clients bereitgestellt werden
42dns:
43 enabled: false
44
45# Externe Consul-Verbindung konfigurieren
46externalServers:
47 enabled: true
48 hosts: ["consul.example.com"]
49 httpsPort: 8501 # HTTPS-Port für sichere Verbindung verwenden
50 useSystemRoots: true
51EOF
52
53# Consul Connect-Komponenten installieren
54kubectl create namespace consul
55helm install consul hashicorp/consul \
56 --namespace consul \
57 --values consul-values.yaml
58
59# Warten bis Connect Injector bereit ist
60kubectl wait --for=condition=ready pod -l app=consul-connect-injector -n consul --timeout=300s
Installieren Sie den Vault Agent Injector wie in unseren vorherigen Beiträgen demonstriert:
1# Nur den Agent Injector installieren (kein Vault-Server)
2helm install vault-injector hashicorp/vault \
3 --set "global.externalVaultAddr=https://vault.example.com:8200" \
4 --set "injector.enabled=true" \
5 --set "server.enabled=false" \
6 --set "csi.enabled=false"
Richten Sie dieselbe Vault-Konfiguration wie in unseren vorherigen Kubernetes-Beiträgen ein:
1# Vault-Adresse Umgebungsvariable setzen
2export VAULT_ADDR="https://vault.example.com:8200"
3
4# Kubernetes Auth-Methode aktivieren
5vault auth enable kubernetes
6
7# Kubernetes Auth konfigurieren
8KUBERNETES_HOST=$(kubectl config view --raw --minify --flatten -o jsonpath='{.clusters[].cluster.server}')
9KUBERNETES_CA_CERT=$(kubectl config view --raw --minify --flatten -o jsonpath='{.clusters[].cluster.certificate-authority-data}' | base64 -d)
10
11# Service Account erstellen und Auth konfigurieren
12kubectl create serviceaccount vault-auth
13kubectl apply -f - <<EOF
14apiVersion: rbac.authorization.k8s.io/v1
15kind: ClusterRoleBinding
16metadata:
17 name: role-tokenreview-binding
18roleRef:
19 apiGroup: rbac.authorization.k8s.io
20 kind: ClusterRole
21 name: system:auth-delegator
22subjects:
23- kind: ServiceAccount
24 name: vault-auth
25 namespace: default
26EOF
27
28TOKEN_REVIEWER_JWT=$(kubectl create token vault-auth)
29
30vault write auth/kubernetes/config \
31 token_reviewer_jwt="$TOKEN_REVIEWER_JWT" \
32 kubernetes_host="$KUBERNETES_HOST" \
33 kubernetes_ca_cert="$KUBERNETES_CA_CERT"
1# Database Secrets Engine aktivieren
2vault secrets enable -path=dynamic-app/db database
3
4# MySQL-Verbindung konfigurieren
5vault write dynamic-app/db/config/mysql \
6 plugin_name=mysql-database-plugin \
7 connection_url="{{username}}:{{password}}@tcp(mysql-server.demo.svc.cluster.local:3306)/" \
8 allowed_roles="*" \
9 username="root" \
10 password="super-duper-password"
11
12# Dynamische Credentials-Rolle erstellen
13vault write dynamic-app/db/roles/app \
14 db_name=mysql \
15 creation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';GRANT ALL ON my_app.* TO '{{name}}'@'%';" \
16 default_ttl="1h" \
17 max_ttl="24h"
18
19# Transit Engine für Verschlüsselung aktivieren
20vault secrets enable -path=dynamic-app/transit transit
21vault write -f dynamic-app/transit/keys/app
22
23# Vault Policy erstellen
24vault policy write dynamic-app-consul - <<EOF
25path "dynamic-app/db/creds/app" {
26 capabilities = ["read"]
27}
28path "dynamic-app/transit/encrypt/app" {
29 capabilities = ["update"]
30}
31path "dynamic-app/transit/decrypt/app" {
32 capabilities = ["update"]
33}
34EOF
35
36# Kubernetes-Rolle erstellen
37vault write auth/kubernetes/role/dynamic-app-consul \
38 bound_service_account_names=dynamic-app-consul \
39 bound_service_account_namespaces=demo \
40 policies=dynamic-app-consul \
41 ttl=24h
1# Demo-Namespace erstellen
2kubectl create namespace demo
3
4# Service Accounts erstellen
5kubectl create serviceaccount dynamic-app-consul -n demo
6kubectl create serviceaccount mysql-server-consul -n demo
1# mysql-consul-deployment.yaml
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5 name: mysql-server
6 namespace: demo
7 labels:
8 app: mysql-server
9spec:
10 replicas: 1
11 selector:
12 matchLabels:
13 app: mysql-server
14 template:
15 metadata:
16 labels:
17 app: mysql-server
18 annotations:
19 "consul.hashicorp.com/connect-inject": "true"
20 "consul.hashicorp.com/connect-service": "mysql-server"
21 "consul.hashicorp.com/connect-service-port": "3306"
22 spec:
23 serviceAccountName: mysql-server-consul
24 containers:
25 - name: mysql
26 image: mysql:9
27 env:
28 - name: MYSQL_ROOT_PASSWORD
29 value: "super-duper-password"
30 - name: MYSQL_DATABASE
31 value: "my_app"
32 ports:
33 - containerPort: 3306
34 name: mysql
35 resources:
36 requests:
37 cpu: 500m
38 memory: 1Gi
39 limits:
40 cpu: 500m
41 memory: 1Gi
42 readinessProbe:
43 exec:
44 command:
45 - "/bin/bash"
46 - "-c"
47 - "mysqladmin ping -h 127.0.0.1 -u root -p$MYSQL_ROOT_PASSWORD"
48 initialDelaySeconds: 30
49 periodSeconds: 10
50 livenessProbe:
51 exec:
52 command:
53 - "/bin/bash"
54 - "-c"
55 - "mysqladmin ping -h 127.0.0.1 -u root -p$MYSQL_ROOT_PASSWORD"
56 initialDelaySeconds: 60
57 periodSeconds: 10
58
59---
60apiVersion: v1
61kind: Service
62metadata:
63 name: mysql-server
64 namespace: demo
65 labels:
66 app: mysql-server
67spec:
68 ports:
69 - port: 3306
70 name: mysql
71 targetPort: 3306
72 selector:
73 app: mysql-server
1# dynamic-app-consul.yaml
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5 name: dynamic-app
6 namespace: demo
7 labels:
8 app: dynamic-app
9spec:
10 replicas: 1
11 selector:
12 matchLabels:
13 app: dynamic-app
14 template:
15 metadata:
16 labels:
17 app: dynamic-app
18 annotations:
19 # Consul Connect Annotationen
20 "consul.hashicorp.com/connect-inject": "true"
21 "consul.hashicorp.com/connect-service": "dynamic-app"
22 "consul.hashicorp.com/connect-service-port": "8080"
23 "consul.hashicorp.com/connect-service-upstreams": "mysql-server:3306"
24
25 # Vault Agent Injector Annotationen
26 "vault.hashicorp.com/agent-inject": "true"
27 "vault.hashicorp.com/agent-inject-status": "update"
28 "vault.hashicorp.com/agent-inject-vault-addr": "https://vault.example.com:8200"
29 "vault.hashicorp.com/role": "dynamic-app-consul"
30 "vault.hashicorp.com/agent-inject-secret-config.ini": "dynamic-app/db/creds/app"
31 "vault.hashicorp.com/agent-inject-template-config.ini": |
32 [DEFAULT]
33 LogLevel = DEBUG
34 Port = 8080
35
36 [DATABASE]
37 Address = 127.0.0.1
38 Port = 3306
39 Database = my_app
40 {{- with secret "dynamic-app/db/creds/app" }}
41 User = {{ .Data.username }}
42 Password = {{ .Data.password }}
43 {{- end }}
44
45 [VAULT]
46 Enabled = True
47 InjectToken = True
48 Namespace =
49 Address = https://vault.example.com:8200
50 KeyPath = dynamic-app/transit
51 KeyName = app
52 spec:
53 serviceAccountName: dynamic-app-consul
54 containers:
55 - name: dynamic-app
56 image: ghcr.io/infralovers/nomad-vault-mysql:1.0.0
57 ports:
58 - containerPort: 8080
59 name: http
60 env:
61 - name: CONFIG_FILE
62 value: "/vault/secrets/config.ini"
63 - name: VAULT_ADDR
64 value: "https://vault.example.com:8200"
65 resources:
66 requests:
67 cpu: 256m
68 memory: 256Mi
69 limits:
70 cpu: 256m
71 memory: 256Mi
72 livenessProbe:
73 httpGet:
74 path: /health
75 port: 8080
76 initialDelaySeconds: 60
77 periodSeconds: 10
78 readinessProbe:
79 httpGet:
80 path: /health
81 port: 8080
82 initialDelaySeconds: 30
83 periodSeconds: 5
84
85---
86apiVersion: v1
87kind: Service
88metadata:
89 name: dynamic-app
90 namespace: demo
91 labels:
92 app: dynamic-app
93spec:
94 ports:
95 - port: 8080
96 name: http
97 targetPort: 8080
98 selector:
99 app: dynamic-app
100
101---
102# Ingress für externen Zugriff
103apiVersion: networking.k8s.io/v1
104kind: Ingress
105metadata:
106 name: dynamic-app-ingress
107 namespace: demo
108 annotations:
109 nginx.ingress.kubernetes.io/rewrite-target: /
110spec:
111 rules:
112 - host: dynamic-app.local
113 http:
114 paths:
115 - path: /
116 pathType: Prefix
117 backend:
118 service:
119 name: dynamic-app
120 port:
121 number: 8080
Erstellen Sie Consul Intentions zur Kontrolle der Service-zu-Service-Kommunikation, genau wie im Nomad-Beispiel. Verbinden Sie sich mit Ihrem externen Consul-Cluster, um Intentions zu konfigurieren:
1# Consul-Adresse Umgebungsvariable setzen
2export CONSUL_HTTP_ADDR="https://consul.example.com:8500"
3
4# Intention erstellen, um dynamic-app die Verbindung zu mysql-server zu erlauben
5consul intention create -allow dynamic-app mysql-server
6
7# Intentions verifizieren
8consul intention list
9
10# Optional: Granularere Intentions mit deny-all Standard erstellen
11consul intention create -deny "*" "*"
12consul intention create -allow dynamic-app mysql-server
Alternativ können Sie Kubernetes CRDs für Intentions verwenden:
1# consul-intentions.yaml
2apiVersion: consul.hashicorp.com/v1alpha1
3kind: ServiceIntentions
4metadata:
5 name: mysql-server-intentions
6 namespace: demo
7spec:
8 destination:
9 name: mysql-server
10 sources:
11 - name: dynamic-app
12 action: allow
Dieser Deployment-Ansatz verwendet keine Consul-Clients in Kubernetes und bietet mehrere Vorteile:
Der Consul Connect Injector arbeitet unabhängig und:
Sie können die Connect Proxy-Konfiguration mit Annotationen anpassen:
1annotations:
2 "consul.hashicorp.com/connect-inject": "true"
3 "consul.hashicorp.com/connect-service": "dynamic-app"
4 "consul.hashicorp.com/connect-service-port": "8080"
5 "consul.hashicorp.com/connect-proxy-cpu-request": "50m"
6 "consul.hashicorp.com/connect-proxy-memory-request": "64Mi"
7 "consul.hashicorp.com/connect-proxy-cpu-limit": "100m"
8 "consul.hashicorp.com/connect-proxy-memory-limit": "128Mi"
9 "consul.hashicorp.com/envoy-extra-args": "--log-level debug"
Consul Connect kann mit Kubernetes Health Checks integriert werden:
1annotations:
2 "consul.hashicorp.com/service-sync": "true"
3 "consul.hashicorp.com/service-port": "8080"
4 "consul.hashicorp.com/connect-service-port": "8080"
Feature | Nomad + Consul Connect | Kubernetes + Consul Connect (Client-los) |
---|---|---|
Service-Registrierung | Automatisch via Nomad | Direkte API-Aufrufe an externen Consul |
Sidecar-Injection | Native Nomad-Integration | Kubernetes Admission Controller |
Konfiguration | Job-Spezifikation HCL | Kubernetes Annotationen |
Service Discovery | Consul DNS/API | Externe Consul API-Aufrufe |
Health Checks | Nomad + Consul Checks | Kubernetes + Externe Consul API |
Ressourcen-Management | Nomad Scheduler | Kubernetes Scheduler |
Lokale Consul-Agents | Optional mit Connect | Keine erforderlich (client-los) |
Die Verwendung von HashiCorp Consul Connect mit Vault Agent Injector in Kubernetes bietet eine vertraute und mächtige Service-Mesh-Lösung, die Konsistenz mit Ihrer bestehenden HashiCorp-Infrastruktur aufrechterhält. Dieser Ansatz ist besonders wertvoll für Organisationen, die bereits Consul Connect mit Nomad verwenden und die gleichen Sicherheitsmuster auf Kubernetes-Workloads ausweiten möchten.
Wichtige Vorteile dieses Ansatzes:
Durch die Nutzung von Consul Connect in Kubernetes können Sie sichere, authentifizierte und verschlüsselte Kommunikation zwischen Ihren Services gewährleisten, während Sie die operativen Muster und das Fachwissen beibehalten, das Ihr Team mit HashiCorps Service-Mesh-Technologie entwickelt hat.
Beginnen Sie noch heute mit der Verbesserung Ihrer Kubernetes-Deployments durch die Integration von Consul Connect mit Vault Agent Injector und behalten Sie das gleiche Niveau an Service-Mesh-Sicherheit und operativer Konsistenz in Ihrer gesamten Infrastruktur bei.
Sie interessieren sich für unsere Trainings oder haben einfach eine Frage, die beantwortet werden muss? Sie können uns jederzeit kontaktieren! Wir werden unser Bestes tun, um alle Ihre Fragen zu beantworten.
Hier kontaktieren