У нас есть кластер контейнеров с режимом: автопилот, работающий в GKE.
В настоящее время мы получаем сообщения об ошибках в коротком окне при выполнении «сине-зеленого» развертывания от Jenkins.
Когда мы переключаем службу на новое развертывание, появляется окно менее 100 мс, которое вызывает следующую ошибку.
<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>
Я предполагаю, что это связано с тем, что один из модулей еще не запущен, но все еще начинает направлять трафик в развертывание.
Мы проверяем, что развертывание развернуто после создания развертывания таким образом.
С плагином Jenkins: https://github.com/jenkinsci/google-kubernetes-engine-plugin
У нас есть Верифидеплойментс атрибут установлен на истинный.
шаг([
$класс: 'КубернетесEngineBuilder',
идентификатор проекта: env.PROJECT_ID,
имя_кластера: env.CLUSTER_NAME,
пространство имен: env.NAMESPACE,
местоположение: env.CLUSTER_LOCATION,
manifestPattern: './apps/app/deployments/green.yaml',
учетные данные: env.APP_CREDENTIALS_ID,
Веридеплойментс: правда
])
Мы также включили вторую проверку, чтобы действительно убедиться, что развертывание развернуто.
По-видимому, плагин Jenkins не делает этого очень надежно.
kubectl развертывание статуса развертывания app-deployment --namespace app-namespace --watch --timeout=5m
Мы также заметили, что может случиться так, что развертывание может привести к ошибке, и служба все равно будет создана на последующем шаге, что приведет к сбою приложения, но это еще один случай, который нам нужно выяснить, как решить, вероятно, связанный с плагином Jenkins.
Наш развертывание YAML выглядит так:
apiVersion: приложения/v1
вид: развертывание
метаданные:
имя: приложение-синий
пространство имен: приложение
ярлыки: {app.kubernetes.io/managed-by: graphite-jenkins-gke}
спецификация:
progressDeadlineSeconds: 600
реплики: 3
селектор:
matchLabels: {приложение: app-blue}
шаблон:
метаданные:
labels: {приложение: app-blue}
спецификация:
automountServiceAccountToken: правда
контейнеры:
изображение: eu.gcr.io/container-registry-project/app:latest
imagePullPolicy: всегда
имя: приложение
порты:
- {containerPort: 8080, имя: http, протокол: TCP}
живостьзонд:
httpПолучить:
путь: /здоровье
порт: 8080
начальные секунды задержки: 15
периодСекунды: 10
готовностьзонд:
httpПолучить:
дорожка: /
порт: 8080
начальные секунды задержки: 15
периодСекунды: 5
Ресурсы:
ограничения: {процессор: 500 м, эфемерное хранилище: 1Gi, память: 512Mi}
запросы: {процессор: 500 м, эфемерное хранилище: 1 ГБ, память: 512 МБ}
безопасностьКонтекст:
allowPrivilegeEscalation: ложь
возможности:
падение: [NET_RAW]
привилегированный: ложь
readOnlyRootFilesystem: ложь
рунаснонрут: ложь
политика перезапуска: всегда
schedulerName: планировщик по умолчанию
serviceAccount: приложение
serviceAccountName: приложение
Наш служба YAML выглядит так:
апиВерсия: v1
вид: сервис
метаданные:
имя: служба приложений
пространство имен: приложение
спецификация:
селектор:
приложение: синее приложение
порты:
- протокол: TCP
порт: 80
целевой порт: 8080
Мы просто переключаем селектор - приложение: в сервисе на приложение-синий или приложение-зеленый развертывание, чтобы переключиться на новое развертывание, но всегда получаем небольшое окно ошибок при этом, кто-нибудь знает, что мы делаешь неправильно?