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.

View as Markdown

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 Accesul la clusterul țintă
  • O bază de date PostgreSQL accesibilă din cluster
  • S3 sau S3 compatibil testat
  • Un controler de intrare și un certificat TLS
  • 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, and pg_stat_statements pe PostgreSQL 15 și mai noi, faceți rolul platformei proprietarul public schema before first startup:

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

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

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

    Replace 0.0.0 cu o versiune de diagramă disponibilă. Nu vă bazați pe o diagramă neînchisă în producție.

  2. Generate application secrets

    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
    

    Acest exemplu presupune un controler de intrare existent. Dacă doriți în mod intenționat ca graficul să instaleze HAProxy Ingress, activați haproxy-ingress and set ingress.className to haproxy.

  4. Create secret values

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

    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>"
    
    chmod 600 values-secrets.yaml oauth2-signing-key.pem
    
  5. Răspundeți și verificați manifestul

    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

    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

    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 și TLS sunt gata, verificați punctul public:

    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. Configurarea TLS depinde de controlerul dvs. de intrare și de sistemul de certificate.

  • numai serviciile publice destinate primesc adrese externe;
  • HTTP redirects to HTTPS;
  • the configured hostname matches probo.baseUrl;
  • probo.cors.allowedOrigins contains the complete HTTPS origin;
  • Cookie-urile sunt direcționate către domeniul dorit.

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

The chart mounts /data from emptyDir by default. Enabling persistence creează sau asamblează un PVC, iar exemplul de producție utilizează ReadWriteOnceEste posibil ca mai multe poduri programate pe noduri diferite să nu fie în măsură să asambleze această afirmație.Testează graficul cu clasa de stocare și modelul de eșec înainte de a rula mai multe copii.

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.

If your provider requires a custom CA, set postgresql.caBundle sau montarea unui certificat și setarea postgresql.caBundlePath. Do not disable database certificate verification to work around a CA error.

For AWS S3, leave s3.endpoint empty and s3.usePathStyle Alți furnizori pot necesita un endpoint și o adresare personalizată î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 metrice pe port 8081Dacă este instalat Prometheus Operator, activaţi 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.

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:

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.

helm history probo --namespace probo
helm rollback probo REVISION --namespace probo --wait --timeout 10m
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.

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

Confirm that ingress.className numeşte un controler instalat şi inspectează jurnalele acelui controler. Dacă graficul a instalat în mod neaşteptat HAProxy, revizuieşte haproxy-ingress.enabled value.

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. ReadWriteOnce Volumul nu este un design portabil de stocare partajat pentru replicile pe mai multe noduri.

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

Ultima actualizare: