一个Kubernetes的
Service
是一种抽象,它定义了一组
Pods
的逻辑集合和一个用于访问它们的策略 - 有的时候被称之为微服务。一个
Service
的目标
Pod
集合通常是由
Label Selector
来决定的(下面有讲一个没有选择器的
Service
有什么用处)。
举个例子,想象一个处理图片的后端运行了三个副本。这些副本都是可以替代的 - 前端不关心它们使用的是哪一个后端。尽管实际组成后端集合的
Pod
可能会变化,前端的客户端却不需要知道这个变化,也不需要自己有一个列表来记录这些后端服务。
Service
抽象能让你达到这种解耦。
不像
Pod
的 IP 地址,它实际路由到一个固定的目的地,
Service
的 IP 实际上不能通过单个主机来进行应答。相反,我们使用
iptables
(Linux 中的数据包处理逻辑)来定义一个虚拟IP地址(VIP),它可以根据需要透明地进行重定向。当客户端连接到 VIP 时,它们的流量会自动地传输到一个合适的 Endpoint。环境变量和 DNS,实际上会根据
Service
的 VIP 和端口来进行填充。
作为一个例子,考虑前面提到的图片处理应用程序。当创建 backend
Service
时,Kubernetes master 会给它指派一个虚拟 IP 地址,比如 10.0.0.1。假设
Service
的端口是 1234,该
Service
会被集群中所有的
kube-proxy
实例观察到。当代理看到一个新的
Service
, 它会打开一个新的端口,建立一个从该 VIP 重定向到新端口的 iptables,并开始接收请求连接。
metadata: name:my-service annotations: service.beta.kubernetes.io/aws-load-balancer-access-log-enabled:"true" # Specifies whether access logs are enabled for the load balancer service.beta.kubernetes.io/aws-load-balancer-access-log-emit-interval:"60" # The interval for publishing the access logs. You can specify an interval of either 5 or 60 (minutes). service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-name:"my-bucket" # The name of the Amazon S3 bucket where the access logs are stored service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-prefix:"my-bucket-prefix/prod" # The logical hierarchy you created for your Amazon S3 bucket, for example `my-bucket-prefix/prod`