0
点赞
收藏
分享

微信扫一扫

K8s之Service学习

邯唐情感 2022-04-15 阅读 54

Service主要用于提供网络服务,通过Service的定义,能够为客户端应用提供稳定的访问地址(域名或IP地址)和负载均衡功能,以及屏蔽后端Endpoint的变化,是Kubernetes实现微服务的核心资源。

1 Service基础

1.1 从案例认识service

一个提供Web服务的Pod集合,由三个Tomcat容器副本组成,每个容器提供的服务端口号都为8081:

apiVersion: apps/v1
kind: Deployment  
metadata:
  name: webapp
spec:
  selector :
    matchLabels:
      app: webapp
  replicas: 3
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: tomcat
        ports:
        - containerPort: 8081

客户端应用可以直接通过这些Pod的IP地址和端口号8081访问Web服务。

现在将service加进来,使用如下命令创建service

查看新创建的Service,可以看到系统为它分配了一个虚拟IP地址(ClusterIP地址),Service的端口号则从Pod中的containerPort复制而来。接下来就可以通过Service的IP地址和Service的端口号访问该Service,访问被自动负载分发到了后端三个Pod之一。

当然也可以使用过yaml文件创建service

apiVersion: v1
kind: Service  
metadata:
  name: webapp
spec:
  selector :
    app: webapp
  ports:
  - protocol: TCP
    port: 8081
    targetPort: 8081

一个Service对应的“后端”由Pod的IP和容器端口号组成,即一个完整的“IP:Port”访问地址,这在Kubernetes系统中叫作Endpoint。

1.2 负载均衡机制

从服务IP到后端Pod的负载均衡机制,则是由每个Node上的kube-proxy负责实现的。

1)kube-proxy的代理模式:

2)会话保持机制

保证同一个外部IP一直访问同一个后端pod,同时,用户可以设置会话保持的最长时间

apiVersion: v1
kind: Service  
metadata:
  name: webapp
spec:
  sessionAffinity:ClientIP
  sessionAffinityConfig:
    clientIP:
        timeoutSeconds:1000s
  selector:
    app: webapp
  ports:
  - protocol: TCP
    port: 8081
    targetPort: 8081

1.3 多端口服务

Service可以设置多个端口号来分别提供不同的服务:

apiVersion: v1
kind: Service  
metadata:
  name: webapp
spec:
  selector :
    app: webapp
  ports:
   -port: 8081
    targetPort: 8081
    name:web
   -port:8082
    targetPort: 8082
    name:management

或者同一个端口号使用的协议不同,如TCP和UDP,也可以为多个端口号来提供不同的服务

1.4 定义外部服务

普通的Service通过Label Selector对后端Endpoint列表进行了一次抽象,如果后端的Endpoint不是由Pod副本集提供的,则Service还可以抽象定义任意其他服务。

用户在创建Service资源对象时不设置Label Selector(后端Pod也不存在),同时再定义一个与Service关联的Endpoint资源对象,在Endpoint中设置外部服务的IP地址和端口号

 1.5 将service暴露出去

Kubernetes为Service创建的ClusterIP地址是对后端Pod列表的一层抽象,对于集群外部来说并没有意义,但有许多Service是需要对集群外部提供服务的,Kubernetes提供了多种机制将Service暴露出去,供集群外部的客户端访问。可以通过Service资源对象的类型字段“type”进行设置:

apiVersion: v1
kind: Service  
metadata:
  name: webapp
spec:
  tyoe:NodePort
  selector:
    app: webapp
  ports:
   -port: 8081
    targetPort: 8081
    nodePort:8081

2 DNS服务

作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,这就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP地址的解析。DNS服务在Kubernetes的发展过程中经历了3个阶段:

 

 

附录:

Service的YAML格式文件定义

各属性的说明如下表:

举报

相关推荐

0 条评论