Балансировщик нагрузки GCP HTTP(S) игнорирует спецификацию GKE readinessProbe
Я уже видел этот вопрос; AFAIK Я делаю все в ответах там.
Используя GKE, я развернул входящий трафик на основе балансировщика нагрузки GCP HTTP(S) для кластера Kubernetes, содержащего два почти идентичных развертывания: производственные и разрабатываемые экземпляры одного и того же приложения.
Я установил выделенный порт для каждого шаблона модуля, который будет использоваться для проверки работоспособности балансировщиком нагрузки, чтобы на них не влияли перенаправления с корневого пути на основной порт HTTP. Однако проверки работоспособности постоянно терпят неудачу.
Из этих документов я добавилreadinessProbe
параметр для моих развертываний, который балансировщик нагрузки, похоже, полностью игнорирует.
Я проверил, что сервер включен :p-ready
(9292; выделенный порт для проверки работоспособности) работает правильно, используя следующее (в отдельных терминалах):
➜ kubectl port-forward deployment/d-an-server p-ready
➜ curl http://localhost:9292/ -D -
HTTP/1.1 200 OK
content-length: 0
date: Wed, 26 Feb 2020 01:21:55 GMT
Что я пропустил?
Несколько примечаний к приведенным ниже конфигам:
- В
${...}
нижеприведенные переменные заполняются сценарием сборки как часть развертывания. - Вторая услуга (
s-an-server-dev
) является почти точной копией первого (с его собственным развертыванием) только с-dev
суффиксы в именах и этикетках.
Развертывание
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
name: "d-an-server"
namespace: "default"
labels:
app: "a-an-server"
spec:
replicas: 1
selector:
matchLabels:
app: "a-an-server"
template:
metadata:
labels:
app: "a-an-server"
spec:
containers:
- name: "c-an-server-app"
image: "gcr.io/${PROJECT_ID}/an-server-app:${SHORT_SHA}"
ports:
- name: "p-http"
containerPort: 8080
- name: "p-ready"
containerPort: 9292
readinessProbe:
httpGet:
path: "/"
port: "p-ready"
initialDelaySeconds: 30
обслуживание
apiVersion: "v1"
kind: "Service"
metadata:
name: "s-an-server"
namespace: "default"
spec:
ports:
- port: 8080
targetPort: "p-http"
protocol: "TCP"
name: "sp-http"
selector:
app: "a-an-server"
type: "NodePort"
Ingress
apiVersion: "networking.k8s.io/v1beta1"
kind: "Ingress"
metadata:
name: "primary-ingress"
annotations:
kubernetes.io/ingress.global-static-ip-name: "primary-static-ipv4"
networking.gke.io/managed-certificates: "appname-production-cert,appname-development-cert"
spec:
rules:
- host: "appname.example.com"
http:
paths:
- backend:
serviceName: "s-an-server"
servicePort: "sp-http"
- host: "dev.appname.example.com"
http:
paths:
- backend:
serviceName: "s-an-server-dev"
servicePort: "sp-http-dev"
1 ответ
Я думаю, что здесь происходит вход GKE, который вообще не сообщает о порту 9292. Вы имеете в виду sp-http
на входе, который относится к порту 8080.
Вам необходимо убедиться в следующем:
1. Поле targetPort службы должно указывать на значение или имя containerPort порта модуля.
2. Зонд готовности должен быть выставлен на порт, соответствующий сервисному порту, указанному в Ingress.