k8s中,Service用于将一组Pod封装为一个服务,提供一个统一的入口,并在需要提供服务时按照特定的访问策略,访问后端Pod。Service工作于TCP/IP网络的传输层,支持TCP、UDP协议。
关于服务发现:我们都知道微服务的概念,在k8s中,Service负责封装服务,在同一命名空间下任意Pod中,我们可以直接通过服务名作为host访问一个服务,如果Service关联了多个Pod实例,k8s会自动进行负载均衡,实际上k8s和SpringCloud在功能上具有一些重合的部分。
ClusterIP
:通过一个集群内布IP提供服务,无法在集群外部访问NodePort
:通过一个可供外部访问的IP提供服务,实际上是在每个Node上都打开了同一个端口LoadBalance
:通过外部负载均衡器访问,一般用于网关上对于ClusterIP
类型的Service,我们可以在集群内部以Service名的方式访问,比如一个叫做order
的Service提供HTTP服务,底层关联了一个开启8080
端口的Pod,我们就可以在集群同一命名空间内内以http://order:8080/
路径访问该服务。
除此之外,实际上我们也可以跨命名空间访问服务,如果order
服务在dev
命名空间,那么在其它命名空间中我们就可以使用http://order.dev.svc.cluster.local:8080/
访问该服务。
下面例子是我们之前使用过的一个Service配置文件,这里我们再详细介绍一下。
apiVersion: v1
kind: Service
metadata:
labels:
app: portal
name: portal
spec:
type: ClusterIP
ports:
- name: http
protocol: TCP
port: 8080
targetPort: 8080
selector:
app: portal
status:
loadBalancer: {}
spec.type
:Service的类型,可选值为前面介绍的三种,默认为ClusterIP
spec.selector
:标签选择器,该字段用于和Pod建立关联关系spec.ports[].name
:端口配置名,以小写字母和中线组成,用于说明该端口的用途spec.ports[].protocol
:协议,支持TCP或UDPspec.ports[].port
:集群内部提供服务的端口spec.ports[].targetPort
:容器的端口spec.ports[].nodePort
:用于NodePort模式,在Node上打开的可供外部访问的端口,如未指定,则随机选择一个通过yaml配置文件部署Service:
kubectl apply -f <yaml配置文件>
查看当前所有Service:
kubectl get svc
查看Service详细信息:
kubectl describe svc <Service名称>
删除Service:
kubectl delete svc <Service名称>
default命名空间下默认有一个名为Kubernetes
的Service,它由k8s本身创建,用于集群中的Pod访问apiserver
,注意生产环境中操作时不要误删。不过其实误删问题也不大,它很快就会被自动重建。