1

我在 Kubernetes 中部署了一个在 nginx 上运行的应用程序,它是一个简单的静态index.html. 我定义了一个带有 url 的按钮http://backservice:8080/actionbackservice是一个支持 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 {
    }
}

backendservicenginx 应用程序位于相同的命名空间中。

4

3 回答 3

1

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

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

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

然后将您的前端代码更改为命中https://backend.example.com/action

于 2019-08-30T14:27:52.393 回答
0

我认为主要问题是backservice主机名,它只在 k8s 集群内解析。如果您想让它从集群外部访问,则应使用入口外部服务(LoadBalancer、NodePort)公开它。

于 2019-08-30T14:32:12.823 回答
0

您是否在 ingress deployemnt 上打开了端口 8080 ?

如果您的 kubernetes 在公共云上。它应该有一个 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
于 2019-09-01T13:19:30.587 回答