Avem un cluster de containere cu modul: Autopilot care rulează în GKE.
În prezent, primim erori într-o fereastră scurtă când efectuăm o implementare „albastru/verde” de la Jenkins.
Când trecem serviciul la noua implementare, există o fereastră sub 100 ms care va genera următoarea eroare.
<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>502 Server Error</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Server Error</h1>
<h2>The server encountered a temporary error and could not complete your request.<p>Please try again in 30 seconds.</h2>
<h2></h2>
</body></html>
Presupun că acest lucru se datorează faptului că unul dintre pod-uri nu a fost pornit încă, dar încă începe să direcționeze traficul către implementare.
Verificăm dacă implementarea este lansată după ce implementarea este creată astfel.
Cu pluginul Jenkins: https://github.com/jenkinsci/google-kubernetes-engine-plugin
Avem verifică implementările atribut setat la Adevărat.
Etapa([
$class: „KubernetesEngineBuilder”,
projectId: env.PROJECT_ID,
clusterName: env.CLUSTER_NAME,
spațiu de nume: env.NAMESPACE,
locație: env.CLUSTER_LOCATION,
manifestPattern: „./apps/app/deployments/green.yaml”,
credentialsId: env.APP_CREDENTIALS_ID,
verifyDeployments: adevărat
])
Am inclus și o a doua verificare pentru a verifica cu adevărat dacă implementarea este lansată.
Aparent, pluginul Jenkins nu pare să facă acest lucru în mod foarte fiabil.
starea lansării kubectl implementare app-deployment --namespace app-namespace --watch --timeout=5m
De asemenea, am observat că se poate întâmpla ca implementarea să poată eroa și să fie creat un serviciu oricum un pas ulterior, care va bloca aplicația, dar acesta este un alt caz pe care trebuie să ne dăm seama cum să rezolvăm, probabil legat de pluginul Jenkins.
Al nostru implementare YAML arata asa:
apiVersion: apps/v1
fel: Desfăşurare
metadate:
nume: aplicație-albastru
spațiu de nume: aplicație
etichete: {app.kubernetes.io/managed-by: graphite-jenkins-gke}
specificație:
progresDeadlineSecunde: 600
replici: 3
selector:
matchLabels: {app: app-blue}
șablon:
metadate:
etichete: {app: app-blue}
specificație:
automountServiceAccountToken: adevărat
containere:
imagine: eu.gcr.io/container-registry-project/app:latest
imagePullPolicy: Întotdeauna
nume: aplicație
porturi:
- {containerPort: 8080, nume: http, protocol: TCP}
livenessProbe:
httpGet:
cale: /sănătate
port: 8080
initialDelaySeconds: 15
perioadaSecunde: 10
ReadinessProbe:
httpGet:
cale: /
port: 8080
initialDelaySeconds: 15
perioadaSecunde: 5
resurse:
limite: {cpu: 500m, stocare efemeră: 1Gi, memorie: 512Mi}
solicitări: {cpu: 500m, efemer-storage: 1Gi, memorie: 512Mi}
securityContext:
allowPrivilegeEscalation: false
capacitati:
drop: [NET_RAW]
privilegiat: fals
readOnlyRootFilesystem: false
runAsNonRoot: false
restartPolicy: Întotdeauna
schedulerName: planificator implicit
serviceCont: app
serviceAccountName: app
Al nostru serviciu YAML arata asa:
apiVersion: v1
fel: Serviciu
metadate:
nume: serviciul de aplicație
spațiu de nume: aplicație
specificație:
selector:
aplicație: aplicație-albastru
porturi:
- protocol: TCP
port: 80
targetPort: 8080
Pur și simplu comutăm selectorul - aplicație: în serviciu, la implementarea aplicației-albastru sau a aplicației-verde pentru a trece la noua implementare, dar primim întotdeauna o mică fereastră de erori când facem acest lucru, oricine are idee ce suntem faci gresit?