Service简介
Service:可以理解为pod的负债均衡器,标准资源类型,Service Controller 为动态的一组Pod一个固定的访问入口, kubernetes完成SVC工作的组件kube-proxy
Endpoint Controller:管理后端端与svc的绑定,根据标签选择器,筛选适配的pod,监控就绪的pod 并完成svc与pod的绑定
squirrel什么意思工作流程:Service Controller---->创建相同标签选择器的 Endpoint Controller根据标签选择器去管理和监听后端Pod状态 完成Svc与Pod绑定
Service能够负载均衡的能力,但在使用上有以下限制:
只4层负载均衡能力,而没有7层功能,但有时们可能需要更多的匹配规则来转发请求,这在4层负载均衡上不支持的
kube-proxy3种不同的数据调度模式
1.Urspace
Urspace模型:Pod-->Service, iptables拦截规则,但自己不调度 工作流程: 用户空间-->ptables(内核)-->kube-proxy-->ptables(内核)-->再调度给用户空间 效率低
iptables 用户空间-->ptables(内核 完成数据调度)-->调度给用户空间 效率高
在iptables模型下kube-proxy的作用不在数据调度转发,而监听API rver所有rvice中的定义转为本地的iptables规则
缺:iptables模式,一个rvice会生成量的规则; 如果一个rvice有50条规则 那如果有一万个容器,内核的性能就会受到影响
英语写信格式
ipvs代理模式: 在继承iptables优的情况下,同时改进了iptables产生量规则的缺,在规模集群中rice多的情况下优势更明显,
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:
visa是什么意思 key1: value1
key2: value2
spec:
type #Service类型,默认为ClusterIP
lector #等值类型的标签选择器,内含“与"逻辑
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 rvices-clusterip-demo.yaml
apiVersion: v1
kind: Service
metadata:
name: demoapp-svc
namespace: default
spec:
潜心贯注的意思 clusterIP: 10.97.72.1 #正式部署不需要指定 会自动生成,手动指定还可能会导致冲突
lector: #定义过滤条件
app: demoapp施虐女王
ports:
- name: http
protocol: TCP
英语听力 mp3 port: 80
targetPort: 80 #后端pod端口
[root@k8s-master svc]# kubectl apply -f rvices-clusterip-demo.yaml
rvice/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
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,relea=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
belt是什么意思IP: 10.97.72.1
Port: http 80/TCP
suits第二季TargetPort: 80/TCP
Endpoints: 10.244.1.98:80,10.244.2.97:80 #后端节
Session Affinity: None
Events:
intec
[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,relea=stable
demoapp-66db74fcfc-vzb4f 1/1 Running 0 39m 10.244.1.98 k8s-node1 app=demoapp,pod-template-hash=66db74fcfc,relea=stable,track=daily
liveness-httpget-demo 1/1 Running 3 29m 10.244.1.99 k8s-node1 app=liveness