一、将服务暴露给外部客户端的几种方式:
    1、服务类型为NodePort: 每个集群节点都会在节点上打开一个端口,并将该端口接受到的流量重定向到基础服务。该服务仅在内部集群IP和端口上才可以访问,也可以通过所有节点上的专用端口访问。
    2、服务类型为LoadBalance: nodeport类型的一种扩展,服务可以通过一个专用的负载均衡器来访问,一般由云服务基础设施提供的。客户端通过负载均衡器的IP访问到服务
    3、创建一个Ingress资源: 这是个完全不同的机制,通过一个IP地址公开多个服务。运行在HTTP层。
二:三种服务类型详解
    1、使用NodePort类型服务
    示例:
    apiVersion: v1
    metadata:
      name: kubia-nodeport
     spec:
       type: NodePort     #类型为NodePort的服务
       ports:
       - port: 80   #服务集群IP的端口号
        targetPort: 8080 #背后pod的目标端口
        nodePort: 30123  #通过集群阶段的30123端口可以访问该服务
      selector:
        app: kubia 

     设置类型为NodePort并指定该服务应该绑定到的所有集群节点的节点端口。指定端口不是强制性的,可以随机。
     kubectl get svc kubia-nodeport #查看名为kubia-nodeport的基础信息
     显示结果EXTWENAL-IP列显示nodes,表明服务可以通过任何集群节点的IP访问。
     PORT(s) 列显示通过集群IP访问的端口和nodeport类型映射的端口。
     * 如果要对外提供服务,可以通过JSONPath获取所有节点的IP
       kubectl get  nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'   #获取所有node ip
       注: 
       A、浏览item属性中的所有元素
       B、对于每个元素输入status属性
       C、过滤address属性的元素,仅包含具有将type属性设置为ExternalIP的元素。
       D、打印过滤元素address属性
          curl http://nodeip:30123 访问到pod。

2、通过负载均衡将服务暴露出来
        场景:
            K8S部署在云基础设施上的时候,可以创建一个load badancer 类型服务,负载均衡拥有独一无二的公网IP,可以通过负载均衡器的IP访问服务。
        示例:
        apiVersion: v1
        kind: Service
        metadata:
          name: kubia-loadbalancer
        spec:
          type:  LoadBalancer   #该服务从k8s集群的基础架构获取负载均衡器
          ports:
          - port: 80
            targetPort: 8080
          selector:
            app: kubia
        kubectl get svc kubia-loadbalancer  
        EXTERNAL-IP 列显示的IP为负载均衡IP ,可以直接对外提供服务。
    3、通过Ingress 暴露服务
        使用ingress的重要原因是LB需要为每个服务提供一个公网IP而ingress直接使用主机名和路径就可以用一个公网IP为多个服务提供外部访问。ingress工作在应用层(7层)
        1、创建Ingress资源
        示例:
        apiVersion: extensions/v1beta1
        kind: Ingress
        metadata:
          name: kubia
        spec:
          rules:
          - host: kubia.example.com  #Ingress 将域名映射到服务
            http: 
              paths:
              - path: /
                backend:
                  serviceName: kubia-nodeport   #将所有请求发送到kubia-nodeport服务的80端口
                  servicePort: 80
        
        2、获取ingress的IP
            kubectl get  ingresses
            #ADDRESS 列则显示IP
            知道IP后通过DNS解析,将域名解析到IP上。
            现在可以通过 http://kubia.example.com访问到pod
        3、通过Ingress暴露多个服务
            (1) 根据相同主机,不同路径
            .....
             - host: kubia.example.com
               http:
                 paths:
                 - path: /kubia        #对kubia.example.com/kubia的请求转发至kubia服务
                   backend:
                     serviceName: kubia  
                     servicePort: 80
                 - path: /foo        #对kubia.example.com/foo的请求转发至 bar服务。
                   backend:
                     serviceName: bar
                     serviceName: 80 
            (2) 根据不同的主机名转发
                spec: 
                  rules: 
                  - host: foo.example.com
                    http:
                      paths:
                      - path: /
                        backend:
                          serviceName: foo  #将foo.example.com转发到foo服务
                          servicePort: 80
                  - host: bar.example.com
                    http:
                      paths:
                      - path: /
                        backend:
                          serviceName: bar   #将bar.example.com转发到bar服务
                          servicePort: 80