Как заставить Google Cloud Run использовать IPv4 вместо IPv6 для контейнерного приложения - PullRequest
1 голос
/ 29 февраля 2020

Я только что создал сайт на базе NodeJS в Google Cloud с помощью службы Cloud Run.

Существует две записи DNS: A (IPv4) и AAAA (IPv6). Всякий раз, когда я захожу на сайт с помощью Chrome, мой Chrome выбирает IPv6-адрес, и NodeJS приложение терпит неудачу:

TypeError [ERR_INVALID_URL]: Invalid URL: http://2001:14ba:98ae:1700:****:****:****:****/
  at onParseError (internal/url.js:257:9)
  at new URL (internal/url.js:333:5)

Примечание. Я подверг цензуре адрес

Если я заставлю свой браузер использовать адрес IPv4, сайт будет работать нормально.

Есть ли способ заставить службу Cloud Run использовать IPv4 для контейнера / приложения? Я не против IPv6 на уровне client <-> Cloud Run.

My Cloud Run YAML выглядит так:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: xxx-dev-app-825af7f
  namespace: 'xxx'
  selfLink: /apis/serving.knative.dev/v1/namespaces/xxx/services/xxx-dev-app-825af7f
  uid: 2d787ef2-39a7-xxx-yyy-zzz
  resourceVersion: AAWfuzEBUYA
  generation: 5
  creationTimestamp: '2020-02-26T18:58:40.504717Z'
  labels:
    cloud.googleapis.com/location: europe-north1
  annotations:
    run.googleapis.com/client-name: gcloud
    serving.knative.dev/creator: pulumi@xxx.iam.gserviceaccount.com
    serving.knative.dev/lastModifier: xxx@cloudbuild.gserviceaccount.com
    client.knative.dev/user-image: gcr.io/xxx/app:4860b1e137457b0e42a1896d7b95e0348d8cd7e4
    run.googleapis.com/client-version: 279.0.0
spec:
  traffic:
  - percent: 100
    latestRevision: true
  template:
    metadata:
      name: xxx-dev-app-825af7f-00005-xoz
      annotations:
        run.googleapis.com/client-name: gcloud
        client.knative.dev/user-image: gcr.io/xxx/app:4860b1e137457b0e42a1896d7b95e0348d8cd7e4
        run.googleapis.com/client-version: 279.0.0
        autoscaling.knative.dev/maxScale: '1000'
    spec:
      timeoutSeconds: 900
      containerConcurrency: 80
      containers:
      - image: gcr.io/xxx/app:4860b1e137457b0e42a1896d7b95e0348d8cd7e4
        ports:
        - containerPort: 8080
        resources:
          limits:
            cpu: 1000m
            memory: 256Mi
          requests:
            cpu: 200m
            memory: 64Mi
status:
  conditions:
  - type: Ready
    status: 'True'
    lastTransitionTime: '2020-02-29T18:33:33.424Z'
  - type: ConfigurationsReady
    status: 'True'
    lastTransitionTime: '2020-02-29T18:33:28.264Z'
  - type: RoutesReady
    status: 'True'
    lastTransitionTime: '2020-02-29T18:33:33.424Z'
  observedGeneration: 5
  traffic:
  - revisionName: xxx-dev-app-825af7f-00005-xoz
    percent: 100
    latestRevision: true
  latestReadyRevisionName: xxx-dev-app-825af7f-00005-xoz
  latestCreatedRevisionName: xxx-dev-app-825af7f-00005-xoz
  address:
    url: https://xxx.run.app
  url: https://xxx.run.app

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Для соединений между Cloud Run <=> пользовательским браузером: В настоящее время невозможно отключить стек IPv6.

(Как сказал Гийом, предстоящая поддержка настраиваемого Cloud HTTPS Load Balancer решит проблему Ваша проблема - на самом деле IPv4 является значением по умолчанию для GCLB, и вам явно необходимо настроить адрес IPv6, если вы хотите IPv6 для своего GCLB).

Для соединений между Cloud Run Service <=> Cloud Запустите службу: Вы должны полностью контролировать, к какому IP-адресу вы подключаетесь, на стороне клиента.

Например, на стороне клиента,

1 голос
/ 29 февраля 2020

AFAIK, IPv6 поддерживается только на глобальном балансировщике нагрузки. Этот балансировщик нагрузки проксировал соединение и преобразовал его в IPv4 для внутреннего доступа в Google Network. Таким образом, прямой доступ к Cloud Run с IPv6 кажется невозможным.

Однако, что-то происходит, особенно в отношении балансировки нагрузки, и это может решить вашу проблему. Возможно, анонсы на Cloud Next в апреле. Оставайтесь с нами!

...