简介

Kubernetes的endpoint(终结点)是用于将服务绑定到集群中其他组件的网络地址。Endpoint为服务提供了一个稳定的虚拟IP地址,它会负责将流量从Service路由到后端Pod。

下面是使用Kubernetes的endpoint的详细步骤:

  1. 创建一个Service资源定义,该Service将绑定到一组Pod:
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: backend
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 80

该示例创建了一个名为my-service的Service,它将选择带有"app=backend"标签的Pod,并将流量路由到Pod的80端口。

  1. Kubernetes将在集群中的每个节点上创建一个虚拟IP(ClusterIP),用于表示Service。
  2. 创建一个Endpoint资源定义,将Service绑定到后端Pod的IP地址和端口:
apiVersion: v1
kind: Endpoints
metadata:
  name: my-service
subsets:
  - addresses:
      - ip: 10.0.0.1
      - ip: 10.0.0.2
    ports:
      - port: 80

该示例创建了一个名为my-service的Endpoint,该Endpoint将流量路由到两个IP地址为10.0.0.1和10.0.0.2的Pod的80端口。

  1. Kubernetes会自动将创建的Endpoint与Service进行关联,使得Service可以通过Endpoint来发现后端Pod,并进行负载均衡。

当使用该Service进行通信时,Kubernetes会将流量路由到该Service的虚拟IP地址,然后通过Endpoint将流量转发到后端Pod的实际IP地址和端口。

举个例子,假设我们有一个运行两个Pod的应用程序,并且这些Pod具有"app=backend"的标签。我们创建了一个Service来暴露这两个Pod,并使用Endpoint将它们绑定到Service。现在,我们可以使用Service的虚拟IP地址来与后端Pod进行通信,而不必关心具体的后端Pod IP地址。

请注意,Endpoint是由Kubernetes自动管理的,并且通常不需要直接进行手动操作。它主要用于内部流量路由和服务发现。

注意的地方

Endpoint是可被访问的服务端点,即一个状态为running的pod,它是service的访问的落点,只有service关联的pod才可能成为endpoint。

Endpoint、service和pod的关系:

Kubernetes的endpoint_云原生


Endpoints表示一个Service对应的所有pod副本的访问地址。

Node上的Kube-proxy进程获取每个Service的Endpoints,实现service的负载均衡功能。

Kubernetes的endpoint_kubernetes_02

Endpoints Controller

Endpoints Controller就是负责生成和维护所有Endpoints对象的控制器,它负责监听Service和对应的Pod副本的变化。

如果检测到Service被删除,则删除和该Service同名的Endpoints对象。

如果检测到新的Service被创建或者修改则根据该Service信息获得相关的Pod列表,然后创建或者更新Service对应的Endpoints对象。

外部服务与endpoints

手动创建endpoints,添加外部服务的endpoint,可以将外部服务作为kubernetes的service使用。
etcd有3节点部署在外部,为其创建service: etcd-k8s,不指定podSelector:

apiVersion: v1
kind: Service
metadata:
  name: etcd-k8s
  namespace: kube-system
spec:
  type: ClusterIP
  ports:
  - name: port
    port: 2379
    protocol: TCP

创建同名的endpoints资源: etcd-k8s,将etcd节点的ip+port填进去:

apiVersion: v1
kind: Endpoints
metadata:
  name: etcd-k8s
  namespace: kube-system
subsets:
- addresses:
  - ip: 178.104.163.38
    nodeName: etc-master1
  - ip: 178.104.163.187
    nodeName: etc-master2
  - ip: 178.104.163.243
    nodeName: etc-master3
  ports:
  - name: port
    port: 2379
    protocol: TCP

这样,通过serviceName.namespace:port就可以在kubernetes集群内访问外部的etcd服务:

etcd-k8s.kube-system:2379