feat: Add Kubernetes deployment documentation and HashiCorp Vault installation with TLS configuration

- Add README.md with architecture overview covering api-server (3 replicas), charging-engine (2 replicas), packet-gateway (2 replicas), web-dashboard (2 replicas), postgres, redis, monitoring stack (Prometheus, Grafana, InfluxDB, Alertmanager)
- Add prerequisites section with kubectl/Docker/Helm requirements, Kubernetes 1.25+, 4 CPU/8GB RAM minimum, 50GB+ storage
- Add quick start guide with deployment
This commit is contained in:
nutcas3
2026-04-17 17:26:22 +03:00
parent a0c862a1a4
commit f071605a47
3 changed files with 789 additions and 0 deletions
+198
View File
@@ -0,0 +1,198 @@
apiVersion: v1
kind: Namespace
metadata:
name: vault
labels:
app.kubernetes.io/name: vault
app.kubernetes.io/component: secrets
app.kubernetes.io/part-of: telecom-platform
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: vault
namespace: vault
labels:
app.kubernetes.io/name: vault
app.kubernetes.io/component: secrets
app.kubernetes.io/part-of: telecom-platform
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: vault
app.kubernetes.io/component: secrets
template:
metadata:
labels:
app.kubernetes.io/name: vault
app.kubernetes.io/component: secrets
spec:
containers:
- name: vault
image: hashicorp/vault:1.14.0
ports:
- containerPort: 8200
name: vault
- containerPort: 8201
name: cluster
env:
- name: VAULT_ADDR
value: "http://localhost:8200"
- name: VAULT_CLUSTER_ADDR
value: "http://localhost:8201"
- name: VAULT_LOCAL_CONFIG
valueFrom:
configMapKeyRef:
name: vault-config
key: vault.hcl
- name: VAULT_LOCAL_CONFIG_SKIP_BACKEND_CONFIG
value: "true"
- name: VAULT_SKIP_VERIFY
value: "true"
- name: SKIP_CHOWN
value: "true"
- name: VAULT_CACERT
value: "/vault/tls/ca.crt"
- name: VAULT_TLSCERT
value: "/vault/tls/server.crt"
- name: VAULT_TLSKEY
value: "/vault/tls/server.key"
command:
- vault
- server
- -config=/vault/config/vault.hcl
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
securityContext:
capabilities:
add:
- IPC_LOCK
volumeMounts:
- name: vault-config
mountPath: /vault/config
- name: vault-tls
mountPath: /vault/tls
livenessProbe:
httpGet:
path: /v1/sys/health
port: vault
initialDelaySeconds: 60
periodSeconds: 10
readinessProbe:
httpGet:
path: /v1/sys/health
port: vault
initialDelaySeconds: 30
periodSeconds: 5
volumes:
- name: vault-config
configMap:
name: vault-config
- name: vault-tls
emptyDir:
medium: Memory
---
apiVersion: v1
kind: Service
metadata:
name: vault
namespace: vault
labels:
app.kubernetes.io/name: vault
app.kubernetes.io/component: secrets
app.kubernetes.io/part-of: telecom-platform
spec:
ports:
- port: 8200
name: vault
targetPort: 8200
- port: 8201
name: cluster
targetPort: 8201
selector:
app.kubernetes.io/name: vault
app.kubernetes.io/component: secrets
type: ClusterIP
---
apiVersion: v1
kind: ConfigMap
metadata:
name: vault-config
namespace: vault
labels:
app.kubernetes.io/name: vault
app.kubernetes.io/component: secrets
app.kubernetes.io/part-of: telecom-platform
data:
vault.hcl: |
ui = true
listener "tcp" {
address = "0.0.0.0:8200"
cluster_address = "0.0.0.0:8201"
tls_disable = 1
}
storage "consul" {
address = "consul:8500"
path = "vault/"
}
api_addr = "http://vault:8200"
cluster_addr = "http://vault:8201"
default_lease_ttl = "168h"
max_lease_ttl = "720h"
disable_mlock = true
telemetry {
prometheus_retention_time = "24h"
disable_hostname = true
}
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: vault
namespace: vault
labels:
app.kubernetes.io/name: vault
app.kubernetes.io/component: secrets
app.kubernetes.io/part-of: telecom-platform
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: vault
labels:
app.kubernetes.io/name: vault
app.kubernetes.io/component: secrets
app.kubernetes.io/part-of: telecom-platform
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: vault
namespace: vault
---
apiVersion: v1
kind: Secret
metadata:
name: vault-token
namespace: vault
labels:
app.kubernetes.io/name: vault
app.kubernetes.io/component: secrets
app.kubernetes.io/part-of: telecom-platform
type: Opaque
data:
token: cm9vdA== # root
+182
View File
@@ -0,0 +1,182 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: vault-secrets-config
namespace: vault
labels:
app.kubernetes.io/name: vault
app.kubernetes.io/component: secrets
app.kubernetes.io/part-of: telecom-platform
data:
init-secrets.sh: |
#!/bin/sh
# Wait for Vault to be ready
until vault status; do
echo "Waiting for Vault to be ready..."
sleep 2
done
# Initialize Vault
vault operator init -key-shares=5 -key-threshold=3 > /tmp/vault-init.txt
# Unseal Vault (in production, this should be done manually)
VAULT_TOKEN=$(grep 'Initial Root Token:' /tmp/vault-init.txt | awk '{print $4}')
export VAULT_TOKEN
# Unseal with 3 keys
vault operator unseal $(grep 'Key 1:' /tmp/vault-init.txt | awk '{print $3}')
vault operator unseal $(grep 'Key 2:' /tmp/vault-init.txt | awk '{print $3}')
vault operator unseal $(grep 'Key 3:' /tmp/vault-init.txt | awk '{print $3}')
# Enable auth methods
vault auth enable kubernetes
vault auth enable oidc
vault auth enable userpass
# Enable secrets engines
vault secrets enable kv-v2
vault secrets enable database
vault secrets enable transit
# Configure Kubernetes auth
vault write auth/kubernetes/config \
token_reviewer_jwt="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
kubernetes_host="https://${KUBERNETES_PORT_443_TCP_ADDR}:443" \
kubernetes_ca_cert="$(cat /var/run/secrets/kubernetes.io.serviceaccount/ca.crt)"
# Create policies
vault policy write telecom-platform - <<EOF
path "kv/data/telecom-platform/*" {
capabilities = ["read", "list"]
}
path "database/creds/telecom-platform" {
capabilities = ["read"]
}
path "transit/encrypt/*" {
capabilities = ["update"]
}
path "transit/decrypt/*" {
capabilities = ["update"]
}
EOF
vault policy write telecom-platform-admin - <<EOF
path "kv/data/telecom-platform/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
path "database/creds/telecom-platform" {
capabilities = ["read"]
}
path "database/config/telecom-platform" {
capabilities = ["create", "read", "update", "delete"]
}
path "transit/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
EOF
# Configure database secrets engine
vault write database/config/telecom-platform \
plugin_name="postgresql-database-plugin" \
connection_url="postgresql://{{username}}:{{password}}@postgres:5432/telecom_platform" \
allowed_roles="telecom-platform" \
username="vault" \
password="vault_password"
vault write database/roles/telecom-platform \
db_name="telecom-platform" \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
default_ttl="1h" \
max_ttl="24h"
# Store telecom platform secrets
vault kv put kv/telecom-platform/database \
url="postgresql://postgres:prod123@postgres:5432/telecom_prod" \
max_connections=100 \
connection_timeout=30
vault kv put kv/telecom-platform/redis \
url="redis://redis:6379" \
max_connections=50 \
connection_timeout=10
vault kv put kv/telecom-platform/jwt \
secret="prod-jwt-secret-key" \
expiration="24h"
vault kv put kv/telecom-platform/encryption \
key="prod-encryption-key-256bits" \
algorithm="AES-256-GCM"
vault kv put kv/telecom-platform/payment \
stripe_secret_key="sk_live_..." \
paypal_client_id="..." \
paypal_client_secret="..."
# Create transit encryption key
vault write -f transit/keys/telecom-platform
# Create Kubernetes roles
vault write auth/kubernetes/role/telecom-platform \
bound_service_account_names=telecom-platform \
bound_service_account_namespaces=telecom-platform \
policies=telecom-platform \
ttl=24h
vault write auth/kubernetes/role/telecom-platform-admin \
bound_service_account_names=telecom-platform-admin \
bound_service_account_namespaces=telecom-platform \
policies=telecom-platform-admin \
ttl=8h
echo "Vault configuration completed successfully!"
---
apiVersion: batch/v1
kind: Job
metadata:
name: vault-init
namespace: vault
labels:
app.kubernetes.io/name: vault
app.kubernetes.io/component: secrets
app.kubernetes.io/part-of: telecom-platform
spec:
template:
metadata:
labels:
app.kubernetes.io/name: vault
app.kubernetes.io/component: secrets
spec:
serviceAccountName: vault
restartPolicy: OnFailure
containers:
- name: vault-init
image: hashicorp/vault:1.14.0
env:
- name: VAULT_ADDR
value: "http://vault:8200"
- name: VAULT_TOKEN
valueFrom:
secretKeyRef:
name: vault-token
key: token
- name: KUBERNETES_PORT_443_TCP_ADDR
value: "kubernetes.default.svc"
command:
- sh
- /scripts/init-secrets.sh
volumeMounts:
- name: scripts
mountPath: /scripts
volumes:
- name: scripts
configMap:
name: vault-secrets-config
defaultMode: 0755