- Added PgAdmin4 tool to the cluster setup.
This commit is contained in:
@@ -418,6 +418,51 @@ kubectl get ingress -n eveai-staging
|
||||
kubectl get certificates -n eveai-staging
|
||||
```
|
||||
|
||||
### Phase 7: Install PgAdmin Tool
|
||||
|
||||
#### Secret eveai-pgadmin-admin in Scaleway Secret Manager aanmaken (indien niet bestaat)
|
||||
|
||||
2 Keys:
|
||||
- `PGADMIN_DEFAULT_EMAIL`: E-mailadres voor de admin
|
||||
- `PGADMIN_DEFAULT_PASSWORD`: voor de admin
|
||||
|
||||
#### Secrets deployen
|
||||
|
||||
```bash
|
||||
kubectl apply -f scaleway/manifests/base/tools/pgadmin/externalsecrets.yaml
|
||||
|
||||
# Check
|
||||
kubectl get externalsecret -n tools
|
||||
kubectl get secret -n tools | grep pgadmin
|
||||
```
|
||||
|
||||
#### Helm chart toepassen
|
||||
|
||||
```bash
|
||||
helm repo add runix https://helm.runix.net
|
||||
helm repo update
|
||||
helm install pgadmin runix/pgadmin4 \
|
||||
-n tools \
|
||||
--create-namespace \
|
||||
-f scaleway/manifests/base/tools/pgadmin/values.yaml
|
||||
|
||||
# Check status
|
||||
kubectl get pods,svc -n tools
|
||||
kubectl logs -n tools deploy/pgadmin-pgadmin4 || true
|
||||
```
|
||||
|
||||
#### Port Forward, Local Access
|
||||
|
||||
```bash
|
||||
# Find the service name (often "pgadmin")
|
||||
kubectl -n tools get svc
|
||||
# Forward local port 8080 to service port 80
|
||||
kubectl -n tools port-forward svc/pgadmin-pgadmin4 8080:80
|
||||
# Browser: http://localhost:8080
|
||||
# Login with PGADMIN_DEFAULT_EMAIL / PGADMIN_DEFAULT_PASSWORD (from eveai-pgadmin-admin)
|
||||
```
|
||||
|
||||
|
||||
## Verification and Testing
|
||||
|
||||
### Check Infrastructure Status
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
### Kort antwoord
|
||||
- Ja, je kunt kubectl port-forward als een systemd service draaien op je Linux-machine.
|
||||
- Ja, je kunt eender welke lokale poort gebruiken (niet beperkt tot 8080), via het formaat LOCAL:REMOTE (bijv. 18080:80).
|
||||
- Ja, je kunt de lokale forward achter Nginx Proxy Manager (NPM) zetten. Let wel op extra beveiliging als je dit publiek maakt.
|
||||
|
||||
---
|
||||
|
||||
### 1) Port-forward als Linux service (systemd)
|
||||
Hiermee start de forward automatisch bij boot en herstart hij bij fouten.
|
||||
|
||||
#### Benodigd
|
||||
- Werkende kubeconfig voor jouw user (zodat `kubectl` verbinding kan maken met je cluster).
|
||||
- De juiste servicenaam (bijv. `pgadmin-pgadmin4`). Controleer met:
|
||||
- `kubectl -n tools get svc`
|
||||
|
||||
Onderstaande voorbeelden binden op localhost (127.0.0.1) voor veiligheid. Pas de servicenaam en poorten aan naar jouw situatie.
|
||||
|
||||
#### Stap 1: Wrapper-script
|
||||
Maak `/usr/local/bin/pf-pgadmin.sh`:
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Optioneel, als je kubeconfig niet in ~/.kube/config staat:
|
||||
# export KUBECONFIG=/home/<user>/.kube/config
|
||||
|
||||
NAMESPACE="tools"
|
||||
SERVICE="pgadmin-pgadmin4" # pas aan indien anders
|
||||
LOCAL_PORT="18080" # kies je eigen lokale poort
|
||||
REMOTE_PORT="80" # servicepoort in de cluster
|
||||
|
||||
# Bind alleen op localhost voor veiligheid
|
||||
exec kubectl -n "${NAMESPACE}" port-forward --address=127.0.0.1 "svc/${SERVICE}" "${LOCAL_PORT}:${REMOTE_PORT}"
|
||||
```
|
||||
Maak uitvoerbaar:
|
||||
```bash
|
||||
sudo chmod +x /usr/local/bin/pf-pgadmin.sh
|
||||
```
|
||||
|
||||
#### Stap 2: systemd unit
|
||||
Maak `/etc/systemd/system/pgadmin-portforward.service`:
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Kubernetes port-forward for pgAdmin (tools namespace)
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
User=<jouw-linux-user>
|
||||
Group=<jouw-linux-user>
|
||||
# Eventueel: Environment=KUBECONFIG=/home/<jouw-linux-user>/.kube/config
|
||||
ExecStart=/usr/local/bin/pf-pgadmin.sh
|
||||
Restart=always
|
||||
RestartSec=3
|
||||
KillSignal=SIGINT
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
Vervang `<jouw-linux-user>` door je gebruikersnaam.
|
||||
|
||||
Activeer en start:
|
||||
```bash
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable pgadmin-portforward
|
||||
sudo systemctl start pgadmin-portforward
|
||||
sudo systemctl status pgadmin-portforward
|
||||
```
|
||||
Logs volgen:
|
||||
```bash
|
||||
journalctl -u pgadmin-portforward -f
|
||||
```
|
||||
Hierna staat pgAdmin lokaal op http://127.0.0.1:18080.
|
||||
|
||||
Beveiligingstip: laat `--address=127.0.0.1` staan. Wil je LAN-toegang, overweeg dan `--address=0.0.0.0` maar beveilig met firewall/IP-allowlist op de host.
|
||||
|
||||
---
|
||||
|
||||
### 2) Andere lokale poort gebruiken
|
||||
Je kunt de lokale poort zelf kiezen met `LOCAL:REMOTE`:
|
||||
- Voorbeeld: 18080 lokaal naar 80 in de cluster:
|
||||
- `kubectl -n tools port-forward svc/pgadmin-pgadmin4 18080:80`
|
||||
- Je kunt meerdere forwards tegelijk draaien zolang elke lokale poort uniek is.
|
||||
|
||||
---
|
||||
|
||||
### 3) Beschikbaar maken via Nginx Proxy Manager (NPM)
|
||||
Ik ga uit van Nginx Proxy Manager (de reverse proxy UI). Als je Node Package Manager bedoelde, laat het weten.
|
||||
|
||||
Doel: NPM publiceert een hostnaam en reverse-proxy’t naar jouw lokale forward op 127.0.0.1:18080.
|
||||
|
||||
Voorwaarden:
|
||||
- De port-forward draait stabiel (bijv. via systemd op poort 18080).
|
||||
- NPM draait op dezelfde host (aanbevolen) of kan de host bereiken waar de forward draait.
|
||||
|
||||
Stappen in NPM:
|
||||
1) Login in NPM.
|
||||
2) Add Proxy Host:
|
||||
- Domain Names: bijv. `pgadmin.local.mijnlan` (LAN) of een publiek domein (alleen als strikt noodzakelijk).
|
||||
- Scheme: `http`
|
||||
- Forward Hostname/IP: `127.0.0.1` (als NPM op dezelfde host draait) of het LAN-IP van de host met de port-forward.
|
||||
- Forward Port: `18080`
|
||||
3) SSL:
|
||||
- LAN: vaak geen SSL nodig.
|
||||
- Publiek: vraag Let’s Encrypt aan in NPM, zet Force SSL/HTTP2/HSTS aan.
|
||||
4) Access List / Security:
|
||||
- Sterk aanbevolen: IP-allowlist, Basic Auth of SSO voor publieke toegang.
|
||||
|
||||
Belangrijke waarschuwing:
|
||||
- Een publieke NPM-proxy naar pgAdmin vergroot het aanvalsoppervlak. Gebruik sterke admin-credentials (heb je), overweeg extra Basic Auth/SSO, en houd pgAdmin up-to-date.
|
||||
|
||||
Alternatief voor publieke toegang:
|
||||
- Cloudflared/Zero Trust tunnel of inlets tunnel naar een subdomein met policies.
|
||||
- Of later een Kubernetes Ingress met dedicated host + TLS, zoals eerder besproken.
|
||||
|
||||
---
|
||||
|
||||
### Alternatieven en tips
|
||||
- SSH-tunnel: kan ook, maar kubectl port-forward is vaak het eenvoudigst (gebruikt de K8s API).
|
||||
- kubefwd: handig als je meerdere services tegelijk lokaal wilt resolven.
|
||||
- Teamtoegang: liever een VPN (Tailscale/WireGuard) dan publieke NPM. Bind de forward op 127.0.0.1 en laat teamleden via VPN op je host browsen.
|
||||
|
||||
---
|
||||
|
||||
### Troubleshooting
|
||||
- Niet-startende service: bekijk `journalctl -u pgadmin-portforward -f`. Vaak is kubeconfig-onbereikbaar de oorzaak; zet `Environment=KUBECONFIG=...` in de unit of export in het script.
|
||||
- Verkeerde servicenaam: check met `kubectl -n tools get svc` en pas aan in je script.
|
||||
- Poort bezet: kies een andere lokale poort (bijv. 18081).
|
||||
- NPM werkt niet: controleer of NPM dezelfde host is (dan 127.0.0.1 gebruiken), anders gebruik het LAN-IP; check firewall.
|
||||
|
||||
---
|
||||
|
||||
### Samenvatting
|
||||
- Service: ja, via systemd; voorbeeldscript en unit hierboven.
|
||||
- Andere poort: ja, stel de linkerzijde van LOCAL:REMOTE in (bijv. 18080:80).
|
||||
- NPM: ja, reverse proxy naar 127.0.0.1:18080; voeg extra beveiliging toe als je het publiek maakt.
|
||||
|
||||
Als je wilt, kan ik het script en de unit exact invullen met jouw servicenaam en gewenste poort. Stuur me de output van `kubectl -n tools get svc` en je Linux-gebruikersnaam.
|
||||
@@ -14,3 +14,12 @@ metadata:
|
||||
labels:
|
||||
environment: staging
|
||||
app: monitoring
|
||||
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: tools
|
||||
labels:
|
||||
environment: staging
|
||||
app: tools
|
||||
@@ -0,0 +1,19 @@
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ClusterSecretStore
|
||||
metadata:
|
||||
name: scaleway-cluster-secret-store
|
||||
spec:
|
||||
provider:
|
||||
scaleway:
|
||||
region: "fr-par"
|
||||
projectId: "ad7d2ed9-252b-4b2a-9f4c-daca3edc4c4b"
|
||||
accessKey:
|
||||
secretRef:
|
||||
name: scaleway-credentials
|
||||
namespace: eveai-staging
|
||||
key: access-key
|
||||
secretKey:
|
||||
secretRef:
|
||||
name: scaleway-credentials
|
||||
namespace: eveai-staging
|
||||
key: secret-key
|
||||
@@ -7,8 +7,8 @@ metadata:
|
||||
spec:
|
||||
refreshInterval: 300s
|
||||
secretStoreRef:
|
||||
name: scaleway-secret-store
|
||||
kind: SecretStore
|
||||
name: scaleway-cluster-secret-store
|
||||
kind: ClusterSecretStore
|
||||
target:
|
||||
name: eveai-secrets
|
||||
creationPolicy: Owner
|
||||
|
||||
57
scaleway/manifests/base/tools/pgadmin/externalsecrets.yaml
Normal file
57
scaleway/manifests/base/tools/pgadmin/externalsecrets.yaml
Normal file
@@ -0,0 +1,57 @@
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: pgadmin-admin
|
||||
namespace: tools
|
||||
spec:
|
||||
refreshInterval: 300s
|
||||
secretStoreRef:
|
||||
name: scaleway-cluster-secret-store
|
||||
kind: ClusterSecretStore
|
||||
target:
|
||||
name: pgadmin-admin
|
||||
creationPolicy: Owner
|
||||
data:
|
||||
- secretKey: PGADMIN_DEFAULT_EMAIL
|
||||
remoteRef:
|
||||
key: name:eveai-pgadmin-admin
|
||||
property: PGADMIN_DEFAULT_EMAIL
|
||||
- secretKey: PGADMIN_DEFAULT_PASSWORD
|
||||
remoteRef:
|
||||
key: name:eveai-pgadmin-admin
|
||||
property: PGADMIN_DEFAULT_PASSWORD
|
||||
---
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: pgadmin-db
|
||||
namespace: tools
|
||||
spec:
|
||||
refreshInterval: 300s
|
||||
secretStoreRef:
|
||||
name: scaleway-cluster-secret-store
|
||||
kind: ClusterSecretStore
|
||||
target:
|
||||
name: pgadmin-db
|
||||
creationPolicy: Owner
|
||||
data:
|
||||
- secretKey: DB_HOST
|
||||
remoteRef:
|
||||
key: name:eveai-postgresql
|
||||
property: DB_HOST
|
||||
- secretKey: DB_PORT
|
||||
remoteRef:
|
||||
key: name:eveai-postgresql
|
||||
property: DB_PORT
|
||||
- secretKey: DB_USER
|
||||
remoteRef:
|
||||
key: name:eveai-postgresql
|
||||
property: DB_USER
|
||||
- secretKey: DB_PASS
|
||||
remoteRef:
|
||||
key: name:eveai-postgresql
|
||||
property: DB_PASS
|
||||
- secretKey: DB_NAME
|
||||
remoteRef:
|
||||
key: name:eveai-postgresql
|
||||
property: DB_NAME
|
||||
45
scaleway/manifests/base/tools/pgadmin/values.yaml
Normal file
45
scaleway/manifests/base/tools/pgadmin/values.yaml
Normal file
@@ -0,0 +1,45 @@
|
||||
# values.yaml for runix/pgadmin4
|
||||
image:
|
||||
repository: dpage/pgadmin4
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
replicaCount: 1
|
||||
|
||||
resources:
|
||||
requests:
|
||||
cpu: 100m
|
||||
memory: 128Mi
|
||||
limits:
|
||||
cpu: 500m
|
||||
memory: 512Mi
|
||||
|
||||
persistence:
|
||||
enabled: true
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
size: 2Gi
|
||||
# Set your storageClass if needed (Scaleway CSI), leave null to use default
|
||||
storageClass: null
|
||||
|
||||
service:
|
||||
type: ClusterIP
|
||||
port: 80
|
||||
|
||||
# Use existing secret for admin password; admin email configured via env.email
|
||||
existingSecret: pgadmin-admin
|
||||
secretKeys:
|
||||
pgadminPasswordKey: PGADMIN_DEFAULT_PASSWORD
|
||||
|
||||
# Set admin email used by pgAdmin (not read from secret by this chart)
|
||||
env:
|
||||
email: pieter@askeveai.com
|
||||
|
||||
# No ingress: we access via kubectl port-forward
|
||||
ingress:
|
||||
enabled: false
|
||||
|
||||
# SecurityContext defaults are fine; can be tuned later
|
||||
securityContext:
|
||||
runAsUser: 5050
|
||||
fsGroup: 5050
|
||||
runAsNonRoot: true
|
||||
Reference in New Issue
Block a user