如何解决获取服务“default/frontend-svc”端点时出错:本地存储中没有与键“default/frontend-svc”匹配的对象

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

我知道这个问题以前曾被问过,但前一个问题不适用于我的情况。我有 2 个部署和 2 个服务,我正在使用入口资源并且

nginx ingress controller

ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
    name: frontend-ingress
    annotations: 
      kubernetes.io/ingress.class: nginx
spec:
    rules:
    - http:
        paths:
        - path: /api
          backend:
            serviceName: frontend-svc
            servicePort: 3000
        - path: /
          backend:
            serviceName: static-svc
            servicePort: 80

这 2 个服务定义如下,

services.yaml

  apiVersion: v1
  kind: Service
  metadata:
      labels:
          app: frontend
      name: frontend-svc
  spec:
      ports:
      - port: 3000
        protocol: TCP
        targetPort: 3000
      selector:
          app: frontend
      type: ClusterIP

---

apiVersion: v1
kind: Service
metadata:
    labels:
        app: static
    name: static-svc
spec:
    ports:
    - port: 80
      protocol: TCP
      targetPort: 80
    selector:
        app: static
    type: ClusterIP

部署如下所示,

apiVersion: apps/v1
kind: Deployment
metadata:
    labels:
        app: frontend
    name: frontend
spec:
    replicas: 2
    selector:
        matchLabels:
            app: frontend
    template:
        metadata:
            labels:
                app: frontend
        spec:
            containers:
            - image: magalixcorp/sample-api:v1
              imagePullPolicy: IfNotPresent
              name: frontend
              env:
              - name: REDIS_PASSWORD
                valueFrom:
                  secretKeyRef:
                    name: redis-password
                    key: redis-password
              volumeMounts:
              - name: config-volume
                mountPath: /app/config.json
                subPath: config.json
            volumes:
                - name: config-volume
                  configMap:
                    name: app-config

---

apiVersion: apps/v1
kind: Deployment
metadata:
    labels:
        app: static
    name: static
spec:
    replicas: 2
    selector:
        matchLabels:
            app: static
    template:
        metadata:
            labels:
                app: static
        spec:
            containers:
            - image: magalixcorp/static:v1
              imagePullPolicy: IfNotPresent
              name: static


我已使用 helm 将 nginx 控制器部署到 AKS。路线根本行不通。 当我检查 nginx-controller 日志时,我得到了这个

W1109 16:30:33.892443       6 controller.go:849] Error obtaining Endpoints for Service "default/frontend-svc": no object matching key "default/frontend-svc" in local store
W1109 16:30:33.892478       6 controller.go:849] Error obtaining Endpoints for Service "default/static-svc": no object matching key "default/static-svc" in local store
I1109 16:30:33.929583       6 main.go:112] "successfully validated configuration, accepting" ingress="frontend-ingress/default"
W1109 16:30:33.935904       6 controller.go:849] Error obtaining Endpoints for Service "default/frontend-svc": no object matching key "default/frontend-svc" in local store
W1109 16:30:33.935930       6 controller.go:849] Error obtaining Endpoints for Service "default/static-svc": no object matching key "default/static-svc" in local store
I1109 16:30:33.935973       6 controller.go:144] "Configuration changes detected, backend reload required"
I1109 16:30:33.936084       6 event.go:282] Event(v1.ObjectReference{Kind:"Ingress", Namespace:"default", Name:"frontend-ingress", UID:"efde0161-c03f-49d4-8f2b-38e2ceaaf8a7", APIVersion:"networking.k8s.io/v1beta1", ResourceVersion:"7945", FieldPath:""}): type: 'Normal' reason: 'Sync' Scheduled for sync
I1109 16:30:34.005219       6 controller.go:161] "Backend successfully reloaded"
I1109 16:30:34.005615       6 event.go:282] Event(v1.ObjectReference{Kind:"Pod", Namespace:"nginx", Name:"nginx-ingress-nginx-controller-68f45f49f6-slnv7", UID:"7880b0be-a1ff-450d-b1c1-4cee11722a6b", APIVersion:"v1", ResourceVersion:"3538", FieldPath:""}): type: 'Normal' reason: 'RELOAD' NGINX reload triggered due to a change in configuration
I1109 16:30:37.269565       6 controller.go:144] "Configuration changes detected, backend reload required"
I1109 16:30:37.342929       6 controller.go:161] "Backend successfully reloaded"
I1109 16:30:37.343677       6 event.go:282] Event(v1.ObjectReference{Kind:"Pod", Namespace:"nginx", Name:"nginx-ingress-nginx-controller-68f45f49f6-slnv7", UID:"7880b0be-a1ff-450d-b1c1-4cee11722a6b", APIVersion:"v1", ResourceVersion:"3538", FieldPath:""}): type: 'Normal' reason: 'RELOAD' NGINX reload triggered due to a change in configuration
I1109 16:31:01.926983       6 status.go:290] "updating Ingress status" namespace="default" ingress="frontend-ingress" currentValue=[] newValue=[{IP: Hostname:a596c83cb03464004bcced0767dd5aa9-1681194742.us-east-1.elb.amazonaws.com}]
I1109 16:31:01.937928       6 event.go:282] Event(v1.ObjectReference{Kind:"Ingress", Namespace:"default", Name:"frontend-ingress", UID:"efde0161-c03f-49d4-8f2b-38e2ceaaf8a7", APIVersion:"networking.k8s.io/v1beta1", ResourceVersion:"8081", FieldPath:""}): type: 'Normal' reason: 'Sync' Scheduled for sync
10.0.1.165 - - [09/Nov/2020:16:32:18 +0000] "GET / HTTP/1.1" 200 1313 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:82.0) Gecko/20100101 Firefox/82.0" 396 0.002 [default-static-svc-80] [] 10.0.3.144:80 1313 0.000 200 750627c05c4ca98a2bcd60ae8bbb8828
10.0.1.165 - - [09/Nov/2020:16:32:19 +0000] "GET /js/script.js HTTP/1.1" 200 314 "http://a596c83cb03464004bcced0767dd5aa9-1681194742.us-east-1.elb.amazonaws.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:82.0) Gecko/20100101 Firefox/82.0" 397 0.001 [default-static-svc-80] [] 10.0.1.175:80 314 0.000 200 af72c4fdc493a489064307872636b662
10.0.1.165 - - [09/Nov/2020:16:32:20 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "http://a596c83cb03464004bcced0767dd5aa9-1681194742.us-east-1.elb.amazonaws.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:82.0) Gecko/20100101 Firefox/82.0" 407 0.002 [default-static-svc-80] [] 10.0.3.144:80 153 0.000 404 ba36f92120a41720842ba95e24b9975c
10.0.2.31 - - [09/Nov/2020:16:32:47 +0000] "GET /.env HTTP/1.1" 404 555 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36" 231 0.001 [default-static-svc-80] [] 10.0.1.175:80 555 0.000 404 d8ec13faad1d46c13401b397e2d80ad0
10.0.2.31 - - [09/Nov/2020:16:32:48 +0000] "POST / HTTP/1.1" 405 559 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36" 317 0.001 [default-static-svc-80] [] 10.0.1.175:80 559 0.000 405 567a4b2499fc816d72135445076bafda
10.0.1.165 - - [09/Nov/2020:16:32:53 +0000] "GET /api HTTP/1.1" 200 3 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:82.0) Gecko/20100101 Firefox/82.0" 399 0.003 [default-frontend-svc-3000] [] 10.0.1.26:3000 3 0.000 200 8a92b9829d26dccb60f11a9c8537d831
10.0.3.231 - - [09/Nov/2020:16:34:37 +0000] "POST /api HTTP/1.1" 204 0 "-" "curl/7.64.1" 211 0.002 [default-frontend-svc-3000] [] 10.0.1.26:3000 0 0.000 204 cf837f8bc89c29f2d2b07ac317120220
10.0.2.31 - - [09/Nov/2020:16:34:55 +0000] "GET /api HTTP/1.1" 200 3 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:82.0) Gecko/20100101 Firefox/82.0" 425 0.006 [default-frontend-svc-3000] [] 10.0.2.98:3000 3 0.004 200 a5757323ff32d8c4dbc56ef476798954

当我尝试 :3000/api 进行 POST 或 GET 时,它不起作用。可能出了什么问题。到底是哪里做错了。

kubernetes kubernetes-ingress nginx-ingress
3个回答
4
投票

尝试清理一下。因此,仅为您的前端创建一个部署。所以这个文件你可以称之为

frontend-depl.yml
然后这样写:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: frontend-depl
spec:
    replicas: 1
    selector:
        matchLabels:
            app: frontend
    template:
        metadata:
            labels:
                app: frontend
        spec:
            containers:
              - name: frontend
                image: magalixcorp/sample-api:v1
---

apiVersion: v1
kind: Service
metadata:
    name: frontend-srv
spec:
    selector:
      app: frontend
    ports:
     - name: frontend
       protocol: TCP
       port: 3000
       targetPort: 3000

我建议这样做是为了保持您的

yml
文件整洁,因为正如您所知,这一切都可能很快失控,并且故障排除可能会很痛苦。

我也会进入你的终端并运行:

$ kubectl get endpoints --namespace <namespace>
...
<namespace> <your-app-service>  <none> 21h

那就是看看你有哪些端点。

问题也可能是您的标签选择器,这就是为什么我提供了您的

yml
文件的更清晰版本,至少是
frontend-depl
文件,我会对您的其他
yml
文件使用相同的模式。

了解有关标签选择器的更多信息: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors


0
投票

我也遇到了同样的问题,结果发现我的目标IP地址错误。我将流量从 VNet 外部发送到我在此处找到的(外部)IP 地址:

kubectl get ingress

我很困惑,因为当我使用临时运行的 Pod 进行测试时,该地址工作正常,该 Pod 只是从我的 VNet 内进行单个 HTTP 调用,然后终止。

但是,当我阅读 Ingress Pod 的日志时,我发现解析到的 IP 地址不同。然后我通过这个命令检查了端点

kubectl get endpoints

事实证明,此处列出的 IP 地址是我的 Ingress 控制器正在侦听的正确 IP 地址。因此,我将我的私有 DNS 配置为使用该 IP 地址并解决了问题。


0
投票

接下来的命令可以帮助您更好地诊断问题:

kubectl get endpoints

根据您的服务获取可用端点

kubectl describe ingress

获取有关您的入口配置的更多信息(可以给您一些日志)

确保您的入口名称和端口正确。您可以使用下一个命令进一步调试服务:

kubectl port-forward svc/service-name 8080:{service-port}

然后访问 http://localhost:8080 查看是否正常。

我遇到了与您非常相似的错误,并且我的入口的端口和名称在之前的“kubectl apply”中是错误的

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