美文网首页容器云平台
浅析Kubernrtes服务类型(Service Types)

浅析Kubernrtes服务类型(Service Types)

作者: 空壳先生 | 来源:发表于2020-09-27 15:50 被阅读0次

    先上图


    image.png

    在Kubernetes集群中,service通过标签选择器选着对应的pod,然后对请求进行转发,看个动画,能直接了当体会到便签选择器


    k8s_service.gif

    pod,endpoints,service三者关系

    1、举个栗子说明
    先看部署文件,主要看注释部分。因为文件太长,本文删除了yaml文件的部分字段

    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: gogs
      labels:       # 定义StatefulSet的标签,为后面Service选择器提供标签
        app: gogs
    spec:
      serviceName: gogs
      replicas: 1
      selector:
        matchLabels:  # 标签选择器,StatefulSet通过该标签选择pod
          app: gogs
      template:
        metadata:
          labels:    # 定义pod的标签
            app: gogs
        spec:
          terminationGracePeriodSeconds: 180
    .......
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: gogs
      labels:
        app: gogs
    spec:
      type: NodePort
      ports:
      - port: 3000
        targetPort: 3000
      selector:      # 标签匹配器,Service通过该标签匹配到对应的Pod
        app: gogs
    

    2、查看运行结果

    [root@k8s-node001 ~]# kubectl  get po,ep,svc
    NAME                                READY   STATUS    RESTARTS   AGE
    pod/gogs-0                          1/1     Running   0          3d1h
    
    NAME                   ENDPOINTS                                                        AGE
    endpoints/gogs         100.68.150.197:3000                                              3d1h
    
    NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    service/gogs         NodePort    10.106.102.74   <none>        3000:30526/TCP   3d1h
    

    3、通过kubectl describe来查看pod,endpoints,service详情


    image.png

    4、从上图可以看出关联信息:

    1、Pod和Endpoint的的IP是一致的,Endpoint是用来映射那些能对外提供服务的pod,如果pod运行状态不是running,就不会产出Endpoint
    2、StatefulSet 和 Pod 的关系是通过 label-selector 来关联的
    3、 Service可以简单理解为 Kubernetes 内置的一个 LoadBalancer,它的作用就是给多个 Pod 提供负载均衡。
    4、Service通过标签 app: gogs来匹配它所要做负载均衡的 Pod
    

    好了,对pod,endpoints,service三者关系做了简单介绍,接下来我们来介绍Kubernetes中的几种Service Type

    ClusterIP

    通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的 ServiceType
    缺点:服务只能够在集群内部可以访问
    栗子

    apiVersion: v1
    kind: Service
    metadata:
      name: gogs-clusterip
    spec:
      type: ClusterIP
      ports:
      - port: 3000
        targetPort: 3000
      selector:
        app: gogs
    

    结果

    NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    gogs-clusterip   ClusterIP   10.104.1.9      <none>        3000/TCP         2m11s
    

    可以看到10.104.1.9是集群内部的一个IP,在集群外是无法访问到的

    NodePort

    如果将 type 字段设置为 NodePort,则 Kubernetes将在指定的范围内分配端口(默认值:30000-32767)。 每个节点将随机分配的端口代理到服务中。
    举栗子

    apiVersion: v1
    kind: Service
    metadata:
      name: gogs
    spec:
      type: NodePort
      ports:
      - port: 3000
        targetPort: 3000
      selector:
        app: gogs
    

    结果

    NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    gogs             NodePort    10.106.102.74   <none>        3000:30526/TCP   3d2h
    

    这里可以看到,随机分配了端口30526,现在可以通过集群任意节点的IP+30526访问到该服务

    Ingress

    Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
    可以将 Ingress 配置为服务提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及提供基于名称的虚拟主机等能力。 Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。
    栗子

    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: gogs-gogs
      annotations:
        kubernetes.io/ingress.class: nginx
    spec:
      rules:
      - host: gogs.test.cn
        http:
          paths:
          - path: /
            backend:
              serviceName: gogs
              servicePort: 3000
    

    结果

    NAME    CLASS    HOSTS             ADDRESS       PORTS   AGE
    gogs-gogs   <none>    gogs.test.cn   10.26.25.21   80      3d19h
    

    现在通过域名gogs.test.cn就可以访问到gogs了
    注意,gogs.test.cn需要自行添加DNS解析到ingress所在机器的IP

    LoadBalancer

    创建服务时,你可以选择自动创建云网络负载均衡器。这提供了一个外部可访问的 IP 地址, 可将流量分配到集群节点上的正确端口上,LoadBalancer一般都是公有云厂商提供,不需要自建,这里就介绍了。

    相关文章

      网友评论

        本文标题:浅析Kubernrtes服务类型(Service Types)

        本文链接:https://www.haomeiwen.com/subject/dwkluktx.html