什么是 Kubernetes 的“终点”?

我刚到 Kubernetes,就开始阅读相关文件。 这里经常使用术语“端点”,但文档缺乏明确的定义。

什么是库伯内特的“终点”? 它位于哪里?

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

77848 次浏览

虽然在 词汇表中确实没有端点条目,但是它是一个定义良好的 Kubernetes 网络概念或抽象。因为它是次要的,你通常不会直接操纵它。定义了一个核心资源 终点,命令行也支持它:

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

这里你可以看到它的有效性: 一个 IP 地址和一个端口。通常,您会让服务管理端点(服务路由到的每个 pod 一个 EP) ,但是如果您有需要它的用例,您也可以对它们进行 手动管理

Pods 通过端点向服务公开自己。 如果你愿意加入我们,那就是。

enter image description here 来源: < a href = “ https://storage.googleapis.com/static.ianlewis.org/prod/img/753/Endpoints.png”rel = “ noReferrer”> 服务和端点

  1. 端点跟踪服务发送流量到的对象的 IP 地址。
  2. When a service selector matches a pod label, that IP Address is added to your endpoints.

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

In k8s, Endpoints is consisted of a distributed API like "[IP]:[Port]" and other things. However,in SOAP,Endpoint is a distributed API like URL.

from Google Cloud:

端点是一个分布式 API 管理系统。它提供了 API 控制台、宿主、日志记录、监视和其他特性,以帮助您创建、共享、维护和保护 API。

An endpoint is an resource that gets IP addresses of one or more pods dynamically assigned to it, along with a port. An endpoint can be viewed using kubectl get endpoints.

库伯内特服务引用端点资源,以便该服务拥有 pods 的内部 IP 记录,从而能够与它们进行通信。

我们需要端点作为抽象层,因为库伯内特中的“服务”作为编配的一部分,以确保流量分配到 pods (包括只向健康的 pods 发送流量)。例如,如果一个 pod 死亡,将生成一个新的 IP 地址替换 pod。从概念上讲,死的 pod IP 将从端点对象中删除,并且新创建的 pod 的 IP 将被添加,以便服务被更新并且“知道”要连接到哪个 pod。

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

调查和了解这种关系的一个简单方法是:

  • kubectl describe pods-并观察您的豆荚的 IP 地址
  • 观察分配给端点的 IP 地址
  • 观察与您的服务相关的 Endpoints

因此,端点与单个节点的 IP 没有任何关系。我发现了解库伯网的整体结构以及集群、节点、服务、端点和 pods 之间的关系是有用的。这张图很好地总结了它,并且显示了一个进入流,导致 OSI 第2层(TCP 层)到达后端 Node 1,OSI 第7层(http 层)进入最终到达 Pod 1中的“ Web Container 1”:

enter image description here

我会一个一个地回答你们的问题:


就库伯内特而言,什么是“终点”?

(K8S 中的资源名称是 Endpoint<是的trong>是的)。

端点是库伯网中的一个对象,表示一个... 端点列表。
这些终点可以是:

  1. 一个 在星系团内部运行的内部分离舱-这是更熟悉的形式。
    当我们创建服务和 pods 并将服务标签选择器与 pods 标签匹配时,它会在幕后为我们自动创建。

  2. 一个 不是豆荚的外部 IP-这是最不为人知的选择。

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

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


它在哪里?

像这里提供的伟大的图表显示-它位于服务和内部(吊舱)或外部(网络服务器,数据库等)之间 资源。


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

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

如果它是一个 内部端点(这意味着 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

So the corresponding Endpoint object will not be created automatically and you manually add the Endpoints object and map the Service to the desired network address and port where the external resource is running:

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

(注意:) I used the term 内部 for the auto-generated Endpoints for pods that has a match with the label selector and the term 外部 for Endpoints that were created manually.

我可以使用术语 自动生成的手动操作代替-这将是更准确的,但我认为更混乱。

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

把端点想象成‘ 到达一个应用程序的最终目的地’或‘ smth at the very end’

如下例所示: Pod-IP = 10.32.0.2,service-Port * = 3306,Endpoint = [ pod-IP ] : [ service-Port ]

因此,对于用户 Bob 来说,到达 MySql 应用程序的地址应该是10.32.0.2:3306,这是网络中他可以找到所需信息的最后一个节点。

endpoints in k8s

一个 简单的例子: 我想访问谷歌邮件在这种情况下为我/浏览器的端点将是 Gmail.com: 443类似上面的例子[ Pod-IP ] : [ service-Port ]