kubernetes组件Service入门


简介

简单来讲,Service对象就是工作节点点的一些iptables 或ipvs规则,用于将到达Service对象IP地址的流量调度转发至相应的Pod的IP地址和端口之上。创建Service资源对象时,ClusterDNS会自动创建资源记录用于名称解析和服务注册,Pod资源可以直接使用标准的DNS名称来访问这些Service资源。

Service 工作模型

  • userspace (效率较低)
  • Iptables
  • IPVS

Service类型

  • CluSterIP: 默认此类型,仅在集群IP内部暴露端口服务,集群外部无法访问到。

  • NodePort: 在任意节点上暴露端口,能通过集群外部访问。

  • LoadBalancer: 建立在 NodePort类型上,通过云服务提供商的负载均衡将服务暴露到集群外部。

  • ExternalName: 把集群外部的服务以DNS CNAME记录的方式映射至集群内,让集群内的POD资源能够访问外部的Service的一种实现方式

  • 无头Service: 直接解析至后端Pod,写法: clusterIP: ""

资源记录

SVC_NAME.NS_NAME.DOMAIN.LTD.

svc.cluster.local

redis.default.svc.cluster.local.

创建Service资源示例

apiVersion: v1
kind: Service
matadata:
  name: myapp-svc
spec:
  selector:
    app: myapp  
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort:30080
  type: NodePort

无头Service服务

apiVersion: v1
kind: Service
matadata:
  name: myapp-svc
spec:
  selector:
    app: myapp
    release: canary
  clusterIP: "None"  
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort:30080
  type: NodePort

上面Service配置清单为:创建一个名称为myapp-svc的service资源。适用于app=myapp的标签。暴露的协议为TCP,端口为80
,暴露在集群节点之上,可在集群外部访问。

service 负载均衡调度
同一个或,随机调度
sessionAffinity :ClientIP None

kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"ClientIP"}}' #类似LVS Haship 模式

dig -t A myapp-svc.default.svc.cluster.local. @10.96.0.10