什么是Kubernetes的"终点"?

Chr*_*ris 25 endpoint kubernetes

我是Kubernetes的新手并开始阅读文档.通常使用术语"端点",但文档缺乏明确的定义.

什么是Kubernetes的"终点"?它在哪里?

我可以想象'端点'是某个'节点'的某种接入点,但这只是猜测.

Chr*_*row 33

端点是一个对象,它获取分配给它的各个 Pod 的 IP 地址。然后,端点对象又被 kubernetes 服务引用,以便该服务记录 pod 的内部 IP,以便能够与它们通信。我们需要端点作为抽象层,因为 kubernetes 中的“服务”充当编排的一部分,以确保将流量分配到 pod(包括仅将流量发送到健康的 pod)。例如,如果 Pod 死亡,则会生成具有新 IP 地址的替换 Pod。从概念上讲,死的 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 之间的关系很有用。这张图很好地总结了它:

在此处输入图片说明

  • 为什么用户向 Node(10.10.50.51) 发送请求而不是 clusterIP(10.111.239.70)? (3认同)

Mic*_*las 22

虽然你是正确的,但在词汇表中确实没有端点条目,它是一个定义明确的Kubernetes网络概念或抽象.由于它具有次要性质,因此通常不会直接操纵它.已定义核心资源Endpoint,并且命令行也支持它:

$ kubectl get ep
NAME         ENDPOINTS            AGE
kubernetes   192.168.64.13:8443   10d
Run Code Online (Sandbox Code Playgroud)

在那里你可以看到它的有效性:IP地址和端口.通常,您可以让服务管理端点(服务将流量路由到每个Pod的一个EP),但如果您有需要它的用例,也可以手动管理它们.

  • 在进一步阅读Kubernetes中的"端点"之后,我现在将其理解为[REST API端点](https://smartbear.com/learn/performance-monitoring/api-endpoints/)的面向对象表示,其填充在[Kubernates API服务器](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/).因此,就Kubernetes而言,"端点"是访问其资源的方式(例如Pod) - "端点"背后的资源. (5认同)
  • 感谢您的回答。确实没有在术语表中定义端点很有趣。我知道这不是Kubernetes专有的术语,但是Service也不是。或服务帐户。或音量。或节点。或容器! (2认同)

Rtm*_*tmY 16

我会一一回答你的问题:


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

(K8S 中的资源名称是 Endpoint s)。

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

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

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

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

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


它位于哪里?

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


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

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

如果它是一个内部端点(这意味着 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>
Run Code Online (Sandbox Code Playgroud)

或直接使用:

$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
Run Code Online (Sandbox Code Playgroud)

关于外部端点:

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

apiVersion: v1
kind: Service
metadata:
  name: my-service #<------ Should match the name of Endpoints object
spec:
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 9376
Run Code Online (Sandbox Code Playgroud)

因此不会自动创建相应的 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
Run Code Online (Sandbox Code Playgroud)

注意:)我使用术语internal表示与标签选择器匹配的 pod 的自动生成的 Endpoints 和术语external表示手动创建的 Endpoints。

我可以改用自动生成手动这两个术语——那样会更准确,但我认为也更令人困惑。

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


Mar*_*arc 9

Pod通过端点将自身暴露给服务。这是您是否可以加入吊舱的一部分。

参见此处:服务和端点

  • 这有点还原了。服务流量也可以来自集群内的其他 Pod。请注意,实际上,网络流量不会像负载均衡器那样停止在服务上;而是会在服务上停止。该服务是 DNS 和 iptables 的抽象,以便将发往该服务的流量直接路由到端点。 (3认同)

小智 9

将端点视为“到达应用程序的最终目的地”或“最后的某种东西”

正如您在下面的示例中看到的:pod-IP = 10.32.0.2,service-Port * = 3306,endpoint = [pod-IP]:[service-Port]

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

k8s 中的端点

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