Service服务

k8s中,Service用于将一组Pod封装为一个服务,提供一个统一的入口,并在需要提供服务时按照特定的访问策略,访问后端Pod。Service工作于TCP/IP网络的传输层,支持TCP、UDP协议。

关于服务发现:我们都知道微服务的概念,在k8s中,Service负责封装服务,在同一命名空间下任意Pod中,我们可以直接通过服务名作为host访问一个服务,如果Service关联了多个Pod实例,k8s会自动进行负载均衡,实际上k8s和SpringCloud在功能上具有一些重合的部分。

Service的类型

  • ClusterIP:通过一个集群内布IP提供服务,无法在集群外部访问
  • NodePort:通过一个可供外部访问的IP提供服务,实际上是在每个Node上都打开了同一个端口
  • LoadBalance:通过外部负载均衡器访问,一般用于网关上

ClusterIP方式访问Service

对于ClusterIP类型的Service,我们可以在集群内部以Service名的方式访问,比如一个叫做order的Service提供HTTP服务,底层关联了一个开启8080端口的Pod,我们就可以在集群同一命名空间内内以http://order:8080/路径访问该服务。

除此之外,实际上我们也可以跨命名空间访问服务,如果order服务在dev命名空间,那么在其它命名空间中我们就可以使用http://order.dev.svc.cluster.local:8080/访问该服务。

Service例子

下面例子是我们之前使用过的一个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或UDP
  • spec.ports[].port:集群内部提供服务的端口
  • spec.ports[].targetPort:容器的端口
  • spec.ports[].nodePort:用于NodePort模式,在Node上打开的可供外部访问的端口,如未指定,则随机选择一个

Service相关操作

通过yaml配置文件部署Service:

kubectl apply -f <yaml配置文件>

查看当前所有Service:

kubectl get svc

查看Service详细信息:

kubectl describe svc <Service名称>

删除Service:

kubectl delete svc <Service名称>

default命名空间下的Service

default命名空间下默认有一个名为Kubernetes的Service,它由k8s本身创建,用于集群中的Pod访问apiserver,注意生产环境中操作时不要误删。不过其实误删问题也不大,它很快就会被自动重建。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap