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-generated 和 manual 这两个术语来代替 - 这会更准确,但我认为也更令人困惑。
在大多数情况下,当 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 中的“端点”是啥?的主要内容,如果未能解决你的问题,请参考以下文章