Sari la conținut

Kubernetes

Ghid pas cu pas pentru implementarea platformei pe Kubernetes cu diagrama Helm, stocarea externă PostgreSQL și S3, ingress, monitorizare și upgrade-uri.

Diagrama platformei Helm implementează aplicația platformei și Chrome fără cap. Pentru producție, conectați graficul la o bază de date externă PostgreSQL și la un spațiu de stocare a obiectelor compatibil cu S3, pe care echipa dvs. îl operează deja și îl face backup.

Utilizați Kubernetes atunci când echipa dvs. a stabilit deja practici pentru intrări, certificate, secrete, monitorizare și operațiuni de bază de date.

  • Kubernetes 1.23 or newer
  • Helm 3.8 or newer
  • kubectl acces la clusterul țintă
  • O bază de date PostgreSQL accesibilă din cluster
  • S3 sau S3 compatibil testat
  • Un controler de intrare și un certificatTLS
  • Un relay SMTP dacă doriți ca platforma să trimită e-mailuri

Rolul bazei de date trebuie să fie capabil să creeze sau să utilizeze citext, pgcrypto, unaccent și pg_stat_statements extensii. Pe PostgreSQL 15 și mai noi, faceți rolul platformei proprietarul schemei ___ZBT_I18N_RUNTIME_BLOCK_169__ înainte de prima pornire:

ALTER SCHEMA public OWNER TO probod;
GRANT ALL ON SCHEMA public TO probod;
  1. Choose and pin a chart version

    Diagrama este publicată la oci://artifact.probo.inc/probo/probo. Setați versiunea pe care ați testat-o:

    Terminal window
    export PROBO_CHART_VERSION="0.0.0"
    helm show chart oci://artifact.probo.inc/probo/probo \
    --version "$PROBO_CHART_VERSION"

    Înlocuiți 0.0.0 cu o versiune disponibilă a diagramei.

  2. Generate application secrets

    Terminal window
    umask 077
    openssl rand -base64 32
    openssl rand -base64 32
    openssl rand -base64 32
    openssl rand -base64 32
    openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 \
    -out oauth2-signing-key.pem

    Înregistrați cele patru valori generate separat ca cheia de criptare, secretul cookie-ului, pepperul de parolă și secretul tokenului de încredere.

  3. Create non-secret values

    Salvați următoarele ca values.yaml și înlocuiți exemplul de nume de gazdă și detalii despre servicii:

    replicaCount: 2
    haproxy-ingress:
    enabled: false
    ingress:
    enabled: true
    className: nginx
    annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    hosts:
    - host: probo.example.com
    paths:
    - path: /
    pathType: Prefix
    tls:
    - secretName: probo-tls
    hosts:
    - probo.example.com
    probo:
    baseUrl: probo.example.com
    cors:
    allowedOrigins:
    - https://probo.example.com
    auth:
    disableSignup: true
    cookieDomain: probo.example.com
    trustAuth:
    cookieDomain: probo.example.com
    mailer:
    senderName: Probo
    senderEmail: no-reply@example.com
    smtp:
    addr: smtp.example.com:587
    tlsRequired: true
    postgresql:
    enabled: false
    host: postgres.example.internal
    port: 5432
    database: probod
    username: probod
    seaweedfs:
    enabled: false
    s3:
    region: eu-west-1
    bucket: probo-production
    endpoint: ""
    usePathStyle: false
    chrome:
    enabled: true
    resources:
    requests:
    cpu: 500m
    memory: 1Gi
    limits:
    cpu: 2
    memory: 4Gi

    Dacă doriți în mod intenționat ca graficul să instaleze HAProxy Ingress, activați haproxy-ingress și setați ingress.className la haproxy.

  4. Create secret values

    Salvați următoarele ca values-secrets.yaml, completați fiecare localizator și păstrați fișierul în afara controlului versiunii:

    probo:
    encryptionKey: "<base64 encryption key>"
    auth:
    cookieSecret: "<base64 cookie secret>"
    passwordPepper: "<base64 password pepper>"
    trustAuth:
    tokenSecret: "<base64 trust-token secret>"
    mailer:
    smtp:
    user: "<SMTP username>"
    password: "<SMTP password>"
    postgresql:
    password: "<database password>"
    s3:
    accessKeyId: "<S3 access key>"
    secretAccessKey: "<S3 secret key>"
    Terminal window
    chmod 600 values-secrets.yaml oauth2-signing-key.pem
  5. Răspundeți și verificați manifestul

    Terminal window
    helm template probo oci://artifact.probo.inc/probo/probo \
    --version "$PROBO_CHART_VERSION" \
    --namespace probo \
    --values values.yaml \
    --values values-secrets.yaml \
    --set-file probo.oauth2.signingKey=oauth2-signing-key.pem \
    > rendered.yaml

    Verificați numele resurselor, clasa de intrare, stocarea, contextul de securitate și comportamentul de programare. rendered.yaml conține secrete; ștergeți-l în siguranță după revizuire și nu-l comiteți.

  6. Install the platform

    Terminal window
    kubectl create namespace probo
    helm install probo oci://artifact.probo.inc/probo/probo \
    --version "$PROBO_CHART_VERSION" \
    --namespace probo \
    --values values.yaml \
    --values values-secrets.yaml \
    --set-file probo.oauth2.signingKey=oauth2-signing-key.pem \
    --wait \
    --timeout 10m
  7. Verify the deployment

    Terminal window
    helm status probo --namespace probo
    kubectl get pods,service,ingress \
    --namespace probo \
    --selector app.kubernetes.io/instance=probo
    kubectl rollout status deployment/probo \
    --namespace probo \
    --timeout=10m
    kubectl logs deployment/probo \
    --namespace probo \
    --tail=100

    După ce DNS șiTLSsunt gata, verificați punctul public:

    Terminal window
    curl --fail https://probo.example.com/

    De asemenea, testați autentificarea, încărcarea fișierelor, generarea PDF și livrarea prin e-mail înainte de a invita utilizatorii.

Diagrama activează dependența HAProxy Ingress în mod implicit. dezactivați-o atunci când clusterul are deja un controler de intrare; în caz contrar, instalația poate crea un echilibrator de sarcină public neașteptat.

Diagrama direcționează intrarea către portul de back-office al platformei. ConfigurareaTLSdepinde de controlerul dvs. de intrare și de sistemul de certificate.

  • numai serviciile publice destinate primesc adrese externe;
  • HTTP redirects to HTTPS;
  • numele de gazdă configurat se potrivește probo.baseUrl;
  • probo.cors.allowedOrigins conține originea HTTPS completă;
  • Cookie-urile sunt direcționate către domeniul dorit.

Nu pretindeți o disponibilitate ridicată numai prin creșterea numărului replicaCount.

Diagrama montă /data de la emptyDir în mod implicit. Permiterea persistence creează sau montă un singur PVC, iar exemplul de producție utilizează ReadWriteOnce. Poduri multiple programate pe noduri diferite ar putea să nu poată monta această revendicare.

PostgreSQL și S3 rămân sistemele durabile de înregistrare. Backup ambele servicii la un punct de recuperare consecvent și de restaurare de testare în mod regulat.

Dimensiunea bazinului implicită este de 100 de conexiuni pe platformă pod. Contul pentru replică și actualizări de rulare atunci când setați limite de conexiune PostgreSQL. De exemplu, trei pods curente plus un pod de creștere pot solicita substanțial mai mult de 300 de conexiuni.

Dacă furnizorul dvs. necesită un CA particularizat, setați postgresql.caBundle sau montați un certificat și setați postgresql.caBundlePath.

PentruAWSS3, lăsați s3.endpoint gol și s3.usePathStyle fals. Alți furnizori pot necesita un endpoint personalizat și o adresare în stil de cale.

Testarea încărcării, descărcării, metadatelor obiectului și ștergerii împotriva furnizorului exact înainte de utilizarea în producție. Azure Blob din spatele unui proxy de compatibilitate S3 are limitări cunoscute privind compatibilitatea metadatelor și nu ar trebui tratată ca echivalent acceptat fără testare.

platforma expune metricile pe portul 8081. Dacă este instalat Prometheus Operator, activaţi graficul ServiceMonitor:

metrics:
serviceMonitor:
enabled: true
interval: 30s

Cel puțin, avertizați despre pods-uri indisponibile, cicluri de redeschidere, implementări nereușite, erori de stocare a bazelor de date și a obiectelor, expirarea certificatelor și conexiunile de bază de date epuizate.

Examinați notele de lansare a platformei și a diagramei, faceți backup PostgreSQL și S3 și testați versiunea țintă într-un mediu non-producție.

Terminal window
export PROBO_CHART_VERSION="0.0.0"
helm upgrade probo oci://artifact.probo.inc/probo/probo \
--version "$PROBO_CHART_VERSION" \
--namespace probo \
--values values.yaml \
--values values-secrets.yaml \
--set-file probo.oauth2.signingKey=oauth2-signing-key.pem \
--wait \
--timeout 10m

Migrările bazei de date se execută automat atunci când se pornește platforma. Urmăriți atât jurnalele de implementare, cât și cele ale aplicațiilor:

Terminal window
kubectl rollout status deployment/probo --namespace probo --timeout=10m
kubectl logs deployment/probo --namespace probo --tail=200

Dacă este necesar să reveniți la versiunea de aplicație, determinați mai întâi dacă migrarea bazei de date este compatibilă înapoi.

Terminal window
helm history probo --namespace probo
helm rollback probo REVISION --namespace probo --wait --timeout 10m
Terminal window
kubectl get pods --namespace probo
kubectl describe pod POD_NAME --namespace probo
kubectl logs POD_NAME --namespace probo --previous
kubectl get events --namespace probo --sort-by=.metadata.creationTimestamp

Cauzele comune sunt formate secrete nevalide, o cheie de semnătură OAuth lipsă, extensii de baze de date indisponibile, politici de rețea de baze de date și un punct final S3 inaccesibil.

Terminal window
kubectl describe ingress probo-http --namespace probo
kubectl get ingressclass

Confirmă că ingress.className numește un controler instalat și inspectează jurnalele acelui controler.

Terminal window
kubectl get pvc --namespace probo
kubectl describe pvc probo --namespace probo

Verificați modul de acces al volumului, clasa de stocare, zona de disponibilitate și evenimentele de programare a podurilor. Un singur volum ReadWriteOnce nu este un design de stocare partajat portabil pentru replicile pe mai multe noduri.

See the chart’s values.yaml şi a environment variable reference for additional configuration.

Ultima actualizare: