Service简介
Service:可以理解为pod的负债均衡器,标准资源类型,Service Controller 为动态的一组Pod一个固定的访问入口, kubernetes完成SVC工作的组件kube-proxy
Endpoint Controller:管理后端端与svc的绑定,根据标签选择器,筛选适配的pod,监控就绪的pod 并完成svc与pod的绑定
工作流程:Service Controller---->创建相同标签选择器的 Endpoint Controller根据标签选择器去管理和监听后端Pod状态 完成Svc与Pod绑定
Service能够负载均衡的能力,但在使用上有以下限制:
只4层负载均衡能力,而没有7层功能,但有时们可能需要更多的匹配规则来转发请求,这在4层负载均衡上不支持的
kube-proxy3种不同的数据调度模式
1.Userspace
Userspace模型:Pod-->Service, iptables拦截规则,但自己不调度 工作流程: 用户空间-->ptables(内核)-->kube-proxy-->ptables(内核)-->再调度给用户空间 效率低
iptables 用户空间-->ptables(内核 完成数据调度)-->调度给用户空间 效率高
在iptables模型下kube-proxy的作用不在数据调度转发,而监听API server所有service中的定义转为本地的iptables规则
缺:iptables模式,一个service会生成量的规则; 如果一个service有50条规则 那如果有一万个容器,内核的性能就会受到影响
ipvs代理模式: 在继承iptables优的情况下,同时改进了iptables产生量规则的缺,在规模集中serice多的情况下优势更明显,
Service的类型
clusterIP:通过集内部IP暴露,但该仅在集内部可见、可达,它无法被集外部的客户端访问;默认类型;建议由K8S动态指定一个;也支持用户手动明确指定;
NodePort: NodePortClusterIP的增强类型,它会于ClusterIP的功能之外,在每个节上使用一个相同的端口号将外部流量引入到该Service上来。
LoadBalancer: NodePort的增强类型,为各节上的NodePort一个外部负载均衡器;需要公有云支持
ExternalName:外部流程引入到K8S内部,借助集上KubeDNS来实现,的名称会被解析为一个CNAME记录,而CNAME名称会被DNS解析为集外部的的TP,实现内部与外部的数据交互 ExternallP 可以与ClusterIP、NodePort使用 使用其中一个IP出口IP
ServicePort
Service:被映进Pod上的应用程序监听的端口; 而且如果后端Pod有多个端口,并且每个端口都想通过Service暴露的话,每个都要单独定义。 最终接收请求的PodIP和ContainerPort;
Service资源规范
Service名称空间级别的资源不能跨名称空间
apiVersion: v1
kind: Service
metadata:
  name: ..
  namespace: ...
  labels:
    key1: value1
    key2: value2
spec:
  type  #Service类型,默认为ClusterIP
  selector  #等值类型的标签选择器,内含“与"逻辑
  ports: # Service的端口对象列表
  - name #端口名称
    protocol  #协议,目前仅支持TCP、UDP和SCTP,默认为TCP
    port  # Service的端口号
    targetPort  #后端目标进程的端口号或名称,名称需由Pod规范定义
    nodePort  # 节端口号,仅适用于NodePort和LoadBalancer类型
  clusterIP  # Service的集IP,建议由系统自动分配
  externalTrafficPolicy #外部流量策略处理,Local表示由当前节处理,#Cluster表示向集范围调度
  loadBalancerIP  #外部负载均衡器使用的IP,仅适用于LoadBlancer
  externalName  # 外部名称,该名称将作为Service的DNS CNAME值
示例1: ClusterIP 演示
[root@k8s-master svc]# cat services-clusterip-demo.yaml
apiVersion: v1
kind: Service
metadata:
  name: demoapp-svc
  namespace: default
spec:
  clusterIP: 10.97.72.1  #正式部署不需要指定 会自动生成,手动指定还可能会导致冲突
  selector:              #定义过滤条件
    app: demoapp
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80    #后端pod端口
[root@k8s-master svc]# kubectl apply -f services-clusterip-demo.yaml
service/demoapp-svc created
[root@k8s-master svc]# kubectl get svc -o wide
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP  PORT(S)        AGE  SELECTOR
demoapp-svc  ClusterIP  10.97.72.1              80/TCP        11s  app=demoapp
kubernetes    ClusterIP  10.96.0.1                443/TCP        30d  nodeselector
my-grafana    NodePort    10.96.4.185              80:30379/TCP  27d  app.kubernetes.io/instance=my-grafana,app.kubernetes.io/name=grafana
myapp        NodePort    10.106.116.205          80:31532/TCP  30d  app=myapp,release=stabel
[root@k8s-master svc]# curl 10.97.72.1  #通过访问svc IP访问到后端节
iKubernetes demoapp v1.0 !! ClientIP: 10.244.0.0, ServerName: demoapp-66db74fcfc-9wkgj, ServerIP: 10.244.2.97!
[root@k8s-master svc]# curl 10.97.72.1
iKubernetes demoapp v1.0 !! ClientIP: 10.244.0.0, ServerName: demoapp-66db74fcfc-vzb4f, ServerIP: 10.244.1.98!
[root@k8s-master svc]# kubectl describe svc demoapp-svc
Name:              demoapp-svc
Namespace:        default
Labels:           
Annotations:     
Selector:          app=demoapp
Type:              ClusterIP
IP:                10.97.72.1
Port:              http  80/TCP
TargetPort:        80/TCP
Endpoints:        10.244.1.98:80,10.244.2.97:80  #后端节
Session Affinity:  None
Events:           
[root@k8s-master svc]# kubectl get pod -o wide --show-labels  #匹配到前1、2个
NAME                          READY  STATUS    RESTARTS  AGE  IP            NODE        NOMINATED NODE  READINESS GATES  LABELS
demoapp-66db74fcfc-9wkgj      1/1    Running  0          39m  10.244.2.97    k8s-node2                          app=demoapp,pod-template-hash=66db74fcfc,release=stable
demoapp-66db74fcfc-vzb4f      1/1    Running  0          39m  10.244.1.98    k8s-node1                          app=demoapp,pod-template-hash=66db74fcfc,release=stable,track=daily
liveness-httpget-demo        1/1    Running  3          29m  10.244.1.99    k8s-node1                          app=liveness

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。