首页 > 解决方案 > Kubernetes:提供来自不同服务的路径

问题描述

我有两种服务,一种用于提供静态文件,另一种用于提供 api。我为这些创建了一个入口控制器。

我想/从 service1 和service2 服务/api。我的服务运行良好。但我得到 404 的/api路径。

下面是我的 Kubernetes yaml

---
apiVersion: v1
kind: Namespace
metadata:
  name: "myapp"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: "service2"
  namespace: "myapp"
  labels:
    project: "myapp"
    env: "prod"
spec:
  replicas: 2
  selector:
    matchLabels:
      project: "myapp"
      run: "service2"
    matchExpressions:
      - {key: project, operator: In, values: ["myapp"]}
  template:
    metadata:
      labels:
        project: "myapp"
        env: "prod"
        run: "service2"
    spec:
      securityContext:
        sysctls:
          - name: net.ipv4.ip_local_port_range
            value: "1024 65535"
      imagePullSecrets:
        - name: tildtr
      containers:
        - name: "node-container"
          image: "images2"
          imagePullPolicy: Always
          ports:
            - containerPort: 3000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: "service1"
  namespace: "myapp"
  labels:
    project: "myapp"
    env: "prod"
spec:
  replicas: 2
  selector:
    matchLabels:
      project: "myapp"
      run: "service1"
    matchExpressions:
      - {key: project, operator: In, values: ["myapp"]}
  template:
    metadata:
      labels:
        project: "myapp"
        env: "prod"
        run: "service1"
    spec:
      securityContext:
        sysctls:
          - name: net.ipv4.ip_local_port_range
            value: "1024 65535"
      imagePullSecrets:
        - name: tildtr
      containers:
        - name: "nginx-container"
          image: "image1"
          imagePullPolicy: Always
          ports:
            - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: "service1"
  namespace: "myapp"
  labels:
    project: "myapp"
    env: "prod"
    run: "service1"
spec:
  selector:
    project: "myapp"
  type: ClusterIP
  ports:
    - name: "service1"
      port: 80
      targetPort: 80
  selector:
    run: "service1"
---
apiVersion: v1
kind: Service
metadata:
  name: "service2"
  namespace: "myapp"
  labels:
    project: "myapp"
    env: "prod"
    run: "service2"
spec:
  selector:
    project: "myapp"
  type: ClusterIP
  ports:
    - name: "service2"
      port: 80
      targetPort: 3000
  selector:
    run: "service2"
    
    
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: "myapp"
  namespace: "myapp"
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/server-alias: "*.xyz.in"
    nginx.ingress.kubernetes.io/server-snippet: |
      sendfile on;
      tcp_nopush on;
      tcp_nodelay on;
      keepalive_timeout 50;
      keepalive_requests 100000;
      reset_timedout_connection on;
      client_body_timeout 20;
      send_timeout 2;
      types_hash_max_size 2048;
      client_max_body_size 20M;
      gzip on;
      gzip_min_length 10240;
      gzip_proxied expired no-cache no-store private auth;
      gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml application/json;
      gzip_disable "MSIE [1-6]\.";
spec:
  rules:
    - host: "myhost.in"
      http:
        paths:
          - path: /api
            backend:
              serviceName: "service2"
              servicePort: 80
          - path: /
            backend:
              serviceName: "service1"
              servicePort: 80


这是我的入口说明。


Name:             myapp
Namespace:        myapp
Address:          10.100.160.106
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host                             Path  Backends
  ----                             ----  --------
  ds-vaccination.timesinternet.in  
                                   /api   service2:3000 (10.0.1.113:3000,10.0.2.123:3000)
                                   /      service1:80 (10.0.1.37:80,10.0.2.59:80)
Annotations:                       nginx.ingress.kubernetes.io/rewrite-target: /
                                   nginx.ingress.kubernetes.io/server-alias: *.xyz.in
                                   nginx.ingress.kubernetes.io/server-snippet:
                                     sendfile on;
                                     tcp_nopush on;
                                     tcp_nodelay on;
                                     keepalive_timeout 50;
                                     keepalive_requests 100000;
                                     reset_timedout_connection on;
                                     client_body_timeout 20;
                                     send_timeout 2;
                                     types_hash_max_size 2048;
                                     client_max_body_size 20M;
                                     gzip on;
                                     gzip_min_length 10240;
                                     gzip_proxied expired no-cache no-store private auth;
                                     gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml application/json;
                                     gzip_disable "MSIE [1-6]\.";
Events:
  Type    Reason  Age               From                      Message
  ----    ------  ----              ----                      -------
  Normal  Sync    6s (x5 over 31m)  nginx-ingress-controller  Scheduled for sync
  Normal  Sync    6s (x5 over 31m)  nginx-ingress-controller  Scheduled for sync

标签: kuberneteskubernetes-ingress

解决方案


删除此注释并尝试

annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /

如果您的集群支持旧API:extensions/v1beta1

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: service-ingress
spec:
  rules:
  - host: service1.example.com
    http:
      paths:
      - backend:
          serviceName: service1
          servicePort: 80
  - host: service2.example.com
    http:
      paths:
      - backend:
          serviceName: service2
          servicePort: 80

推荐阅读