我是 Kubernetes 新手,我的 nginx-ingress 路由器遇到了一個奇怪的問題。我的集群使用 Microk8s 在樹莓派上本地運行,我有 4 種不同的部署。集群使用入口路由器為 UI 和 API 路由資料包。
簡而言之,我的問題是我在從 UI 到后端的呼叫中收到間歇性的 502 錯誤。間歇性意味著每 3 個成功的 POST,就有 3 個不成功的 502 請求(不管這些請求被呼叫的速度有多快)。例如,

我已將以下 Ingress 配置應用于我的集群:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-router
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ui
port:
number: 80
- http:
paths:
- path: /lighting/.*
pathType: Prefix
backend:
service:
name: api
port:
number: 8000
UI和API的部署如下:
- 用戶界面:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ui
spec:
selector:
matchLabels:
app: iot-control-center
replicas: 3
template:
metadata:
labels:
app: iot-control-center
spec:
containers:
- name: ui-container
image: canadrian72/iot-control-center:ui
imagePullPolicy: Always
ports:
- containerPort: 80
- 介面:
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
selector:
matchLabels:
app: iot-control-center
replicas: 3
template:
metadata:
labels:
app: iot-control-center
spec:
containers:
- name: api-container
image: canadrian72/iot-control-center:api
imagePullPolicy: Always
ports:
- containerPort: 8000
- containerPort: 1883
在網上瀏覽后,我發現這個Reddit 帖子與我的問題最相似,雖然我不太確定從這里去哪里。我覺得這對于 pod 或入口控制器來說都是一個負載問題,所以我嘗試向每個 pod 添加 3 個副本(之前是 1 個),但這只會降低 502 錯誤的頻率。
任何形式的見解或指導將不勝感激!謝謝。
編輯:編輯添加它對于 200 和 502 回應不一定是 1 比 1,它是相當隨機的,但大約是 502 和 200 回應的均勻分布。還要補充一點,我已經使用 LoadBalancer (metallb) 配置了相同的設定,除了 CORS 之外,一切都像一個魅力。這就是我選擇 Ingress 處理 CORS 的原因。
uj5u.com熱心網友回復:
如果有人有類似的問題,請留下這個。我的問題是,在入口配置中,后端服務參考了部署本身,而不是 nodeport/clusterIP 服務。
相反,我為 UI 和 API 創建了兩個集群 IP 服務,如下所示:
- 用戶界面
apiVersion: v1
kind: Service
metadata:
name: ui-cluster-ip
spec:
type: ClusterIP
selector:
app: iot-control-center
svc: ui
ports:
- port: 80
- API
apiVersion: v1
kind: Service
metadata:
name: lighting-api-cluster-ip
spec:
type: ClusterIP
selector:
app: iot-control-center
svc: lighting-api
ports:
- port: 8000
然后從 ingress yaml 中參考這些服務如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-router
annotations:
kubernetes.io/ingress.class: public
nginx.ingress.kubernetes.io/configuration-snippet: |
more_set_headers "Access-Control-Allow-Origin: $http_origin";
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
nginx.ingress.kubernetes.io/cors-allow-methods: PUT, GET, POST,
OPTIONS, DELETE, PATCH
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ui-cluster-ip
port:
number: 80
- http:
paths:
- path: /lighting/.*
pathType: Prefix
backend:
service:
name: lighting-api-cluster-ip
port:
number: 8000
我不確定為什么之前發布的配置會導致一些 503 回應和一些 200(在我看來應該都是 503),但無論如何這個解決方案都有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/476196.html
標籤:http Kubernetes nginx入口 microk8s
