Kubernetes GKE上具有入口的服务路由
我们正在GKE(Google Kubernetes引擎)上的Kubernetes集群中运行多个服务,在配置入口路由时遇到问题 假设我们有Kubernetes GKE上具有入口的服务路由,kubernetes,google-kubernetes-engine,Kubernetes,Google Kubernetes Engine,我们正在GKE(Google Kubernetes引擎)上的Kubernetes集群中运行多个服务,在配置入口路由时遇到问题 假设我们有auth服务和user服务,并且希望通过以下URL访问它们:http://www.example.com/auth和http://www.example.com/user。对这些URL的所有请求都应重定向到正确的服务,并在内部路由(http://www.example.com/user/people->http://user-service/people) 以下
auth服务
和user服务
,并且希望通过以下URL访问它们:http://www.example.com/auth
和http://www.example.com/user
。对这些URL的所有请求都应重定向到正确的服务,并在内部路由(http://www.example.com/user/people
->http://user-service/people
)
以下是我们对身份验证服务的配置:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: api-auth
spec:
replicas: 1
template:
metadata:
labels:
app: api-auth
tier: backend
track: stable
spec:
containers:
- name: api-auth
image: "<our-image>"
ports:
- name: http
containerPort: 9000
livenessProbe:
httpGet:
path: /health
port: 9000
initialDelaySeconds: 180
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /health
port: 9000
initialDelaySeconds: 180
timeoutSeconds: 5
---
kind: Service
apiVersion: v1
metadata:
name: auth-service
labels:
app: api-auth
spec:
type: NodePort
selector:
app: api-auth
tier: backend
ports:
- port: 80
targetPort: 9000
apiVersion:apps/v1beta1
种类:部署
元数据:
名称:api auth
规格:
副本:1份
模板:
元数据:
标签:
应用程序:api验证
层:后端
赛道:稳定
规格:
容器:
-名称:api auth
图像:“
端口:
-名称:http
集装箱港口:9000
livenessProbe:
httpGet:
路径:/health
港口:9000
初始延迟秒数:180
timeoutSeconds:5
readinessProbe:
httpGet:
路径:/health
港口:9000
初始延迟秒数:180
timeoutSeconds:5
---
种类:服务
版本:v1
元数据:
名称:身份验证服务
标签:
应用程序:api验证
规格:
类型:节点端口
选择器:
应用程序:api验证
层:后端
端口:
-港口:80
目标港:9000
在内部,服务在端口9000上的Tomcat上运行,这部分工作正常
问题在于我们的入口配置:
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: auth-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: <our-static-api>
kubernetes.io/ingress.class: "gce"
labels:
app: api-auth
spec:
rules:
- http:
paths:
- path: /auth
backend:
serviceName: auth-service
servicePort: 80
- path: /auth/*
backend:
serviceName: auth-service
servicePort: 80
- path: /user
backend:
serviceName: user-service
servicePort: 80
- path: /user/*
backend:
serviceName: user-service
servicePort: 80
种类:入口
apiVersion:extensions/v1beta1
元数据:
名称:auth ingress
注释:
kubernetes.io/ingres.global-static-ip-name:
kubernetes.io/ingres.class:“gce”
标签:
应用程序:api验证
规格:
规则:
-http:
路径:
-路径:/auth
后端:
serviceName:auth服务
服务端口:80
-路径:/auth/*
后端:
serviceName:auth服务
服务端口:80
-路径:/user
后端:
服务名称:用户服务
服务端口:80
-路径:/user/*
后端:
服务名称:用户服务
服务端口:80
每当我以以下方式访问我们的静态api时(现在我们称之为example.com
):http://www.example.com/auth
,我得到502-坏网关。运行kubectl Descripte ingress
表示,我们的服务健康状况未知
我在想是什么导致了这种奇怪的行为。有人能告诉我正确的方向吗?你在Slack上提到的服务是Spring Boot应用程序。这可能与此无关,但您需要确保入口路径与Spring Boot应用程序的上下文匹配,即。E如果入口路径为
/user
,则必须使用服务器配置应用程序上下文。上下文路径=/user
。然后在http://user-service/user
您在Slack上提到的服务是Spring Boot应用程序。这可能与此无关,但您需要确保入口路径与Spring Boot应用程序的上下文匹配,即。E如果入口路径为/user
,则必须使用服务器配置应用程序上下文。上下文路径=/user
。然后在http://user-service/user
您的健康检查将生效。运行状况检查需要使用节点端口,因为请求来自负载平衡器。如果运行状况检查的目标是端口9000,则请求将无法通过,因为节点上的该端口未处于活动状态
确保LB运行状况检查的目标端口正确(在30000范围内),并且目标路径将响应200,否则您的运行状况检查将继续失败,并且您将继续收到502个错误。运行状况检查需要使用节点端口,因为请求来自负载平衡器。如果运行状况检查的目标是端口9000,则请求将无法通过,因为节点上的该端口未处于活动状态
确保LB运行状况检查的目标端口正确(在30000范围内),并且目标路径将响应200,否则您的运行状况检查将继续失败,您将继续收到502个错误我们已尝试添加上下文路径,但它没有做任何事。难道没有一种方法可以在不关心目标服务中的上下文路径的情况下路由请求吗?我认为没有。我们完全按照我所描述的那样做,而且很有效。我们已经尝试添加上下文路径,但它没有做任何事情。难道没有一种方法可以在不关心目标服务中的上下文路径的情况下路由请求吗?我认为没有。我们完全按照我所描述的那样做,它可以工作。您确定/health path返回200状态代码吗?
kubectl get pods
表示它们已经准备好了您确定/health path返回200状态代码吗?kubectl get pods
表示它们已经准备好了部署,所以豆荚很好。查询kubectl get pods
会产生健康的结果。服务是否应该有其他特殊的活跃度/就绪度设置?您不需要准备,但GCP将根据就绪度检查为LB创建健康检查。转到网络服务>负载平衡,您将看到基于入口创建的L7LB(默认名称约定为k8s um-[NAMESPACE]-[ingress#u name]-[ingress############)。展开它并查找“健康检查”。单击链接,确保“端口”字段与您的节点端口匹配。我不确定端口和NodePort是否必须匹配(端口公开集群中的服务,NodePort用于ou)