我正在使用nginx代理请求到kubernetes集群中StatefulSets的多个Headless服务。我现在遇到的问题是,每当服务IP发生变化时,nginx不会将服务端点解析为更新后的IP地址,但仍然使用过期的缓存IP地址。我曾尝试在nginx配置中使用proxy_pass中的变量,但根本没有用。既在我的本地集群上,也在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更改的停机时间。任何洞察力和建议都是值得感谢的。
发布于 2019-01-04 06:40:33
最好的方法是在nginx pod上使用DNS sidecar,如下所示:
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
发布于 2019-01-03 17:51:03
我建议在Nginx Ingress Controller上使用Kubernetes上的Ingress资源。
它的全部目的是在您的Kubernetes集群中拥有一个代理,用于将流量重定向到ClusterIP服务。
因此,您只有一个外部ELB,它将所有流量重定向到Kubernetes集群。然后,入口控制器将流量重定向到不同的服务。
对于更高级的入口控制器,您可以查看Kong Ingress Controller。
https://stackoverflow.com/questions/54019648
复制相似问题