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.
Requirements
Secțiune intitulată „Requirements”- Kubernetes 1.23 or newer
- Helm 3.8 or newer
kubectlacces 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;Prepare the deployment
Secțiune intitulată „Prepare the deployment”-
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.0cu o versiune disponibilă a diagramei. -
Generate application secrets
Terminal window umask 077openssl rand -base64 32openssl rand -base64 32openssl rand -base64 32openssl rand -base64 32openssl 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.
-
Create non-secret values
Salvați următoarele ca
values.yamlși înlocuiți exemplul de nume de gazdă și detalii despre servicii:replicaCount: 2haproxy-ingress:enabled: falseingress:enabled: trueclassName: nginxannotations:cert-manager.io/cluster-issuer: letsencrypt-prodhosts:- host: probo.example.compaths:- path: /pathType: Prefixtls:- secretName: probo-tlshosts:- probo.example.comprobo:baseUrl: probo.example.comcors:allowedOrigins:- https://probo.example.comauth:disableSignup: truecookieDomain: probo.example.comtrustAuth:cookieDomain: probo.example.commailer:senderName: ProbosenderEmail: no-reply@example.comsmtp:addr: smtp.example.com:587tlsRequired: truepostgresql:enabled: falsehost: postgres.example.internalport: 5432database: probodusername: probodseaweedfs:enabled: falses3:region: eu-west-1bucket: probo-productionendpoint: ""usePathStyle: falsechrome:enabled: trueresources:requests:cpu: 500mmemory: 1Gilimits:cpu: 2memory: 4GiDacă doriți în mod intenționat ca graficul să instaleze HAProxy Ingress, activați
haproxy-ingressși setațiingress.classNamelahaproxy. -
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 -
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.yamlVerificați numele resurselor, clasa de intrare, stocarea, contextul de securitate și comportamentul de programare.
rendered.yamlconține secrete; ștergeți-l în siguranță după revizuire și nu-l comiteți. -
Install the platform
Terminal window kubectl create namespace probohelm 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 -
Verify the deployment
Terminal window helm status probo --namespace probokubectl get pods,service,ingress \--namespace probo \--selector app.kubernetes.io/instance=probokubectl rollout status deployment/probo \--namespace probo \--timeout=10mkubectl logs deployment/probo \--namespace probo \--tail=100După 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.
Production decisions
Secțiune intitulată „Production decisions”Ingress and TLS
Secțiune intitulată „Ingress and TLS”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.allowedOriginsconține originea HTTPS completă;- Cookie-urile sunt direcționate către domeniul dorit.
Replicas and local storage
Secțiune intitulată „Replicas and local storage”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.
Database connections
Secțiune intitulată „Database connections”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.
S3 compatibility
Secțiune intitulată „S3 compatibility”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.
Monitoring
Secțiune intitulată „Monitoring”platforma expune metricile pe portul 8081. Dacă este instalat Prometheus Operator, activaţi graficul ServiceMonitor:
metrics: serviceMonitor: enabled: true interval: 30sCel 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.
Upgrade and rollback
Secțiune intitulată „Upgrade and rollback”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 10mMigră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=10mkubectl logs deployment/probo --namespace probo --tail=200Dacă 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 probohelm rollback probo REVISION --namespace probo --wait --timeout 10mTroubleshooting
Secțiune intitulată „Troubleshooting”Pods do not start
Secțiune intitulată „Pods do not start”kubectl get pods --namespace probokubectl describe pod POD_NAME --namespace probokubectl logs POD_NAME --namespace probo --previouskubectl get events --namespace probo --sort-by=.metadata.creationTimestampCauzele 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.
The ingress has no address
Secțiune intitulată „The ingress has no address”kubectl describe ingress probo-http --namespace probokubectl get ingressclassConfirmă că ingress.className numește un controler instalat și inspectează jurnalele acelui controler.
A rollout cannot mount /data
Secțiune intitulată „A rollout cannot mount /data”kubectl get pvc --namespace probokubectl describe pvc probo --namespace proboVerificaț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.