我正在使用kubernetes。我的Ingress服务在谈论我的容器服务。我们公开了一个很好的webapi。但是我们不断收到502错误的网关错误。我是kubernetes的新手,我不知道如何调试该问题。服务器是连接到数据库的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
我的Ingress服务:
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
答案 0 :(得分:0)
我需要设置一个集群才能测试您的yml文件。
只是为了帮助您调试,请按照以下步骤操作:
1-使用kubectl日志my-pod-container-name获取my-pod容器的日志,确保一切正常
2-使用port-forward暴露您的容器并对其进行测试。
3-确保服务正常运行,将其类型更改为负载均衡器,以便可以从群集外部访问它。
如果这三件事都起作用,则您的入口配置存在问题。
我不确定是否详细解释了它,如果不清楚的话让我知道
答案 1 :(得分:0)
您的情况:
我认为您收到此502网关错误,因为您没有正确配置Ingress控制器。 请尝试使用已安装的Ingress进行操作,如下例所示。它将自动完成所有操作。
Nginx入口逐步:
1) Install helm
2)使用头盔安装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)概述为什么安装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 $退出
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。