一、Service简介

  • Service为Pod提供固定服务端点
  • Service的本质是一条iptables或者ipvs的转发规则
  • userspace:1.1-
  • iptables:1.1+
  • ipvs:1.11+

二、Service类型

  • ExternalName
  • ClusterIP:使用集群网络提供服务
  • NodePort:直接使用节点网络提供服务
  • LoadBalancer:例如k8s构建在阿里云上,可以直接使用阿里云提供的SLB服务

三、使用清单创建service

  • ClusterIP类型:通过svc的IP访问
# cat redis-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-svc
namespace: default
spec:
selector: #支持等值选择器
app: redis
role: logstor
clusterIP: 10.99.99.99 #客户不指定,会自动分配
type: ClusterIP
ports:
- port: 6379 #Service端端口
targetPort: 6379 #Pod端端口
  • NodePort类型:通过访问node的IP访问
# cat myapp-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: default
spec:
selector: #支持等值选择器
app: myapp
release: canary
clusterIP: 10.99.99.100
type: NodePort
ports:
- port: 80 #Service端端口
targetPort: 80 #Pod端端口
nodePort: 10080 #节点端端口,端口范围:30000-32767

四、资源记录

  • SVC_NAME.NS_NAME.DOMAIN.LTD. :资源记录格式
  • svc.cluster.local. :默认域名后缀
  • redis-svc.default.svc.cluster.local. :以上redis-svc的资源记录endpoint

五、回话粘性

# kubectl patch svc myapp-svc -p '{"spec":{"sessionAffinity":"ClientIP"}}'  #来自同一个IP的客户端调度到同一个pod,默认none

六、无头Service(Headless)

  • 正常的service:service_name --> cluster_ip
  • 无头的service:service_name --> pod_ip
# cat myapp-svc-headless.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc-headless
namespace: default
spec:
selector:
app: myapp
release: canary
clusterIP: "None"
ports:
- port: 80
targetPort: 80
# dig -t A myapp-svc-headless.default.svc.cluster.local. @10.244.0.2 #10.244.0.2为coreDNS的地址,可以解析到myAPP的pod的所以ip

七、开启kubernetes支持ipvs

# vim /etc/sysconfig/kubelet
KUBE_PROXY_MODE=ipvs 开机装载ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack_ipv4模块
05-27 01:59