当前位置: 首页 > 知识库问答 >
问题:

gke入口无法将流量路由到服务

司空胤
2023-03-14

我正在测试gke入口以将流量路由到两个不同的服务。我的部署包括一个基本的Web容器,它部署了一个默认的蓝色网页和一个绿色网页。我能够得到响应本质上,“/”适用于蓝色或绿色部署。但是当我转到超文本传输协议:///绿色时,我得到了404响应。我已经用“/”作为绿色部署进行了测试,它显示了一个绿色网页。但是如果我转到超文本传输协议:///蓝色,它会导致404响应,

我已经通过将负载平衡器直接连接到容器上来验证容器是否正常工作。我正在学习如何在gke中指导设置类似的环境。GKE入门指南

关于我所缺少的任何帮助都将极大地帮助我更好地了解正在发生的事情以及为什么我的gke负载平衡器无法路由流量。

绿色部署文件

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: myapp-green
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      version: green
  template:
    metadata:
      name: myapp
      labels:
        app: myapp
        version: green
    spec:
      containers:
        - name: myapp
          image: gcr.io/ultra-welder-300122/myapp:green
          imagePullPolicy: Always
          resources:
            requests:
              cpu: "100m"
              memory: "100Mi"
          ports:
          - containerPort: 8080

蓝色部署文件

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: myapp-blue
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      version: blue
  template:
    metadata:
      name: myapp
      labels:
        app: myapp
        version: blue
    spec:
      containers:
        - name: myapp
          image: gcr.io/ultra-welder-300122/myapp:blue
          imagePullPolicy: Always
          resources:
            requests:
              cpu: "100m"
              memory: "100Mi"
          ports:
          - containerPort: 8888

我的服务yaml

apiVersion: v1
kind: Service
metadata: 
  name: myapp-blue-service
  labels:
    app: myapp
    version: blue
spec:
  type: NodePort
  selector:
    app: myapp
    version: blue
  ports: 
  - protocol: TCP
    port: 80
    targetPort: 8888
---
apiVersion: v1
kind: Service
metadata: 
  name: myapp-green-service
  labels:
    app: myapp
    version: green
spec:
  type: NodePort
  selector:
    app: myapp
    version: green
  ports: 
  - protocol: TCP
    port: 80
    targetPort: 8080

Gke安格尔亚马尔

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    # If the class annotation is not specified it defaults to "gce".
    kubernetes.io/ingress.class: "gce"
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: myapp-blue-service
          servicePort: 80
      - path: /green
        backend:
          serviceName: myapp-green-service
          servicePort: 80

服务状态

NAME                  TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes            ClusterIP   10.42.0.1      <none>        443/TCP        6h18m
myapp-blue-service    NodePort    10.42.81.106   <none>        80:31664/TCP   4h35m
myapp-green-service   NodePort    10.42.74.168   <none>        80:30246/TCP   4h35m

入口状态

kubectl describe ing myapp-ingress
Name:             myapp-ingress
Namespace:        default
Address:          34.95.121.24
Default backend:  default-http-backend:80 (10.41.0.9:8080)
Rules:
  Host        Path  Backends
  ----        ----  --------
  *
              /*        myapp-blue-service:80 (10.41.0.24:8888,10.41.1.16:8888)
              /green    myapp-green-service:80 (10.41.0.27:8080,10.41.1.19:8080)
Annotations:  ingress.kubernetes.io/backends:
                {"k8s-be-30192--a4913825f2ae16d4":"HEALTHY","k8s-be-30246--a4913825f2ae16d4":"HEALTHY","k8s-be-31664--a4913825f2ae16d4":"HEALTHY"}
              ingress.kubernetes.io/forwarding-rule: k8s2-fr-dkti1gqp-default-myapp-ingress-yd16xk65
              ingress.kubernetes.io/target-proxy: k8s2-tp-dkti1gqp-default-myapp-ingress-yd16xk65
              ingress.kubernetes.io/url-map: k8s2-um-dkti1gqp-default-myapp-ingress-yd16xk65
              kubernetes.io/ingress.class: gce

部署和pod状态

NAME                                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/myapp-blue                    2/2     2            2           4h18m
deployment.apps/myapp-green                   2/2     2            2           38m
NAME                                               READY   STATUS    RESTARTS   AGE
pod/myapp-blue-9c9cbf5b-c7v7c                      1/1     Running   0          4h18m
pod/myapp-blue-9c9cbf5b-cpvgl                      1/1     Running   0          4h18m
pod/myapp-green-7f56cc9496-hnfkz                   1/1     Running   0          38m
pod/myapp-green-7f56cc9496-v8bb6                   1/1     Running   0          38m

服务状态

NAME                  TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes            ClusterIP   10.42.0.1      <none>        443/TCP        6h24m
myapp-blue-service    NodePort    10.42.81.106   <none>        80:31664/TCP   4h40m
myapp-green-service   NodePort    10.42.74.168   <none>        80:30246/TCP   4h40m

共有1个答案

吕博耘
2023-03-14

我发现问题出在gke入口控制器上。Gke ingress controller不向/提供重写目标。我正在从webroot提供我的绿色和蓝色网页。GKE入口控制器正在转发请求的URLhttp://34.95.121.24/green到http://{backend}/green。在http://{backend}/green上没有托管的页面,因为我的默认页面托管在http://{backend}/。

这个问题有两种解决方案。

  1. 使用带有注释的nginx入口控制器将目标集重写为/
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: myapp-blue-service
          servicePort: 80
      - path: /green
        backend:
          serviceName: myapp-green-service
          servicePort: 80

我创建了一个默认的服务器配置部分,以将任何命中/绿色的流量路由到索引。html。

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;
        server_name _;
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                index index.html
                try_files $uri $uri/ =404;
        }
        location /green {
                try_files $uri $uri/ /index.html;
        }

我将默认站点配置复制到docker配置文件中可用的/etc/nginx/sites。

我的示例Dockerfile

FROM ubuntu
RUN apt-get update
RUN apt-get install nginx -y
COPY index.html /var/www/html/
COPY default /etc/nginx/sites-available/
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
 类似资料:
  • 我们有Zuul和Eureka在我们的kubernetes集群上运行。Zuul在Eureka注册。 我启动了一个名为“资源服务”的新服务,这将正确启动并注册到Eureka,所有服务都启动了。 当我试图访问Zuulendpoint以访问“resource-service”时,我得到以下错误。看起来Zuul不能映射到Resource-service,即使Resource-service注册了Eureka

  • 以下是我遵循的步骤- kubectl apply-f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml kubectl apply-f https://raw.githubusercontent.com/kubernetes/ingress-nginx/mas

  • 我想让流量如下所示: 外部客户端https请求(例如。https://my-app-out-side-cluster.com) - 我遵循这篇文章来配置我的入口和外部流量,但是,由于我在集群外的服务是http,所以在使用https发出请求时,我会遇到SSL错误。但是,将请求更改为http是可行的,这是不需要的。 我的问题是,有没有办法 在入口中终止SSL(使用入口控制器) 是否将流量重定向到群集外

  • 我在VPC上有一个极光数据库。今天我需要通过lambda连接到数据库。这并不是一个问题,只是我需要在Lambda中访问互联网,所以我必须设置以下内容: 我为公共NAT添加了新的子网。 我添加了NAT网关,并将其分配给新的EIP和新的子网。 我添加了一个新的路由表,该表将所有流量路由到并将该表与在步骤1中创建的新子网相关联。 我修改了路由表,并将所有流量路由到NAT。

  • 我正在尝试将入口连接到静态ip。我似乎在遵循所有教程,但我似乎仍然无法将静态ip连接到入口。我的入口文件如下(参考静态ip“测试ip”) 然而,当我跑步时 它返回 没有给出地址。在VPC网络[外部IP地址]中,静态ip是存在的,它是全局的,但它一直说:In use by无 给予 我错过了什么?

  • 我正在使用Traefik将传统的nginx前端反向代理迁移到Kubernetes集群。最终目标是将一切都转移到微服务上,但这可能需要一段时间。同时,如何创建一个IngressRoute CRD,将其路由到集群外部托管的遗留系统?这只是一个http://server:port有点向前。我已经仔细阅读了这些文档,但Traefik v2.0似乎已经取消了对自定义后端的支持,而且我不太确定在没有Ingre