Kubernetes 中的“端点”是啥?

Posted

技术标签:

【中文标题】Kubernetes 中的“端点”是啥?【英文标题】:What is an 'endpoint' in Kubernetes?Kubernetes 中的“端点”是什么? 【发布时间】:2019-03-22 07:21:55 【问题描述】:

我是 Kubernetes 新手,开始阅读文档。 经常使用术语“端点”,但文档缺乏明确的定义。

就 Kubernetes 而言,什么是“端点”?它位于哪里?

我可以想象“端点”是单个“节点”的某种接入点,但这只是一个猜测。

【问题讨论】:

您是在谈论服务中使用的Endpoint 资源还是您指的是哪个资源?你能举个例子吗? 我在这篇文章 kubernetes.io/docs/concepts/services-networking/service 中偶然发现了“端点”。 为什么端点 ip 与 clusterip 不同?如果需要的是集群内的端点 ip,为什么 nslookup 会将服务解析为集群 ip? 【参考方案1】:

将 Endpoints 视为“到达应用程序的最终目的地”或“最后的事情”

如下例所示:pod-IP = 10.32.0.2, service-Port* = 3306, endpoint = [pod-IP] :[服务端口]

因此,用户 Bob 要访问 mysql 应用程序,它应该寻址到 10.32.0.2:3306,这是网络中他可以找到所需信息的最后一个节点。

一个简单示例:在这种情况下,我想为我/浏览器访问 Google Mail,端点将是 gmail.com:443 与上面的示例类似 [pod-IP]:[服务端口]

【讨论】:

【参考方案2】:

端点是一种资源,它获取动态分配给它的一个或多个 Pod 的 IP 地址以及端口。可以使用kubectl get endpoints 查看端点。

一个端点资源被一个 kubernetes 服务引用,以便该服务记录 pod 的内部 IP,以便能够与它们通信。

我们需要端点作为抽象层,因为 Kubernetes 中的“服务”充当编排的一部分,以确保将流量分配到 pod(包括仅将流量发送到健康的 pod)。例如,如果一个 pod 死了,将生成一个替换 pod,并使用新的 IP 地址。从概念上讲,死 pod IP 将从端点对象中移除,并添加新创建的 pod 的 IP,以便更新服务并“知道”要连接到哪些 pod。

阅读“向集群公开 pod”,然后在此处阅读“创建服务” - https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#exposing-pods-to-the-cluster

调查和查看关系的简单方法是:

kubectl describe pods - 观察你的 Pod 的 IP 地址 kubectl get ep - 并观察分配给您的端点的 IP 地址 kubectl describe service myServiceName - 并观察与您的服务关联的 Endpoints

所以不,端点与单个节点的 IP 没有任何关系。我发现了解 Kubernetes 的整体结构以及集群、节点、服务、端点和 Pod 之间的关系很有用。此图很好地总结了它,并显示了导致 OSI 第 2 层(TCP 层)到达后端节点 1 的入口流,而 OSI 第 7 层(http 层)入口最终到达 Pod 1 中的“Web 容器 1” :

【讨论】:

为什么用户向Node(10.10.50.51)而不是clusterIP(10.111.239.70)发送请求? 集群 IP 无法在集群外访问。【参考方案3】:

虽然您是正确的,在 glossary 中确实没有端点条目,但它是一个定义明确的 Kubernetes 网络概念或抽象。由于它是次要的,你通常不会直接操纵它。定义了一个核心资源Endpoint,命令行也支持它:

$ kubectl get endpoints
NAME         ENDPOINTS            AGE
kubernetes   192.168.64.13:8443   10d

您会看到它实际上是什么:IP 地址和端口。通常,您会让服务管理端点(服务将流量路由到的每个 pod 一个 EP),但如果您有需要的用例,您也可以manually manage 它们。

【讨论】:

在进一步阅读 Kubernetes 中的“端点”之后,我现在将其理解为填充在 Kubernates API server 上的 REST API endpoint 的面向对象表示。因此,就 Kubernetes 而言,“端点”是访问其资源(例如 Pod)的方式——“端点”背后的资源。 感谢您的回答。有趣的是,术语表中没有定义端点。我知道这不是 Kubernetes 特有的术语……但服务也不是。或服务帐户。或音量。或节点。或容器! ?【参考方案4】:

在我的例子中,我在注释中遇到了语法问题

metadata:
  name: academy
  namespace: qa
  resourceVersion: '12761882'
  generation: 1
  creationTimestamp: '2021-06-22T03:21:43Z'
  labels:
    app.kubernetes.io/instance: academy-platform-qa
    app.kubernetes.io/managed-by: Tiller
    app.kubernetes.io/name: academy
    helm.sh/chart: academy-qa-v0.6.8-0-gef467c2
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/whitelist-source-range: >-
      10.16.0.27/8, 69.114.20.139/32,

如你所见,我在 69.114.20.139/32 之后离开了 ',' 我固定到

metadata:
  name: academy
  namespace: qa
  resourceVersion: '12761882'
  generation: 1
  creationTimestamp: '2021-06-22T03:21:43Z'
  labels:
    app.kubernetes.io/instance: academy-platform-qa
    app.kubernetes.io/managed-by: Tiller
    app.kubernetes.io/name: academy
    helm.sh/chart: academy-qa-v0.6.8-0-gef467c2
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/whitelist-source-range: >-
      10.16.0.27/8, 69.114.20.139/32

【讨论】:

【参考方案5】:

我会一一回答你的问题:


就 Kubernetes 而言,什么是“端点”?

(K8S中资源名称为Endpoints)。

Endpoints 是 kubernetes 中的一个对象,它代表一个……端点列表。 这些端点可以是:

    一个在集群内运行的内部 pod - 这是比较熟悉的形式。 当我们创建服务和 Pod 并将服务标签选择器与 Pod 标签匹配时,它会在后台自动为我们创建。

    不是 pod 的外部 IP - 这是最不为人知的选项。

外部 IP 可以驻留在集群之外 - 例如外部 Web 服务器或数据库。 它也可以驻留在不同的命名空间中 - 如果您想将您的服务指向集群内不同命名空间中的服务。

关于外部端点 - 如果您没有在服务中指定标签选择器 - Kubernetes 无法创建端点列表,因为他不知道服务应该包含和代理哪些 pod。


它在哪里?

就像这里提供的很棒的图表一样 - 它位于服务和内部(pod)或外部(网络服务器、数据库等)之间 资源。


我可以想象“端点”是某种接入点 单个“节点”它是对位于内部的资源的访问点 集群中的一个节点。

端点可以驻留在集群中的一个节点内,也可以驻留在集群/环境之外。

如果它是一个 internal 端点(这意味着 pod 标签与服务标签选择器匹配) - 您可以通过以下方式访问它:

$kubectl describe svc/my-service


Name:                     my-service
Namespace:                default
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            "apiVersion":"v1","kind":"Service","metadata":"annotations":,"name":" my-service","namespace":"...
Selector:                 run=some-run
Type:                     NodePort
IP:                       10.100.92.162
Port:                     <unset>  8080/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  31300/TCP
Endpoints:                172.21.21.2:80,172.21.38.56:80,172.21.39.160:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

或直接使用:

$kubectl get endpoints my-service

NAME           ENDPOINTS                                       AGE
my-service   172.21.21.2:80,172.21.38.56:80,172.21.39.160:80   63d

关于外部端点:

您创建一个没有标签选择器的服务:

apiVersion: v1
kind: Service
metadata:
  name: my-service #<------ Should match the name of Endpoints object
spec:
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 9376

因此不会自动创建相应的 Endpoint 对象,您需要手动添加 Endpoints 对象并将 Service 映射到运行外部资源的所需网络地址和端口:

apiVersion: v1
kind: Endpoints
metadata:
  name: my-service #<------ Should match the name of Service
subsets:
  - addresses:
      - ip: 192.0.2.45
    ports:
      - port: 9376

注意:)我使用术语 internal 来表示与标签选择器和术语 external 用于手动创建的端点。

我可以使用 auto-generatedmanual 这两个术语来代替 - 这会更准确,但我认为也更令人困惑。

在大多数情况下,当 Endpoints 与我们集群中的 pod 相关时——我们希望它们也由 K8S 管理——在这种情况下,它们也需要由 K8S 生成。

【讨论】:

【参考方案6】:

在 k8s 中,Endpoints 由分布式 API 组成,例如“[IP]:[Port]”等。但是,在 SOAP 中,Endpoint 是一个类似于 URL 的分布式 API。

from Google Cloud:

Endpoints 是一个分布式 API 管理系统。它提供 API 控制台、托管、日志记录、监控和其他功能来帮助您创建、共享、维护和保护您的 API。

【讨论】:

【参考方案7】:

Pod 通过端点将自己暴露给服务。 如果您愿意成为 pod 的一部分。

来源:Services and Endpoints

【讨论】:

【参考方案8】:
    端点跟踪服务向其发送流量的对象的 IP 地址。 当服务选择器与 pod 标签匹配时,该 IP 地址将添加到您的端点。

来源:https://theithollow.com/2019/02/04/kubernetes-endpoints/

【讨论】:

以上是关于Kubernetes 中的“端点”是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Flask 中的“端点”是啥?

Kubernetes第零篇:认识kubernetes

Kubernetes 中的集群 IP 是啥?

WCF 中的“端点”是啥?

是啥导致 ZeroMQ 中的“传输端点未连接”?

Kubernetes Deployment滚动更新场景分析