我们已经在 AKS 集群上部署了后台应用程序,并且我们的应用程序使用了 nginx 入口控制器,但是该应用程序不稳定,它只能工作 2 分钟,然后长时间宕机(间歇性工作)。我们无法找到根本原因,甚至在 pod 日志中看不到任何错误。同一个应用程序在另一个环境中运行没有任何问题。
我们间歇性地看到 http 502 错误。
我们尝试重新部署nginx以及后台应用程序,但没有帮助。
像 AKS 集群上的 Backstage 应用程序遇到的间歇性问题可能很难诊断,尤其是当 Pod 日志中没有明确的错误消息时。这更多的是一个故障排除问题。但是,HTTP 502 错误表明网关或代理(在本例中为 Nginx)存在问题,无法从 Backstage 应用程序获得有效响应。
下面是使用 helm 图表在 AKS 上部署后台的示例
helm install backstage backstage/backstage -n backstage
如果您想采取手动部署路线,也可以这样做。
apiVersion: apps/v1
kind: Deployment
metadata:
name: backstage
namespace: backstage
spec:
replicas: 1
selector:
matchLabels:
app: backstage
template:
metadata:
labels:
app: backstage
spec:
containers:
- name: backstage
image: backstage:<backstageversion>
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 7007
envFrom:
- secretRef:
name: postgres-secrets
- secretRef:
name: backstage-secrets
对于生产部署,
image
引用通常是容器注册表上存储库的完整 URL,例如:arkocr.azurecr.io/backstage
现在,如果您想在本地主机上检查它:
kubectl port-forward --namespace=backstage svc/backstage 80:80
Forwarding from 127.0.0.1:80 -> 7007
但是为了这个例子,我将使用 helm
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install nginx-ingress ingress-nginx/ingress-nginx
然后创建一个 Ingress 资源,将流量路由到您的 Backstage 服务。用
kubectl apply -f yourfilename
保存
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: backstage-ingress
namespace: backstage
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: backstage
port:
number: 80
Nginx Ingress Controller安装成功后,会被分配一个外部IP,你的pods后台pods就起来了,你可以在浏览器上访问了
kubectl get svc -n backstage
现在谈到您的间歇性问题,如果您在 AKS 上运行此问题,请确保必要的防火墙规则已到位以允许流量到达入口控制器,并确保选中下面的标记
通过执行这些步骤,您应该能够确保 AKS 集群具备必要的防火墙规则,从而允许外部流量到达您的 Nginx 入口控制器。如果问题仍然存在,您需要检查日志
kubectl logs -n <namespace> -l app=nginx-ingress
检查 Backstage Pod 的资源使用情况(CPU、内存),看看是否存在资源耗尽而导致 Pod 无响应的情况。
参考文档: