服务(Service)
由于一下原因,我们需要引入Service:
- pod是短暂的,它们随时会启动或者关闭
- Kubernetes在pod启动前会给已经调度到节点上的pod分配IP地址,因此客户端不能提前知道提供服务的pod的IP地址
- 水平伸缩意味着多个pod可能会提供相同的服务,每个pod都有自己的IP
YAML描述文件:
1 | apiVersion: v1 |
pod中可以使用端口命名,所以在Service中配置 targetPort
可以使用pod端口名称,方便端口维护
我们也可以不使用标签选择器,而使用 ExternalName
来连接外部服务:
1 | ... |
ExternalName 服务仅在DNS级别实施(为Service创建了简单的CNAME DNS)
endpoint
使用命令 kubectl describe svc <service-name>
可以看到 Endpoint
信息:
1 | ... |
当service中定义了pod标签选择器,选择器用于构建IP和端口列表,存储在Endpoint资源中,如果service没有定义寻择期则不会创建Endpoint,我们可以手动创建:
1 | apiVersion: v1 |
暴露服务
向外部公开服务
NodePort
每个集群节点都会在节点上打开一个端口,并将在该端口上接收到的流量重定向到基础服务,该服务仅在内部集群IP和端口上才可访问,但也可以通过所有节点上的专用端口访问
1 | apiVersion: v1 |
这时EXTERNAL-IP显示EXTERNAL-IP:30123
或者 CLUSTER-IP:30123
来访问服务
1 | kubectl get svc my-service |
LoadBalancer
1 | apiVersion: v1 |
1 | kubectl get svc my-service |
可以通过负载均衡IP:130.211.53.173访问服务
Ingress
相比与 LoadBalancer 服务都需要自己的负载均衡器以及独有的公有IP地址,Ingress 只需要一个公网IP就能为许多服务提供访问
1 | apiVersion: networking.k8s.io/v1beta1 |
Ingress执行流程: