Kubernetes – 服务(Service)

服务是对外提供服务的网络组件,在Kubernetes,服务通常用来实现微服务。

从内部来看,服务可以被定义为一组pod之上的抽象,对外提供了可供访问的IP地址和DNS名称。使用服务,可以很容易地管理pod负载均衡与弹性伸缩。

定义服务

假设有一组pod,每个pod监听TCP端口9376,并带一个标签 app=MyApp,可以使用yaml定义服务:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

该规范创建了一个名为“my-service”的新服务对象,它的目标是带有app=MyApp标签的所有Pod,目标端口是TCP端口9376。

Kubernetes为该服务分配一个IP地址(有时称为“ClusterIP”),由服务代理使用,ClusterIP只能在集群内访问。

服务选择器的控制器不断地扫描匹配的pod,然后更新Endpoint/端点对象(名称也是“my-service”)。

由于许多服务需要公开多个端口,Kubernetes支持在一个服务对象上定义多个端口。每个端口定义可以有不同协议。

没有选择器的服务

服务通常用来抽象对Pod的访问,但它们也可以用来抽象其他类型的后端。例如: 将服务指向另一个命名空间/另一个集群中的服务。

在这样的场景中,可以定义一个没有Pod选择器的服务。例如:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

由于此服务没有选择器,因此不会自动创建相应的端点对象。你可以手动将服务映射到它的网络地址和端口,方法是手动添加一个端点对象:

apiVersion: v1
kind: Endpoints
metadata:
  name: my-service
subsets:
  - addresses:
      - ip: 192.0.2.42
    ports:
      - port: 9376

多端口服务

对于某些服务,需要公开多个端口。Kubernetes允许你在一个服务对象上配置多个端口定义。当为一个服务使用多个端口时,你必须给出所有端口的名称,这样它们才不会有歧义。例如:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376
    - name: https
      protocol: TCP
      port: 443
      targetPort: 9377

注意:
与一般的Kubernetes名称一样,端口的名称必须只包含小写字母、数字和-。端口名还必须以字母、数字开头和结尾。
例如,名称123-abcweb有效,但是123_abc-web无效。

暴露服务(ServiceTypes)

有时希望将服务暴露到外部IP地址(位于集群之外),让外部能够访问,例如App客户端需要能访问后端服务。

Kubernetes ServiceTypes允许你指定想要的服务类型。默认是ClusterIP。

ClusterIP

在集群内部IP上暴露服务。选择此值将使服务只能从集群内访问。这是默认值。

NodePort

在每个节点的IP及静态端口(NodePort)上暴露服务。你可以通过请求<NodeIP>:<NodePort>来从集群外部访问NodePort服务。

示例:

apiVersion: v1
kind: Service
metadata:
  name: nginx1
  labels:
    app: nginx1
spec:
  type: NodePort
  ports:
    - port: 81
      targetPort: 80
      nodePort: 30081
  selector:
    app: nginx1

LoadBalancer

使用云提供商的负载均衡器向外部暴露服务。

ExternalName

通过返回CNAME记录,将服务映射到externalName字段内容(例如,foo.bar.example.com)。

另外,还可以使用Ingress来暴露服务。Ingress不是一种服务类型,而是作为集群的入口点,它可以暴露同一IP地址下的多个服务。



浙ICP备17015664号 浙公网安备 33011002012336号 联系我们 网站地图  
@2019 qikegu.com 版权所有,禁止转载