Kubernetes(二十)Service

service是将一组运行Pods上的应用程序公开为网络服务的抽象方法
 
  • 为什么要有service
    • pod具有不停销毁、创建的特征,每个Pod又有自己分配的IP,Pod的创建、销毁意味着IP不停的变更,前端如何跟踪IP地址变得非常困难,service就是来解决这个问题的。它可以实现监控Pod的变化,并对外提供一个固定的访问入口(负载均衡的入口);
  • Endpoints
    • 通过endpoints,我们可以知道service后面关联的pods情况;endpoints会随着pods的变化而变化。service和pod通过labels关联。
    • kubectl get endpoints #查看endpoints    
  • Service的意义
    • 防止Pod失联
    • 定义一组Pod的访问策略(负载均衡,默认是轮询)
    • 支持ClusterIP、NodePort、LoadBalancer三种类型 
      • 官网链接 https://kubernetes.io/zh/docs/tutorials/services/source-ip/#type-clusterip-%e7%b1%bb%e5%9e%8b-services-%e7%9a%84-source-ip
      • ClusetrIp :默认分配一个集群内部可以访问的的虚拟IP(VIP)(不能外网访问)。
      • NodePort:在每个node上分配一个端口作为外部访问入口,端口建议固定,不要随机分配(可以通过每个节点外网IP访问,使用SLB绑定节点IP实现负载均衡)。
      • LoadBalancer:工作在特定的Cloud provider上。例如google cloud,AWS, OpenStack (不用我们自己配置SLB 里面的Node服务器,自己接入负载均衡)   
    • service底层实现主要有Iptables和IPVS两种网络模式

  • Service代理
    • 在kubernetes集群中,每个node运行一个kube-proxy进程。kube-proxy负责为Service实现一种VIP(虚拟IP)的形式。
    • cat /opt/kubernetes/cfg/kube-proxy.conf #node上设置代理模式
    • userspace代理模式

    • IpTables代理模式

      • 相对于userspace模式,iptables模式在检测到分配的第一个pod链接失败后,会自动分配其他pod进行重试。
      • iptable会创建很多规则(更新,非增量)
      • iptable会从上到下逐条匹配(延迟大)
      • iptables -L #查看规则 
    • IPVS代理模式

      • 相对于iptables模式,IPVS模式下的kube-proxy重定向通信延迟更短,同步代理规则性能更好, 
      • ipvsadm -ln #查看ipvs规则  
  • service.yaml
    • kubectl expose deployment nginx --type=NodePort --port=80 --target-port=80 --name=nginx-service -o yaml --dry-run #生成yaml
    • apiVersion: v1 #service api版本
      kind: Service #设置为service
      metadata: #元数据
        creationTimestamp: null
        labels:
          run: nginx #标签
        name: nginx-service #service名称
      spec:
        ports:
        - port: 80 #service端口,用于集群内部访问的端口
          protocol: TCP #协议tcp、udp
          targetPort: 80 #容器内部应用的端口,例如ngin默认端口是8080
    •     nodePort=30001 #设置nodeport端口,限定在30000-50000之间
        selector:
          run: nginx #关联的标签
        type: NodePort #ClusterIP、NodePort、LoadBalancer三种类型
      status:
        loadBalancer: {}
           
    • 固定nodePort示例yaml

 

    • 多端口Service
      • 使用多端口时候,必须提供所有端口的名称,使他们无歧义。
      • apiVersion: v1
        kind: Service
        metadata:
          name: my-service
        spec:
          selector:
            app: MyApp
          ports:
            - name: http #端口name1
              protocol: TCP
              port: 80
              targetPort: 9376
            - name: https #端口name2
              protocol: TCP
              port: 443
              targetPort: 9377
    • 集群内部DNS服务
      • service内部之间通过cluster-IP来访问,但是这个IP并不是固定的;所以我们就需要通过dns name来访问;便于维护程序;
      • Core DNS 是目前kubernetes系统内部默认的DNS服务。
      • git链接https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/coredns/coredns.yaml.sed
      • 官网链接 https://kubernetes.io/zh/docs/concepts/services-networking/dns-pod-service/
      • 查看service
        kubectl get svc

        输出以下内容:
        NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
        kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 41h

        一、安装dns
        去git获取yaml
        or
        使用我们提供的

         
         
         
        kubectl apply -f coredns.yaml
         
        注意:clusterIP要和node节点的cat /opt/kubernetes/cfg/kubelet.conf 的clusterDNS一致,否则pod会解析失败
         
        二、查看dns
        kubectl get pods -n kube-system
         
        输出以下内容:
        NAME READY STATUS RESTARTS AGE
        coredns-6d8cfdd59d-mw47j 1/1 Running 0 5m45s
        kube-flannel-ds-amd64-q8rmk 1/1 Running 0 18h
        kube-flannel-ds-amd64-zq7hc 1/1 Running 0 18h

        三、测试DNS可用性
         

        安装dig
        kubectl apply -f dig.yaml

        解析测试
        kubectl exec -it dig sh
        nslookup nginx

        DNS原理
posted @ 2020-02-06 10:50  谭洪军  阅读(260)  评论(0编辑  收藏  举报