简介
Kubernetes的endpoint(终结点)是用于将服务绑定到集群中其他组件的网络地址。Endpoint为服务提供了一个稳定的虚拟IP地址,它会负责将流量从Service路由到后端Pod。
下面是使用Kubernetes的endpoint的详细步骤:
- 创建一个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端口。
- Kubernetes将在集群中的每个节点上创建一个虚拟IP(ClusterIP),用于表示Service。
- 创建一个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端口。
- 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的关系:
Endpoints表示一个Service对应的所有pod副本的访问地址。
Node上的Kube-proxy进程获取每个Service的Endpoints,实现service的负载均衡功能。
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