简单来说:
kube-proxy其实就是管理service的访问入口,包括集群内Pod到Service的访问和集群外访问service。
kube-proxy管理sevice的points,该service对外暴露一个VirtualIP,也成为ClusterIP,集群内通过访问这个ClusterIP:Port就能访问到集群内对应的serivce下的Pod。
service是通过Selector选择的一组Pods的服务抽象,其实就是一个微服务,提供了服务的LB和反向代理的能力,而kube-proxy的主要作用就是负责service的实现。
service另外一个重要作用是,一个服务后端的Pods可能会随着生存灭亡而发生IP的改变,service的出现,给服务提供了一个固定的IP,而无视后端point的变化。
二、Service简介三、Service类型Service在K8s中有以下四种类型:
1)ClusterIp(集群内部使用)2)NodePort(对外暴露应用)3)LoadBalancer(对外暴露应用,适用于公有云)4)ExternalName四、Service工作流程客户端访问节点时通过iptables实现的
iptables规则是通过kube-proxy写入的
apiserver通过监控kube-proxy去进行对服务和端点的监控
kube-proxy通过pod的标签(lables)去判断这个断点信息是否写入到points里
关于iptables的原理与实战,可以参考我之前的文章哦:
Linux防火墙——iptables原理介绍
Linux防火墙——iptables实战操作
五、points简介1)工作流程2)示例1、
$:apps/v1kind:Deploymentmetadata:name:hellospec:replicas:3selector:matchLabels:run:hellotemplate:metadata:labels:run:hellospec:containers:-name:nginximage:nginx:1.17.1EOF
2、
$:v1kind:Servicemetadata:name:service-hellolabels:name:service-hellospec:type:NodePort所有的节点都会开放此端口30000--32767,此端口供外部调用。selector:run:helloEOF
3、查看验证
$$查看service$kubectlgetserviceservice-hello-owide查看pointer$kubectlgetpointsservice-hello六、Service,points与Pod的关系
Service的负载均衡转发规则
七、Service的资源清单文件详解apiVersion:v1kind:Servicemetadata:Service名称namespace:string自定义标签属性列表-name:stringannotations:详细描述selector:[]selector:LabelSelector配置,选择具有指定label标签的pod作为管理范围type:stringClusterIP:虚拟的服务ip地址,用于k8s集群内部的pod访问,在Node上kube-porxy通过设置的iptables规则进行转发LoadBalancer:使用外部负载均衡器完成到服务器的负载分发,虚拟服务IP地址,当type=ClusterIP时,如不指定,则系统会自动进行分配,也可以手动指定。当type=loadBalancer,需要指定sessionAffinity:stringClientIP表示将同一个客户端(根据客户端IP地址决定)的访问请求都转发到同一个后端Podports:端口名称protocol:string服务监听的端口号targetPort:int当type=NodePort时,指定映射到物理机的端口号status:外部负载均衡器ingress:外部负载均衡器的IP地址hostname:string#外部负载均衡器的机主机八、kubernetes中的四种port1)nodePort2)port3)targetPort4)containerPort九、kubernetes服务发现1)环境变量2)DNS十、Service代理模式1)userspace模式
缺点:
详细工作流程:
2)iptables模式(默认模式)详细工作流程:
示例:
:v1kind:Servicemetadata:labels:name:mysqlrole:servicename:mysql-servicespec:ports:-port:3306targetPort:3306nodePort:30964type:NodePortselector:mysql-service:"true"name:mysqlEOF$$kubectlgetsvc3)ipvs模型
详细工作流程:
4)kube-proxy配置ipvs模式(所有节点)1、加载ip_vs相关内核模块
$modprobe--ip_vs$modprobe--ip_vs_sh$modprobe--ip_vs_rr$modprobe--ip_vs_wrr$modprobe--nf_conntrack_ipv4
所有节点验证开启了ipvs:
$lsmod|grepip_vs
2、安装ipvsadm工具
$yuminstallipsetipvsadm-y
3、编辑kube-proxy配置文件,mode修改成ipvs
$kubectleditconfigmap-nkube-systemkube-proxy
4、重启kube-proxy
先查看之前的kube-proxy
$kubectlgetpod-nkube-system|grepkube-proxy
删掉上面三个kube-proxy,重新拉起新的服务
$kubectlgetpod-nkube-system|grepkube-proxy|awk'{system("kubectldeletepod"$1"-nkube-system")}'再查看
$kubectlgetpod-nkube-system|grepkube-proxy
5、查看
$ipvsadm-Ln
关于Kubernetes(k8s)kube-proxy、Service的介绍,就先到这里了,有疑问的小伙伴,欢迎给我留言哦~





