工控智汇

工控智汇

Kubernetes(k8s)kube-proxy、Service详解

admin 34 6
一、kube-proxy简介

简单来说:

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$$kubectlgetsvc

3)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的介绍,就先到这里了,有疑问的小伙伴,欢迎给我留言哦~