DNS for Services and Pods

Services

创建基本的Service

  • kind: Service
  • spec.clusterIP: 为一组相同的服务的Pod集群提供一个虚拟ip地址作为入口
  • spec.clusterIP: 自动生成,也支持自定义,但必须在service-cluster-ip-range CIDR range范围内
  • spec.selector:选择Label匹配的Pod
  • spec.ports.protocol:支持TCP,UDP and SCTP
  • spec.ports支持同时暴露多个端口

Service Type

  • ClusterIP:
    1. 暴露一个internal IP,只能为Cluster内部提供服务
    2. 集群内其他Pod通过clusterIP:port访问/也可以通过NodeIp:port访问
    3. 可用于Eureka Client配置注册中心这种情况:只需要配置集群中的一个节点,但又能做到节点异常时能连接到其他节点
  • NodePort
    1. 暴露一个集群内部使用的ClusterIP,还暴露NodeIp(NodeHost):NodePort的接口
    2. NodePort在有Node上都一样,可以自动生成,也可以指定,范围--service-node-port-range flag (default: 30000-32767)
    3. 如果有Pod在同一个Node上面,NodeIp:NodePort访问和ClusterIP访问结果一样
    4. 集群内其他Pod通过clusterIP:port访问/也可以通过NodeIp:port访问/还可以通过NodeIp:NodePort访问
  • Headless services
    1. spec.clusterIP: None
    2. 集群内其他Pod只能通过NodeIp:port访问
  • LoadBalancer
    1. 暴露一个负载均衡的internal ClusterIP,只能为Cluster内部提供服务
    2. 暴露一个集群外部使用的externalIPs?
    3. 集群内其他Pod通过clusterIP:port访问/也可以通过NodeIp:port访问/还可以通过NodeIp:NodePort访问
    4. 负载均衡由云服务商提供
    5. NodePort and ClusterIP

Service为非Pod服务提供入口

kind: Endpoints
apiVersion: v1
metadata:
  name: my-service
subsets:
  - addresses:
      - ip: 1.2.3.4
    ports:
      - port: 9376
  • 这种方式不支持虚拟IP,所以不能使其他Service的cluster IPs

服务发现

  • Environment系统环境变量
    1. 自动生成如下所示env到容器系统环境变量
      1. {SVCNAME}_SERVICE_HOST and {SVCNAME}_SERVICE_PORT
      2. service必须比容器先创建
      3. 出了这种方式还支持Docker链接--link
    2. 例子env | greo REDIS
      1. REDIS_MASTER_SERVICE_HOST=10.0.0.11
      2. REDIS_MASTER_SERVICE_PORT=6379
      3. REDIS_MASTER_PORT=tcp://10.0.0.11:6379
      4. REDIS_MASTER_PORT_6379_TCP=tcp://10.0.0.11:6379
      5. REDIS_MASTER_PORT_6379_TCP_PROTO=tcp
      6. REDIS_MASTER_PORT_6379_TCP_PORT=6379
      7. REDIS_MASTER_PORT_6379_TCP_ADDR=10.0.0.11
  • DNS
    1. 通过my-service.my-ns访问服务: e.g.: http://rates-eureka.icg-msst-cv-rates-171832.svc:8080/eureka
    2. 通过_http._tcp.my-service.my-ns访问名字为http,protocol 为TPC的服务
    3. Type=ExternalName的Service只能使用DNS访问
    4. DNS没有Service必须比容器先创建的限制
    5. Eureka服务注册
  • 推荐使用DNS
    1. 服务发现只限于集群内部使用,带来的好处是你不必关心你的环境是dev/uat还是prod,只需要保证不同环境使用不同集群就能使用相同的URL配置
    2. Eureka服务注册
  • Pod服务发现
    1. 通过Pod的ip:port来实现,hostname不管用,所以Eureka Client需要使用ip注册

Proxy Mode

  • iptables
    1. 高效,但是不能重试其他Pod
    2. Pod挂掉每关系,就怕服务有问题
    3. 默认随机选择Pod
    4. 做好 readiness probes
  • userspace
    1. 低效,但是可以重试其他Pod,将被淘汰
  • sessionAffinity
    1. 任何Mode都可以通过设置spec.sessionAffinity to “ClientIP”设置,默认过期3小时(10800)
    2. spec.sessionAffinityConfig.clientIP.timeoutSeconds: 设置过期