为了解决这个问题,kubernetes提供了Service资源。 Service聚合了多个提供相同服务的Pod,并提供统一的入口地址。通过访问Service的入口地址,就可以访问后续的Pod服务。
服务在很多时候只是一个概念。真正起作用的是kube-proxy服务流程。每个Node节点运行一个kube-proxy服务进程。当创建一个Service时,创建的Service信息会通过api-server写入到etcd中,kube-proxy会根据监控机制发现这个Service的变化,然后将最新的Service信息转换成相应的访问规则。
10.97.97.97:80是服务提供的访问入口。访问这个入口,可以发现有3个Pod服务等待调用。 kube-proxy 会根据rr(轮询)策略将请求分发到其中一个pod。规则将同时在集群中的所有节点上生成,因此可以在任何节点上访问它们。如果显示没有这个命令就会报错。
只需使用这些语句来安装yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools gitcat EOF /etc/sysconfig/modules/ipvs.modules #!/bin/bashmodprobe — ip_vsmodprobe – – ip_vs_rrmodprobe – – ip_vs_wrrmodprobe — ip_vs_shmodprobe — nf_conntrack_ipv4EOFchmod 755 /etc/sysconfig/modules/ipvs.modules bash /etc/sysconfig/modules/ipvs.modules lsmod | grep -e ip_vs -e nf_conntrack_ipv4用户空间模式
iptables模式
在iptables 模式下,kube-proxy 会在服务后端为每个Pod 创建相应的iptables 规则,并将对Cluster IP 的请求直接重定向到某个Pod IP。在这种模式下,kube-proxy 不承担第四层平衡器的角色,而只负责创建iptables 规则。该模式的优点是比userspace模式效率更高,但无法提供灵活的LB策略,无法在后端Pod不可用时进行重试。
ipvs模式
ClusterIP:默认值。是Kubernetes系统自动分配的虚拟IP。只能在集群内访问。 NodePort:通过指定Node上的端口将Service暴露给外部。通过该方法可以在集群外访问服务。 LoadBalancer:使用外部负载均衡器完成对服务的负载分配。需要注意的是,该模式需要外部云环境支持ExternalName:将集群外部的服务引入到集群中,直接使用。在使用服务之前,首先使用Deployment创建3个Pod。注意pod 必须设置app=nginx-pod 的标签
创建具有以下内容的deployment.yaml:
apiVersion: apps/v1kind: 部署元数据: name: pc-deployment 命名空间: devspec: 副本: 3 选择器: matchLabels: app: nginx-pod template: 元数据: 标签nginx-pod spec: 容器: – name3336 0 nginx image: nginx:1.17.1 ports: – containerPort: 80[root@k8s-master01 ~]# kubectl create -fdeployment.yamldeployment.apps/pc-deploymentcreated# 查看pod 详细信息[root@k8s-master01 ~]# kubectl get pods -n dev -o Wide –show-labelsNAME READY STATUS IP NODE LABELSpc-deployment-66cb59b984- 8p84h 1/1 运行10.244.1.39 node1 app=nginx-podpc-deployment-66cb59b984-vx8vx 1/1 运行10.244.2.33 node2 app=nginx-podpc-deployment-66cb59b984-wnncx 1/1 运行10.244.1.40 node1 app=nginx – pod# 为了方便后续测试,修改三台nginx机器的index.html页面(修改后三台机器的IP地址不一致) # kubectl exec -it pc-deployment-66cb59b984-8p84h -n dev /bin/sh# echo \’ 10.244.1.39\’ /usr/share/nginx/html/index.html#修改后,访问测试[root@k8s-master01 ~]#curl 10.244.1.3910.244.1.39[root@k8s-master01 ~ ]#curl 10.244.2.3310.244.2.33[root@k8s-master01 ~]#curl 10.244.1.4010.244.1.40集群IP类型服务
负载分配策略
对Service 的访问被分发到后端Pod。目前,Kubernetes提供了两种负载分配策略:
如果不定义,则默认使用kube-proxy策略,如随机、轮询等# 查看ipvs的映射规则[rr polling] [root@k8s-master01 ~]# ipvsadm -LnTCP 10.97.97.97:80 rr – 10.244.1.39:80 Masq 1 0 0 – 10.244.1.40:80 Masq 1 0 0 – 10.244.2.33:80 Masq 1 0 0# 循环访问测试[root@k8s-master01 ~]# while true;do curl 10.97.97.97:80;睡5;完成;10.244.1.4010。 244.1 .3910.244.2.3310.244.1.4010.244.1.3910.244.2.33#修改分发策略—-sessionAffinity:ClientIP#查看ipvs规则[persistent代表持久化] [root@k8s-master01 ~]# ipvsadm -LnTCP 10.97.97.9733 360 80rr 持续10800 – 10.244.1.39:80 Masq 1 0 0 – 10.244.1.40:80 Masq 1 0 0 – 10.244.2.33:80 Masq 1 0 0# 循环访问测试[root@k8s-master01 ~]# while true;do curl 10.97.97.9 7;睡5 ; done ;10.244.2.3310.244.2.3310.244.2.33 # 删除服务[root@k8s-master01 ~]# kubectl delete -f service-clusterip.yamlservice \’service-clusterip\’deletedHeadLiness type Service
在某些场景下,开发者可能不想使用Service提供的负载均衡功能,而是希望自己控制负载均衡策略。针对这种情况,kubernetes 提供了HeadLiness Service。此类服务不会分配集群IP。如果想要访问服务,只能通过服务的域名来查询。
在前面的例子中,创建的Service的IP地址只能在集群内部访问。如果要将Service暴露给集群外部,则必须使用另一种类型的Service,称为NodePort类型。 NodePort的工作原理是将服务端口映射到Node的某个端口,然后就可以通过NodeIp:NodePort访问服务。
创建service-nodeport.yaml
apiVersion: v1kind: Servicemetadata: name: service-nodeport namespace: devspec: Selector: app: nginx-pod type: NodePort # 服务类型ports: – port: 80 nodePort: 30002 # 指定绑定节点的端口(默认取值范围为:3) 0000-32767),如果未指定,则TargetPort:默认会分配80# 创建服务[root@k8s-master01 ~]# kubectl create -f service-nodeport.yamlservice/service-nodeport created# 查看服务[root@k8s-master01 ~]# kubectl get svc -n dev -o WideNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) SELECTORservice-nodeport NodePort 10.105.64.191 none 80:30002/TCP app=nginx-pod#接下来可以通过浏览器访问集群中任意nodeip的30002端口电脑主机。可以访问podLoadBalancer类型的Service
类型为ExternalName的服务
用户评论
々爱被冰凝固ゝ
太棒了!这篇服务详细说明真的非常详细,涵盖了所有我需要了解的信息。读完之后,我对他们的服务有了更深的了解,也更加期待尝试!
有17位网友表示赞同!
一点一点把你清空
看完服务详细说明,感觉他们对服务的理解真的非常深刻,每个细节都考虑到了,让人感觉非常专业,值得信赖!
有16位网友表示赞同!
◆乱世梦红颜
这个服务详细说明写的太简洁了,感觉缺少一些关键的信息,比如价格、具体的服务流程等等,希望可以更加详细一些。
有18位网友表示赞同!
自繩自縛
我感觉服务详细说明有点太长了,读起来有点吃力,如果能更简洁明了就好了,毕竟不是所有人都愿意花很长时间去阅读一大篇说明。
有15位网友表示赞同!
秒淘你心窝
服务详细说明写的很不错,很清晰明了,让我对服务有了更深入的了解,也更加期待体验他们的服务了!
有20位网友表示赞同!
醉婉笙歌
这个服务详细说明真的太棒了!简洁明了,重点突出,信息量大,读完后,对他们的服务有了更清晰的了解!
有12位网友表示赞同!
疲倦了
这篇文章的标题是“服务详细说明”,但是内容却让我感觉不够详细,很多关键的信息都没有提到,比如价格、服务流程等等,希望下次可以更加完善。
有5位网友表示赞同!
不识爱人心
服务详细说明写得很好,涵盖了所有关键信息,让我对服务有了更全面的了解,也更加期待体验他们的服务了。
有13位网友表示赞同!
弃我者亡
这篇服务详细说明写得很不错,但是感觉有点过于专业,普通人可能不太容易理解,建议可以考虑用更通俗易懂的语言来表达。
有17位网友表示赞同!
余温散尽ぺ
这个服务详细说明感觉有点过于商业化,感觉像是为了推销服务而写的,而不是真正的为用户提供信息。
有11位网友表示赞同!
万象皆为过客
感觉这个服务详细说明有点过于冗长,很多信息都是重复的,希望可以更简洁明了,突出重点。
有8位网友表示赞同!
涐们的幸福像流星丶
这篇服务详细说明写的很不错,信息量很大,而且很详细,让我对他们的服务有了更深刻的了解。
有20位网友表示赞同!
▼遗忘那段似水年华
服务详细说明写的很详细,让我对他们的服务有了更清晰的了解,也更加期待尝试他们的服务了。
有13位网友表示赞同!
封锁感觉
这个服务详细说明写得很好,信息量大,而且很清晰明了,让我对他们的服务有了更全面的了解。
有5位网友表示赞同!
巷口酒肆
这篇服务详细说明写的太复杂了,感觉有点难以理解,建议可以更简洁明了,用更通俗的语言来表达。
有20位网友表示赞同!
惯例
我觉得服务详细说明应该更加详细一些,比如可以介绍一下服务团队、服务案例等等,这样会更加让人信服。
有20位网友表示赞同!
晨与橙与城
这个服务详细说明写得很不错,但是感觉缺少一些视觉元素,比如图片、视频等等,会更加吸引人。
有14位网友表示赞同!
把孤独喂饱
我觉得服务详细说明还可以更加生动一些,比如可以加入一些案例、用户体验等等,这样会更加让人信服。
有8位网友表示赞同!
伤离别
这篇服务详细说明写的很好,信息量大,而且很实用,让我对他们的服务有了更深刻的了解。
有12位网友表示赞同!
从此我爱的人都像你
感觉这个服务详细说明有点过于笼统,没有针对性,希望可以更加细致一些,比如针对不同用户群体提供不同的信息。
有9位网友表示赞同!