首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Kubernetes nginx上行业务ip变更刷新IP地址

Kubernetes nginx上行业务ip变更刷新IP地址
EN

Stack Overflow用户
提问于 2019-01-03 17:40:15
回答 2查看 1.7K关注 0票数 2

我正在使用nginx代理请求到kubernetes集群中StatefulSets的多个Headless服务。我现在遇到的问题是,每当服务IP发生变化时,nginx不会将服务端点解析为更新后的IP地址,但仍然使用过期的缓存IP地址。我曾尝试在nginx配置中使用proxy_pass中的变量,但根本没有用。既在我的本地集群上,也在AWS EKS上部署。下面是我的nginx配置的一个片段:

代码语言:javascript
复制
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更改的停机时间。任何洞察力和建议都是值得感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-04 06:40:33

最好的方法是在nginx pod上使用DNS sidecar,如下所示:

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2019-01-03 17:51:03

我建议在Nginx Ingress Controller上使用Kubernetes上的Ingress资源。

它的全部目的是在您的Kubernetes集群中拥有一个代理,用于将流量重定向到ClusterIP服务。

因此,您只有一个外部ELB,它将所有流量重定向到Kubernetes集群。然后,入口控制器将流量重定向到不同的服务。

对于更高级的入口控制器,您可以查看Kong Ingress Controller

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54019648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档