当前位置:首页 > 实用技巧 >

vivoy81sroot权限(vivoy51root怎么设置权限)

来源:原点资讯(m.360kss.com)时间:2024-01-14 11:17:45作者:YD166手机阅读>>

在Kubernetes平台上,Pod是有生命周期,为了可以给客户端一个固定的访问端点,因此需要在客户端和Pod之间添加一个中间层,这个中间层称之为Service

Service是什么?

在Kubernetes中,每个节点都安装了kube-proxy,kube-proxy通过kubernetes中固有的watch请求方法持续监听apiserver。一旦有service资源发生变动(增删改查)kube-proxy可以及时转化为能够调度到后端Pod节点上的规则,这个规则可以是iptables也可以是ipvs,取决于service实现方式

Kubernetes 三大IP

  • Node Network 节点网络 节点网络地址是配置在节点网络之上
  • Pod Network Pod网络 Pod网络地址是配置在Pod网络之上节点网络和Pod网络都是配置在某个设备之上,可以是硬件也可以是虚拟网络
  • Cluster Network(svc network) virtual IP svc ip没有配置在某个网络接口上,它只是存在service的规则当中

Service 工作原理

k8s在创建Service时,会根据标签选择器selector(lable selector)来查找Pod,据此创建与Service同名的endpoint对象,当Pod 地址发生变化时,endpoint也会随之发生变化,service接收前端client请求的时候,就会通过endpoint,找到转发到那个Pod进行访问的地址。(至于转发到哪个节点的Pod,由负载均衡kube-proxy期初就决定好的)

#查看endpoint可以通过下面的命令 [root@k8s-01~]#kubectlgetep NAMEENDPOINTSAGE fuseim.pri-ifs<none>31d kubernetes192.168.0.10:6443,192.168.0.11:6443,192.168.0.12:644333d myapp172.30.168.6:80,172.30.192.7:80,172.30.216.7:807m56s myapp-svc172.30.168.4:80,172.30.192.5:80,172.30.216.6:8018m

1.endpoint是k8s集群中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod的访问地址2.只有当service配置selector(选择器),endpoint controller才会自动创建对应的endpoint对象,否则,不会生成endpoint对象3.在k8s集群中创建webapp的service,就会生成一个同名的endpoint对象,endpoint就是service关联的Pod的ip地址和端口

Service 工作模式

userpace在这种模式下,kube-proxy监视Kubernetes主服务器以添加和删除Service和Endpoint对象。对于每个服务,它都会在本地节点上打开一个端口(随机选择)。与此代理端口的任何连接都代理到服务的后端Pod。sessionAffinity在决定使用哪个后端Pod时,kube-proxy会考虑服务的设置。最后,用户控件代理安装iptables规则,以获取服务clusterIP和流量port。规则将流量重定向到代理后端Pod的端口。

简单点来说Service的请求先从用户空间进入内核iptables转发到这个端口,然后再回到用户空间,由kube-proxy完成后端endpoint的选择和代理,这样流量会有从用户空间进入内核的过程,效率低,有明显的性能瓶颈

vivoy81sroot权限,vivoy51root怎么设置权限(1)

image_1e2i15977imggfddjb1dgsfbem.png-155.2kB

iptables

目前默认的方案,完全以内核iptables的nat方式实现service负载均衡。该方式在大规模情况下存在一些性能问题;首先,iptables没有增量更新的功能,更新一条规则需要整体flush,更新时间长,这段时间之内流量会有不同程度的影响;此外,iptables规则串行匹配,没有预料到Kubernetes这种在一个机器上会有很多规则的情况,流量需要经过所有规则的匹配后在进行转发,对时间和内存都是极大的小号,尤其在大规模情况下对性能的影响十分明显

vivoy81sroot权限,vivoy51root怎么设置权限(2)

image_1e2i1b3cf1fja1kkrmravbtcms13.png-148.8kB

ipvs

与iptables、userspace 模式一样,kube-proxy 依然监听Service以及Endpoints对象的变化, 不过它并不创建反向代理, 也不创建大量的 iptables 规则, 而是通过netlink 创建ipvs规则,并使用k8s Service与Endpoints信息,对所在节点的ipvs规则进行定期同步; netlink 与 iptables 底层都是基于 netfilter 钩子,但是 netlink 由于采用了 hash table 而且直接工作在内核态,在性能上比 iptables 更优

同时,ipvs负载均衡除了简单rr规则还有很多选择,适合在大型集群中使用,而缺点是带来了额外的配置维护操作

vivoy81sroot权限,vivoy51root怎么设置权限(3)

image_1e2i1j2661kavs7d13bg119g1hvm1g.png-113.3kB

简单说一下kube-proxy和service之间的关系

访问Service的请求,不论是Cluster IP还是TargerPort方式;还是NodePort方式,都被Node节点的Iptables规则重定向到kube-proxy监听Service服务代理端口。kube-proxy接受Service的访问请求后,根据负载策略转发到后端的Pod

->kube-proxy其实就是管理service的访问入口,包括集群内Pod到Service的访问和集群外访问service。 ->kube-proxy管理sevice的Endpoints,该service对外暴露一个VirtualIP,也成为ClusterIP,集群内通过访问这个ClusterIP:Port就能访问到集群内对应的serivce下的Pod。 ->service是通过Selector选择的一组Pods的服务抽象,其实就是一个微服务,提供了服务的LB和反向代理的能力,而kube-proxy的主要作用就是负责service的实现。 ->service另外一个重要作用是,一个服务后端的Pods可能会随着生存灭亡而发生IP的改变,service的出现,给服务提供了一个固定的IP,而无视后端Endpoint的变化。

kube-proxy负责为Service提供cluster内部的服务发现和负载均衡,它运行在每个Node计算节点上,负责Pod网络代理, 它会定时从etcd服务获取到service信息来做相应的策略,维护网络规则和四层负载均衡工作。在K8s集群中微服务的负载均衡是由Kube-proxy实现的,它是K8s集群内部的负载均衡器,也是一个分布式代理服务器,在K8s的每个节点上都有一个,这一设计体现了它的伸缩性优势,需要访问服务的节点越多,提供负载均衡能力的Kube-proxy就越多,高可用节点也随之增多。

Service 服务发现

https://i4t.com/4478.html

Service 集群服务暴露

服务发现解决了集群内部访问Pod问题,但很多时候,Pod提供的服务也要对集群外部来暴露访问。

ExternalName

简单的来说ExternalName代理外部的请求,让Pod访问svc实际上访问的就是集群外部的服务,让Pod访问集群外部的服务像集群内部服务一样方便

apiVersion:v1 kind:Service metadata: name:my-service namespace:default spec: type:ExternalName externalName:my.database.example.com

这里externalName实际上就是cname的域名,前提需要节点可以访问到,或者映射到公网上

集群内部可以通过my-service.default.svc.cluster.local访问,请求会被cname映射到my.database.example.com

ClusterIP

clusterIP又可以分为普通Service和Headless Service两类

  • 普通Service 通过Kubernetes的Service分配一个集群内部可访问的固定虚拟IP(Cluster IP),也可以自己指定clusterIP,从而实现集群内部的访问
  • Headless Service 无头服务 该服务不会分配ClusterIP,也不会通过kube-proxy做反向代理和负载均衡。而是通过DNS提供稳定的网络ID来访问,DNS会将headless service的后端直接解析为PodIP列表,主要提供StatefulSet使用

普通Cluster IP演示

这里我们创建一个svc和deployment,具体参数不在解释,如有不懂可以参考 Kubernetes Service

apiVersion:apps/v1beta2 kind:Deployment metadata: name:myapp-svc spec: replicas:3 selector: matchLabels: app:myapp-svc template: metadata: labels: app:myapp-svc spec: containers: -name:myapp-svc image:ikubernetes/myapp:v1 imagePullPolicy:IfNotPresent ports: -containerPort:80 --- apiVersion:v1 kind:Service metadata: name:myapp-svc namespace:default spec: selector: app:myapp-svc type:ClusterIP ports: -port:80 targetPort:80

创建完毕后,service会随机代理pod。 普通service也是比较常见的svc

[root@k8s-01~]#kubectlgetpod,svc NAMEREADYSTATUSRESTARTSAGE pod/myapp-svc-5f8fc8545f-6svln1/1Running079s pod/myapp-svc-5f8fc8545f-kwc7x1/1Running079s pod/myapp-svc-5f8fc8545f-rp8vg1/1Running079s NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE service/kubernetesClusterIP10.254.0.1<none>443/TCP33d service/myapp-svcClusterIP10.254.223.73<none>80/TCP81s [root@k8s-01~]# [root@k8s-01~]#curl10.254.223.73/hostname.html myapp-svc-5f8fc8545f-kwc7x


Headkess Service演示

如果我们上面创建了clusterIP模式,需要修改svc模式,需要将之前svc删除从新创建,如果使用apply是无法刷新svc配置的

[root@k8s-01~]#catk8s-svc.yaml apiVersion:apps/v1beta2 kind:Deployment metadata: name:myapp-svc spec: replicas:3 selector: matchLabels: app:myapp-svc template: metadata: labels: app:myapp-svc spec: containers: -name:myapp-svc image:ikubernetes/myapp:v1 imagePullPolicy:IfNotPresent ports: -containerPort:80 --- apiVersion:v1 kind:Service metadata: name:myapp-svc namespace:default spec: clusterIP:"None" selector: app:myapp-svc ports: -port:80 targetPort:80

在无头模式中,clusterip为none,因为不需要clusterip所以这里是没有cluster ip

[root@k8s-01~]#kubectlgetsvc NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE kubernetesClusterIP10.254.0.1<none>443/TCP33d myapp-svcClusterIPNone<none>80/TCP4m33s

这里通过dig命令进行查看

参数需要说明,myapp-svc为svc的名称,default为命名空间, 后面@10.254.0.2我这里使用的是coredns,同样也是coredns svc ip

##查看svc及Pod名称,一会需要对比 [root@k8s-01~]#kubectlgetpod,svc-owide NAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATES pod/myapp-svc-5f8fc8545f-26c8x1/1Running07m22s172.30.168.4k8s-03<none><none> pod/myapp-svc-5f8fc8545f-hd7pp1/1Running07m22s172.30.216.6k8s-01<none><none> pod/myapp-svc-5f8fc8545f-kd6xl1/1Running07m22s172.30.192.5k8s-02<none><none> NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGESELECTOR service/kubernetesClusterIP10.254.0.1<none>443/TCP33d<none> service/myapp-svcClusterIPNone<none>80/TCP7m22sapp=myapp-svc ##查看dnssvcip [root@k8s-01~]#kubectlgetsvc-nkube-system|grepdns kube-dnsClusterIP10.254.0.2<none>53/UDP,53/TCP,9153/TCP33d ##查看dns解析是否为3个pod,以及对应的IP [root@k8s-01~]#dig-tAmyapp-svc.default.svc.cluster.local.@10.254.0.2 ... ;;ANSWERSECTION: myapp-svc.default.svc.cluster.local.5INA172.30.168.4 myapp-svc.default.svc.cluster.local.5INA172.30.216.6 myapp-svc.default.svc.cluster.local.5INA172.30.192.5 ...

如果我们使用普通service,这里dig只会出现一个pod名称


NodePort

除了cluster ip之外,还可以通过service的port映射到集群内每个节点的相同端口,实现通过nodeIP:nodePort 从集群外访问服务

在NodePort中,client请求先到达NodeIP NodePort-->ClusterIP:ServicePort-->PodIP:ContainerPort

这里我们继续创建webapp

apiVersion:extensions/v1beta1 kind:DaemonSet metadata: name:myapp labels: addonmanager.kubernetes.io/mode:Reconcile spec: template: metadata: labels: app:myapp spec: containers: -name:my-nginx image:ikubernetes/myapp:v1 ports: -containerPort:80 --- apiVersion:v1 kind:Service metadata: name:myapp namespace:default spec: selector: app:myapp type:NodePort ports: -port:80 targetPort:80 nodePort:30080

我们映射nodeport端口30080,type类型为Nodeport,也是我们之前常用的

[root@k8s-01~]#kubectlgetsvc NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE kubernetesClusterIP10.254.0.1<none>443/TCP33d myappNodePort10.254.233.67<none>80:30080/TCP33s

接下来我们就可以在任意节点访问Pod

[root@k8s-01~]#whiletrue;docurlhttp://192.168.0.10:30080/hostname.html;sleep1;done myapp-xr9m2 myapp-gbcvh myapp-6gwh9 myapp-xr9m2 myapp-gbcvh

LoadBalancer

和nodeport类似,不过除了使用一个Clusterip和nodeport之外,还会向所使用的公有云申请一个负载均衡器,实现从集群外通过LB访问服务

更多参数可以参考官方文档https://kubernetes.io/docs/concepts/services-networking/service/#externalname

Service Session会话保持

session affinity会话保持,又称为会话亲和性,常用于Web Service的微服务部署中。就和我们nginx中的会话保持一样

可以将来自同一个客户端的请求始终转发至同一个后端的Pod对象,这意味着它会影响调度算法的流量分发功用,进而降低其负载均衡的效果。因此,当客户端访问Pod中的应用程序时,如果有基于客户端身份保存某些私有信息,并基于这些私有信息追踪用户的活动等一类的需求时,那么应该启用session affinity机制。

  Service affinity的效果仅仅在一段时间内生效,默认值为10800秒,超出时长,客户端再次访问会重新调度。该机制仅能基于客户端IP地址识别客户端身份,它会将经由同一个NAT服务器进行原地址转换的所有客户端识别为同一个客户端,由此可知,其调度的效果并不理想。Service 资源 通过. spec. sessionAffinity 和. spec. sessionAffinityConfig 两个字段配置粘性会话。 spec. sessionAffinity 字段用于定义要使用的粘性会话的类型,它仅支持使用“ None” 和“ ClientIP” 两种属性值。如下:

[root@k8s-01~]#kubectlexplainsvc.spec.sessionAffinity KIND:Service VERSION:v1 FIELD:sessionAffinity<string> DESCRIPTION: Supports"ClientIP"and"None".Usedtomaintainsessionaffinity.Enable clientIPbasedsessionaffinity.MustbeClientIPorNone.Defaultsto None.Moreinfo: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies [root@k8s-01~]#

sessionAffinity支持ClientIP和None 两种方式,默认是None(随机调度) ClientIP是来自于同一个客户端的请求调度到同一个pod中

[root@k8s-01~]#catwebapp.yml apiVersion:extensions/v1beta1 kind:DaemonSet metadata: name:myapp labels: addonmanager.kubernetes.io/mode:Reconcile spec: template: metadata: labels: app:myapp spec: containers: -name:my-nginx image:ikubernetes/myapp:v1 ports: -containerPort:80 --- apiVersion:v1 kind:Service metadata: name:myapp namespace:default spec: selector: app:myapp type:NodePort sessionAffinity:ClientIP##参数位置 ports: -port:80 targetPort:80 nodePort:30080

此时我们通过curl请求svc时,只会返回一个节点的pod

[root@k8s-01~]#whiletrue;docurlhttp://192.168.0.10:30080/hostname.html;sleep1;done myapp-cg4lq myapp-cg4lq myapp-cg4lq myapp-cg4lq myapp-cg4lq

也可以使用打补丁的方式进行修改yaml内的内容,如下:

kubectlpatchsvcmyapp-p'{"spec":{"sessionAffinity":"ClusterIP"}}'#session保持,同一ip访问同一个pod kubectlpatchsvcmyapp-p'{"spec":{"sessionAffinity":"None"}}'#取消session

如果我们取消session配置,那么请求svc时会随机调度给pod相当于sessionAffinity=None

[root@k8s-01~]#whiletrue;docurlhttp://192.168.0.10:30080/hostname.html;sleep1;done myapp-pplfn myapp-wkfqz myapp-cg4lq myapp-pplfn myapp-wkfqz

说明一点Service属于四层调度,无论是iptables还是ipvs都是无法实现https请求或者7层的操作

原文:https://i4t.com/4567.html

栏目热文

微信怎么分享超过5分钟的视频(微信怎样分享超过60分钟的视频)

微信怎么分享超过5分钟的视频(微信怎样分享超过60分钟的视频)

微信对于上传的视频有着严苛的大小限制,通常进行分享的时候视频都会被平台压缩从而导致视频变得不清晰,想要上传更长时间的视频...

2024-01-14 11:29:04查看全文 >>

微信不能分享超过15分钟的视频吗(微信不能分享超过60分钟视频)

微信不能分享超过15分钟的视频吗(微信不能分享超过60分钟视频)

微信正式发布8.0.23新版本了!这次微信升级新版本这三大系统,安卓系统、鸿蒙系统与IOS系统都移除了此前备受争议的性能...

2024-01-14 11:17:30查看全文 >>

word图表更改数据保存不了(word里面的图表变成灰色无法编辑)

word图表更改数据保存不了(word里面的图表变成灰色无法编辑)

Microsoft Word的用户几乎覆盖全球,是一个方便的办公软件,但是在使用word过程中我们难以避免一些问题,比如...

2024-01-14 11:11:48查看全文 >>

word文档中的图表编辑不了(word图表不能编辑数据)

word文档中的图表编辑不了(word图表不能编辑数据)

如何在Word中创建和设置图表?在使用Word办公时,特别是学校的老师需要使用图表来更直观地展示学生成绩,并提高学生个人...

2024-01-14 10:52:54查看全文 >>

word数据图表不能编辑原因(word编辑图表显示链接文件不可用)

word数据图表不能编辑原因(word编辑图表显示链接文件不可用)

在Word中,有时候也要进行数据分析,使用柱形图、饼形图、折线图等图表,以便一目了然地看出数据变化情况。那么,如何插入图...

2024-01-14 11:17:37查看全文 >>

vivoy 53s 如何root(vivoy51s怎么root)

vivoy 53s 如何root(vivoy51s怎么root)

MYSQL系统参数调整(一)一、概述在做性能测试中经常会遇到一些sql的问题,其实做性能测试这几年遇到问题最多还是数据库...

2024-01-14 11:17:41查看全文 >>

凝胶的好处和坏处(凝胶为什么不能长期用)

凝胶的好处和坏处(凝胶为什么不能长期用)

妇科凝胶是女性私护产品的一大品类,基础作用是抑菌抗菌、止痒去味,当然还有附加的缩阴嫩阴、等作用。瘙痒异味是现代女性经常会...

2024-01-14 11:00:17查看全文 >>

凝胶的正确使用方法和技巧(凝胶的正确使用方法视频)

凝胶的正确使用方法和技巧(凝胶的正确使用方法视频)

在忙碌的生活中,每一个女性都是艺术家,她们以妆容为画布,以色彩为语言,展示着自己的魅力和个性。然而,当一天的妆容画下句号...

2024-01-14 10:52:37查看全文 >>

凝胶的正确使用方法图(怎么使用凝胶才是正确的)

凝胶的正确使用方法图(怎么使用凝胶才是正确的)

很多人上了年纪以后容易患有骨关节疾病,骨关节疾病是导致老年人行动不便的重要因素之一。其明显的症状是发病部位疼痛、僵硬、肿...

2024-01-14 11:09:33查看全文 >>

凝胶正确使用方法图(凝胶的正确用法视频)

凝胶正确使用方法图(凝胶的正确用法视频)

“勤洗手、讲卫生”的标语可以说家喻户晓尤其在疫情出现以后从老人到儿童从家里到室外手部卫生愈加受人重视勤洗手能够保持手部清...

2024-01-14 11:26:54查看全文 >>

文档排行