【问题标题】:k8s ExternalName endpoint not found - but working未找到 k8s ExternalName 端点 - 但可以正常工作
【发布时间】:2021-07-13 18:29:31
【问题描述】:

我使用kustomize 部署了一个简单的测试ingress 和一个externalName service。 部署工作正常,我得到了预期的结果,但是当describing test-ingress 它显示错误:<error: endpoints "test-external-service" not found>。 这似乎是一个 k8s 错误。它显示此错误,但一切正常。

这是我的部署:

kustomization.yaml:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: platform
resources:
  - test-ingress.yaml
  - test-service.yaml
generatorOptions:
  disableNameSuffixHash: true

test-service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: test-external-service
  namespace: platform
spec:
  type: ExternalName
  externalName: "some-working-external-elasticsearch-service"

test-ingress.yaml:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: nginx-external
    nginx.ingress.kubernetes.io/configuration-snippet: |
      proxy_cache_bypass $http_upgrade;
spec:
  rules:
    - host: testapi.mydomain.com
      http:
        paths:
          - path: /
            backend:
              serviceName: test-external-service
              servicePort: 9200

在这里,我将外部服务连接到工作中的elasticsearch 服务器。当浏览到testapi.mydomain.com(“mydomain”当然被我们的真实域替换)时,我得到了众所周知的预期elasticsearch 结果:

{
  "name" : "73b40a031651",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "Xck-u_EFQ0uDHJ1MAho4mQ",
  "version" : {
    "number" : "7.10.1",
    "build_flavor" : "oss",
    "build_type" : "docker",
    "build_hash" : "1c34507e66d7db1211f66f3513706fdf548736aa",
    "build_date" : "2020-12-05T01:00:33.671820Z",
    "build_snapshot" : false,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

所以一切正常。但是在描述test-ingress时,出现如下错误:

test-external-service:9200 (<error: endpoints "test-external-service" not found>)

这是什么错误?为什么即使一切正常,我也会得到它?我在这里错过了什么?

【问题讨论】:

  • 运行kubectl describe ing 命令后,Events 部分中是否有任何警告/错误条目?如果您没有任何警告/错误条目,则一切都应按预期工作。

标签: kubernetes google-kubernetes-engine kubernetes-ingress nginx-ingress


【解决方案1】:

这就是kubectl describe ingress 命令的工作原理。
kubectl describe ingress命令调用describeIngressV1beta1函数,后者调用describeBackendV1beta1函数描述后端。

可以在source code 中找到,describeBackendV1beta1 函数查找与后端服务关联的端点,如果它没有找到合适的端点,它会生成一条错误消息(如您​​的示例中所示):

func (i *IngressDescriber) describeBackendV1beta1(ns string, backend *networkingv1beta1.IngressBackend) string {
    endpoints, err := i.client.CoreV1().Endpoints(ns).Get(context.TODO(), backend.ServiceName, metav1.GetOptions{})
    if err != nil {
        return fmt.Sprintf("<error: %v>", err)
    }
...

Integrating External Services 文档中,您可以发现ExternalName 服务没有任何定义的端点:

ExternalName 服务没有选择器,也没有任何定义的端口或端点,因此,您可以使用 ExternalName 服务将流量引导到外部服务。

【讨论】:

  • 所以基本上你是说,它按预期工作。工作,有一个不相关的错误。听起来像设计中的错误:)
  • 你是对的 :) 我更新了我的第一句话以更适合这种情况。
【解决方案2】:

Service 是一种 Kubernetes 抽象,它使用标签来选择 pod 来将流量路由到。

端点跟踪服务向其发送流量的对象的 IP 地址。当服务选择器与 pod 标签匹配时。

类型为 ClusterIP、NodePort 或 LoadBalancer 的 Kubernetes 服务就是这种情况。

对于您的情况,您使用类型为 ExternalName 的 Kubernetes 服务,其中端点是集群外部或不同命名空间中的服务器,因此当您尝试描述入口时,kubernetes 会显示该错误消息。

通常我们不会创建指向 ExternalName 类型的服务的入口,因为我们不应该向外部公开它已经公开的服务。 kubernetes 入口需要一个类型为 ClusterIP、NodePort 或 LoadBalancer 的服务,这就是您在描述入口时遇到意外错误的原因。

如果您在集群中浏览该 ExternalName,最好避免使用入口并使用服务 uri (test-external-service..svc.cluster.local:9200)

无论如何,如果您坚持使用 Ingress,您可以创建一个不带选择器的 Headless service,然后使用与服务相同的名称手动创建端点。效仿here

【讨论】:

  • 如你所想,它是集群外的服务,所以我不能使用服务 URI。但如果它不期望 ExternalName 类型,请不要让我使用它。如果你让我使用它,为什么会出错?特别是如果它确实按预期工作,为什么会出现错误。对不起,我不明白你的回答。
猜你喜欢
  • 1970-01-01
  • 2020-03-21
  • 2021-08-30
  • 2023-03-10
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
相关资源
最近更新 更多