Endpoint (ep) #
Endpoints表示了一个Service对应的所有Pod副本的访问地址,它负责监听Service和对应的Pod副本的变化
- 如果监测到Service被删除,则删除和该Service同名的Endpoints对象
- 如果监测到新的Service被创建或修改,则根据该Service信息获得相关的Pod列表,然后创建或更新Service对应的Endpoints对象
- 如果监测到Pod的事件,则更新它对应的Service的Endpoints对象
kube-proxy进程获取每个Service的Endpoints,实现Service的负载均衡功能
Service (svc) #
k8s只有两种 service session affinity:None and ClientIP
- None:随机选择一个pod
- ClientIP:将同一个客户ip的请求转发同一个pod
没有基于cookie的选项,因为 Service 只处理 TCP、UDP 数据包,而cookie是HTTP层的
每个 Service 都有内部DNS域名,全限定域名 FQDN
<service-name>.<namespace-name>.svc.cluster.local
也可以简写为 <service-name>.<namespace-name>
同一个名称空间下pod也可以直接用简写 <service-name>
域名来访问
- CLUSTER-IP 只能在集群内部访问
- EXTERNAL-IP 对外访问
对外访问 NodePort #
集群所有节点都会暴露端口,如果没有指定端口,将随机选一个端口
apiVersion: v1
kind: Service
metadata:
name: kubia
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 30123 通过节点的30123端口可以访问该服务
selector:
app: kubia
EXTERNAL-IP 显示为 nodes,表示通过任何集群节点IP都可访问
对外访问 LoadBalancer #
NodePort类型的扩展,也会暴露端口,如果没有指定端口,将随机选一个端口
可以通过 EXTERNAL-IP 来访问,有负载均衡功能
apiVersion: v1
kind: Service
metadata:
name: kubia
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: kubia
注意:k8s默认没有提供LB实现,创建 LoadBalancer 类型的 Service 会保持 pending 状态
对外访问 ExternalName #
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ExternalName
externalName: my.database.example.com
ExternalName 类型的 Service,其实是在 kube-dns 里为你添加了一条 CNAME 记录
这时,访问 my-service.default.svc.cluster.local 就和访问 my.database.example.com 这个域名是一个效果了