Балансировщик нагрузки 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.