为什么来自 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
我在 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