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小时内删除。
发表评论