当前位置 博文首页 > 阳阳的博客:【K8S】Service再了解

    阳阳的博客:【K8S】Service再了解

    作者:[db:作者] 时间:2021-08-15 10:06

    关于Service的概念及其实例,可以参考这篇文章【K8S】Service概念及其实例


    一句话概括Service的作用,Service负责将客户端的请求转发到具有特定标签的Pod上。

    但是Service和Pod并不是直接相连的,Pod的ip及端口会被保存在Service的EndPoints列表中,查看一个Service的EndPoints的命令是

    kubectl? get ?endpoints? service名称? -n? 命名空间


    Service类型

    【1】ClusterIP: 只能被集群内部的应用访问,没指定这个字段时,默认就是ClusterIP,k8s会自动给service分配一个IP。

    【2】NodePort

    顾名思义,在某个节点上开放一个端口,用于将请求转发到对应的Service端口上,Service再查询EndPoints列表,最后将请求转发到具体的Pod上。

    采用NodePort方式的简单Service样例

    apiVersion: v1
    kind: Service
    metadata:
      name: Service-nodePort
    spec:
      clusterIp: 100.10.10.9
      type: NodePort  //设置为NodePort
      ports:
      - port: 80           //clusterIp监听端口
        targetPort: 8080   //pod监听端口
        nodeport: 30123    //node监听端口
      selector:
        app: test

    只要我们访问这个节点的ip:30123,然后流量会转发到该service的clusterIp:80端口上,再转发到endPoints列表中的地址(即pod的ip:port)上,此时流量已经到了pod上,pod最后将流量下发到该Pod上的容器的8080端口上,由容器完成对请求的处理。

    使用NodePort方式,可以被集群外部的应用访问,但是nodeport的值只能在【30000,30767】之间。

    【3】HeadLess

    顾名思义,无头服务。

    无头服务是一个不需要clusterIp的服务,那么配置一个headLess类型的Service时,只需要将spec.clusterIp设置为None。后端的pod和该service通过标签选择器绑定,k8s直接可以根据无头服务的标签解析到对应的pod

    【4】ExternalName

    当pod内的客户端去访问kubernes集群外的服务,ExternalName便用于实现于此。

    当Service类型是ExternalName时,Service所关联的不是本地Pod应用,而是集群外部的服务。从而实现集群内部的Pod应用调用集群外部的服务,可以把集群外部的服务当作内部服务一样去调用它。当Service类型是ExternalName时,spec.externalName字段才生效。这个字段值应该是一个CNAME记录。


    如何暴露服务?

    第一种方式,通过Ingress暴露服务

    Ingress更像是请求的引路人,可以依据请求的地址,转发到对应的service上。

    一个简单的实例

    apiVersion: v1
    kind: Ingress
    metadata:
      name: Ingress-test
    spec:
      rules:
      - host: test.example.com
        http:
          paths:
          - path: /a                //对test.example.com/a请求转发至s1服务
            backend:
              serviceName: s1
              servicePort:80
          - path: /b                //对test.example.com/b请求转发至s2服务
            backend:
              serviceName: s2
              servicePort:80

    该ingress实例,可以将对一个主机的不同访问路径转发到不同的服务上

    当然,这里的host为数组,说明Ingress可以将对不同主机的不同访问路径转发到不同的服务上,更加灵活。


    未完

    cs
    下一篇:没有了