Kubernetes nginx обновляет IP-адрес при изменении IP-адреса вышестоящей службы - PullRequest
0 голосов
/ 03 января 2019

Я использую nginx для прокси-запросов к нескольким службам Headless StatefulSets в кластере kubernetes.Проблема, с которой я столкнулся сейчас, заключается в том, что всякий раз, когда изменяется IP-адрес службы, nginx не разрешает конечную точку службы обновлять IP-адрес, но все еще использует устаревший кэшированный IP-адрес.Я пытался использовать переменную в proxy_pass в конфигурации nginx, но это безрезультатно.Как на моем локальном кластере, так и на AWS EKS.Вот фрагмент моей конфигурации nginx:

upstream svc-foo {
  server svc-foo:8080;
  keepalive 1024;
}
server {
  resolver 127.0.0.1 [::1]:5353 valid=10s;
  set $foo http://svc-foo;
  location /foo/ {
    proxy_pass $foo; 
    proxy_http_version 1.1;
  }
}

Я не ожидаю простоев при обновлении службы, что приводит к изменению IP-адреса службы.Любые идеи и советы приветствуются.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Лучший способ - использовать DNS sidecar на вашем модуле nginx, как показано ниже:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: issue-795
  name: nginx-config
data:
  nginx.conf: |-
    user  nginx;
    worker_processes  1;

    events {
      worker_connections  4096;  ## Default: 1024
    }

    http {
      server { # php/fastcgi
        listen 80;
        resolver 127.0.0.1:53 ipv6=off valid=10s;
        set $upstream http://backend:8080;
        location / {
              proxy_pass $upstream;
              proxy_http_version 1.1;
         }
      }
    }
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  namespace: issue-795
  name: proxy
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: proxy
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-config
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
      - name: dnsmasq
        image: "janeczku/go-dnsmasq:release-1.0.7"
        args:
          - --listen
          - "127.0.0.1:53"
          - --default-resolver
          - --append-search-domains
      volumes:
      - name: nginx-config
        configMap:
          name: nginx-config
---
apiVersion: v1
kind: Service
metadata:
  namespace: issue-795
  name: backend
spec:
  ports:
  - port: 80
    targetPort: 8080
  clusterIP: None
  selector:
    app: backend
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: backend
  namespace: issue-795
spec:
  serviceName: "backend"
  replicas: 2
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: echoserver
        image: gcr.io/google_containers/echoserver:1.4
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
0 голосов
/ 03 января 2019

Я бы рекомендовал использовать ресурс Ingress в Kubernetes с Nginx Ingress Controller .

Его цель - создать прокси-сервер внутри кластера Kubernetes, который перенаправляет трафик в службы ClusterIP.

Таким образом, у вас есть только один внешний ELB, который перенаправляет весь трафик в ваш кластер Kubernetes. Затем Ingress Controller перенаправляет трафик на разные сервисы.

Для более продвинутых входных контроллеров вы можете посмотреть Kong Ingress Controller .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...