找到为什么我在kubernetes上遇到502 Bad gateway错误

问题描述 投票:0回答:2

我正在使用kubernetes。我有Ingress服务,它会说我的集装箱服务。我们已经曝光了一个很好用的webapi。但是我们不断收到502错误的网关错误。我是kubernetes的新手,我不知道如何调试这个问题。 Server是连接到数据库的nodejs服务器。配置有什么问题吗?

我的部署文件 -


apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-pod
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: my-pod
    spec:
      containers:
      - name: my-pod
        image: my-image
        ports:
        - name: "http"
          containerPort: 8086
        resources:
          limits:
            memory: 2048Mi
            cpu: 1020m
---
apiVersion: v1
kind: Service
metadata:
  name: my-pod-serv
spec:
  ports:
    - port: 80
      targetPort: "http"
  selector:
     app: my-pod

我的入口服务:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gateway
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: abc.test.com
    http:
      paths:
      - path: /abc
        backend:
          serviceName: my-pod-serv
          servicePort: 80
kubernetes
2个回答
0
投票

我需要设置一个集群来测试你的yml文件。

只是为了帮助您调试,请按照以下步骤操作:

1-使用kubectl logs my-pod-container-name获取my-pod容器的日志,确保一切正常

2-使用port-forward暴露容器并进行测试。

3-确保服务正常运行,将其类型更改为负载均衡器,以便您可以从群集外部访问它。

如果这三件事情有效,那么您的入口配置就会出现问题。

我不确定我是否以详细的方式解释了它,如果有什么不清楚,请告诉我


0
投票

在你的情况下:

我认为您得到此502网关错误,因为您没有正确配置Ingress控制器。请尝试使用已安装的Ingress执行此操作,如下例所示。它将自动完成所有操作。

Nginx Ingress一步一步:

1)Install helm

2)使用helm安装nginx控制器

$ helm install stable/nginx-ingress --name nginx-ingress

它将创建2个服务。您可以通过获取他们的详细信息

$ kubectl get svc
NAME                            TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE
kubernetes                      ClusterIP      10.39.240.1     <none>          443/TCP                      29d
nginx-ingress-controller        LoadBalancer   10.39.243.140   35.X.X.15   80:32324/TCP,443:31425/TCP       19m
nginx-ingress-default-backend   ClusterIP      10.39.252.175   <none>          80/TCP                       19m

nginx-ingress-controller - 简而言之,它正在处理对Ingress和指挥的请求

nginx-ingress-default-backend - 简而言之,默认后端是一个服务,它处理所有URL路径和主机nginx控制器不理解

3)创建2个部署(或使用你的部署)

$ kubectl run my-pod --image=nginx
deployment.apps/my-pod created

$ kubectl run nginx1 --image=nginx
deployment.apps/nginx1 created

4)连接其中一个吊舱

$ kubectl exec -ti my-pod-675799d7b-95gph bash

并在输出中添加额外的行以查看稍后我们将尝试连接哪一行。

$ echo "HELLO THIS IS INGRESS TEST" >> /usr/share/nginx/html/index.html 
$ exit

5)暴露部署。

$ kubectl expose deploy nginx1 --port 80
service/nginx1 exposed
$ kubectl expose deploy my-pod --port 80
service/my-pod exposed

这将自动创建服务,看起来像

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-pod
  name: my-pod
  selfLink: /api/v1/namespaces/default/services/my-pod
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: my-pod
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

6)现在是创建Ingress.yaml并部署它的时候了。需要指定入口中的每个规则。我在这里有2项服务。每个服务规范在规则参数下以-host开头。

Ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: two-svc-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: my.pod.svc
    http:
      paths:
      - path: /pod
        backend:
          serviceName: my-pod
          servicePort: 80
  - host: nginx.test.svc
    http:
      paths:
      - path: /abc
        backend:
          serviceName: nginx1
          servicePort: 80

$ kubectl apply -f Ingress.yaml
ingress.extensions/two-svc-ingress created

7)您可以检查Ingress和主机

$ kubectl get ingress
NAME              HOSTS                       ADDRESS        PORTS     AGE
two-svc-ingress   my.pod.svc,nginx.test.svc   35.228.230.6   80        57m

8)Eplanation为什么我安装了Ingress。

连接到入口控制器盒

$ kubectl exec -ti nginx-ingress-controller-76bf4c745c-prp8h bash
www-data@nginx-ingress-controller-76bf4c745c-prp8h:/etc/nginx$ cat /etc/nginx/nginx.conf

因为我之前已经安装了nginx ingress,所以在部署Ingress.yaml之后,nginx-ingress-controller发现了更改并自动添加了必要的代码。在此文件中,您应该能够找到两个服务的完整配置。我不会复制配置,只会复制标题。

启动服务器my.pod.svc

启动服务器nginx.test.svc

www-data @ nginx-ingress-controller-76bf4c745c-prp8h:/ etc / nginx $ exit

9)测试

$ kubectl get svc to get your nginx-ingress-controller external IP
$ curl -H "HOST: my.pod.svc" http://35.X.X.15/
default backend - 404

$ curl -H "HOST: my.pod.svc" http://35.X.X.15/pod
<!DOCTYPE html>
...
</html>
HELLO THIS IS INGRESS TEST

请记住,Ingress需要与服务相同的名称空间。如果您在许多名称空间中有一些服务,则需要为每个名称空间创建Ingress。

© www.soinside.com 2019 - 2024. All rights reserved.