为什么来自 nginx 上应用 运行 的传出请求未命中 Kubernetes 服务

Why outgoing requests from app running on nginx not hit Kubernetes services

我在 Kubernetes 的 nginx 上部署了一个应用程序 运行,它是一个简单的静态 index.html。我用 url 到 http://backservice:8080/action 定义了一个按钮。 backservice 是支持 Spring 应用程序的 k8s 服务。

问题是,当我点击那个按钮时,没有任何反应。 backservice 未命中。我预计会出现 CORS 错误,但似乎 nginx 会阻止所有出站请求。我不想将后端服务代理到 nginx。

Nginx 配置:

user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

服务器配置:

server {
    listen       80;
    server_name  _;
    root /usr/share/nginx/html; 

    location / {
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }

    location /svg/ {
    }

    location /assets/ {
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    }
}

backendservice 与 nginx 应用程序在同一个命名空间中。

您的静态应用程序在您的浏览器中运行。浏览器不是 k8s 集群的一部分,因此它不知道 URL http://backservice:8080/action

使用 Ingress 公开您的后端服务。例如https://backend.example.com/action

https://kubernetes.io/docs/concepts/services-networking/ingress/ (您也可以使用 Loadbalancer 类型公开,但我建议使用 Ingress)

然后更改您的前端代码以点击 https://backend.example.com/action

我认为主要问题是 backservice 是仅在 k8s 集群内部解析的主机名。如果你想让它从集群外部访问,它应该使用 ingress or external services (LoadBalancer, NodePort) 公开。

您是否在入口部署上打开了端口 8080?

如果您的 kubernetes 在 public 云上。它应该有一个由 Ingress nginx 使用的负载均衡器。您可以在 kubernetes 命名空间 kube-system

中的入口部署服务中配置该负载均衡器

这是一个示例,如果您希望允许入口 nginx 上的端口 8080 访问服务的端口 80:

kgs nginx-ingress-lb -n kube-system -o yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress-lb
  namespace: kube-system
spec:
  clusterIP: 172.21.12.220
  externalTrafficPolicy: Cluster
  ports:
  - name: nginx-ingress-lb-443-443
    nodePort: 32672
    port: 443
    protocol: TCP
    targetPort: 443
  - name: nginx-ingress-lb-8080-80
    nodePort: 32026
    port: 8080
    protocol: TCP
    targetPort: 80