feat: add Redpanda and wp-deploy-coordinator to Legion

- Redpanda single-node StatefulSet in platform namespace
- wp-coordinator deployment consuming wp.deploy topic
- RBAC for coordinator to exec into harmonic-wordpress pods
- R2 credentials via ExternalSecret (no SSH key needed on coordinator)
- Sites config as ConfigMap — add new WP sites without code changes
This commit is contained in:
Will Anderson
2026-04-04 10:18:09 -05:00
parent 6a9db2094e
commit 82ed0eb10b
9 changed files with 309 additions and 0 deletions
+20
View File
@@ -0,0 +1,20 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: redpanda
namespace: argocd
spec:
project: default
source:
repoURL: https://git.neuralplatform.ai/will/infrastructure.git
targetRevision: main
path: servers/legion/k8s/redpanda
destination:
server: https://kubernetes.default.svc
namespace: platform
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
+20
View File
@@ -0,0 +1,20 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: wp-coordinator
namespace: argocd
spec:
project: default
source:
repoURL: https://git.neuralplatform.ai/will/infrastructure.git
targetRevision: main
path: servers/legion/k8s/wp-coordinator
destination:
server: https://kubernetes.default.svc
namespace: platform
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
@@ -0,0 +1,81 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redpanda
namespace: platform
labels:
app: redpanda
spec:
replicas: 1
selector:
matchLabels:
app: redpanda
serviceName: redpanda
template:
metadata:
labels:
app: redpanda
spec:
containers:
- name: redpanda
image: docker.redpanda.com/redpandadata/redpanda:latest
command:
- rpk
- redpanda
- start
- --smp=1
- --memory=512M
- --reserve-memory=0M
- --overprovisioned
- --kafka-addr=PLAINTEXT://0.0.0.0:9092
- --advertise-kafka-addr=PLAINTEXT://redpanda.platform.svc.cluster.local:9092
- --pandaproxy-addr=0.0.0.0:8082
- --advertise-pandaproxy-addr=redpanda.platform.svc.cluster.local:8082
- --set=redpanda.enable_transactions=true
- --set=redpanda.enable_idempotence=true
ports:
- name: kafka
containerPort: 9092
- name: admin
containerPort: 9644
- name: proxy
containerPort: 8082
volumeMounts:
- name: data
mountPath: /var/lib/redpanda/data
resources:
requests:
memory: 512Mi
cpu: 100m
limits:
memory: 1Gi
cpu: 500m
readinessProbe:
exec:
command: ["rpk", "cluster", "info", "--brokers=localhost:9092"]
initialDelaySeconds: 20
periodSeconds: 10
volumes:
- name: data
persistentVolumeClaim:
claimName: redpanda-data
---
apiVersion: v1
kind: Service
metadata:
name: redpanda
namespace: platform
spec:
selector:
app: redpanda
ports:
- name: kafka
port: 9092
targetPort: 9092
- name: admin
port: 9644
targetPort: 9644
- name: proxy
port: 8082
targetPort: 8082
type: ClusterIP
+12
View File
@@ -0,0 +1,12 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redpanda-data
namespace: platform
spec:
storageClassName: local-path
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
@@ -0,0 +1,28 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: wp-coordinator-sites
namespace: platform
data:
sites.yaml: |
sites:
harmonic-wordpress:
namespace: harmonic-wordpress
wordpress_selector: app=wordpress
mysql_selector: app=mysql
mysql_db: wordpress
git_repo: https://git.neuralplatform.ai/harmonic-framework/harmonic-framework.com.git
themes_src_path: wp-content/themes
themes_dst_path: /var/www/html/wp-content/themes
dev_url: https://dev.harmonic-framework.com
smoke_test_url: https://dev.harmonic-framework.com
db_sources:
staging:
host: "159.65.222.142"
db_name: wordpress_hf_hf_staging
production:
host: "159.65.222.142"
db_name: wordpress_hf
url_map:
staging: https://staging.harmonic-framework.com
production: https://harmonic-framework.com
@@ -0,0 +1,64 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: wp-coordinator
namespace: platform
labels:
app: wp-coordinator
spec:
replicas: 1
selector:
matchLabels:
app: wp-coordinator
template:
metadata:
labels:
app: wp-coordinator
spec:
serviceAccountName: wp-coordinator
containers:
- name: wp-coordinator
image: registry.neuralplatform.ai/neural-platform/wp-deploy-coordinator:latest
imagePullPolicy: Always
env:
- name: REDPANDA_BROKERS
value: redpanda.platform.svc.cluster.local:9092
- name: DEPLOY_TOPIC
value: wp.deploy
- name: CONSUMER_GROUP
value: wp-coordinator
- name: GITEA_TOKEN
valueFrom:
secretKeyRef:
name: wp-coordinator-secrets
key: gitea_token
- name: R2_ENDPOINT
value: https://651161e0a3d321561b4c90b5bcd5f15b.r2.cloudflarestorage.com
- name: R2_ACCESS_KEY
valueFrom:
secretKeyRef:
name: wp-coordinator-secrets
key: r2_access_key
- name: R2_SECRET_KEY
valueFrom:
secretKeyRef:
name: wp-coordinator-secrets
key: r2_secret_key
- name: R2_BUCKET
value: wp-deploys
- name: SITES_CONFIG
value: /config/sites.yaml
volumeMounts:
- name: config
mountPath: /config
resources:
requests:
memory: 128Mi
cpu: 50m
limits:
memory: 256Mi
cpu: 200m
volumes:
- name: config
configMap:
name: wp-coordinator-sites
@@ -0,0 +1,26 @@
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: wp-coordinator-secrets
namespace: platform
spec:
refreshInterval: 1h
secretStoreRef:
name: vault
kind: ClusterSecretStore
target:
name: wp-coordinator-secrets
creationPolicy: Owner
data:
- secretKey: gitea_token
remoteRef:
key: secret/data/gitea
property: api_token
- secretKey: r2_access_key
remoteRef:
key: secret/data/r2
property: access_key_id
- secretKey: r2_secret_key
remoteRef:
key: secret/data/r2
property: secret_access_key
@@ -0,0 +1,25 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wp-coordinator
namespace: platform
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: traefik
tls:
- hosts:
- wp-deploy.neuralplatform.ai
secretName: wp-coordinator-tls
rules:
- host: wp-deploy.neuralplatform.ai
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: wp-coordinator
port:
number: 8000
@@ -0,0 +1,33 @@
apiVersion: v1
kind: ServiceAccount
metadata:
name: wp-coordinator
namespace: platform
---
# Allow wp-coordinator to exec into pods and list pods in harmonic-wordpress
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: wp-coordinator
namespace: harmonic-wordpress
rules:
- apiGroups: [""]
resources: [pods]
verbs: [get, list]
- apiGroups: [""]
resources: [pods/exec]
verbs: [create]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: wp-coordinator
namespace: harmonic-wordpress
subjects:
- kind: ServiceAccount
name: wp-coordinator
namespace: platform
roleRef:
kind: Role
name: wp-coordinator
apiGroup: rbac.authorization.k8s.io