kubernetes-服务发现service(九)
service
•防止Pod失联
•定义一组Pod的访问策略
•支持ClusterIP,NodePort以及LoadBalancer三种类型
•Service的底层实现主要有iptables和ipvs二种网络模式
pod与service的关系:
•通过label-selector相关联
•通过Service实现Pod的负载均衡(TCP/UDP 4层)

每个 Node 运行一个 kube-proxy 进程。kube-proxy 负责为 Service 实现了一种 VIP(虚拟 IP)的形式
kube-proxy 这个组件始终监视着apiserver中有关service的变动信息,获取任何一个与service资源相关的变动状态,通过watch监视,一旦有service资源相关的变动和创建,kube-proxy都要转换为当前节点上的能够实现资源调度规则(例如:iptables、ipvs)
service代理模式
iptables代理模式:
客户端IP请求时,直接请求本地内核service ip,根据iptables的规则直接将请求转发到到各pod上,因为使用iptable NAT来完成转发,也存在不可忽视的性能损耗。另外,如果集群中存在上万的Service/Endpoint,那么Node上的iptables rules将会非常庞大,性能还会再打折扣。

ipvs代理模式:
客户端IP请求时到达内核空间时,根据ipvs的规则直接分发到各pod上。kube-proxy会监视Kubernetes Service对象和Endpoints,调用netlink接口以相应地创建ipvs规则并定期与Kubernetes Service对象和Endpoints对象同步ipvs规则,以确保ipvs状态与期望一致。访问服务时,流量将被重定向到其中一个后端Pod。

service类型
ClusterIP:通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的ServiceType。NodePort:通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort服务会路由到ClusterIP服务,这个ClusterIP服务会自动创建。通过请求<NodeIP>:<NodePort>,可以从集群的外部访问一个NodePort服务。LoadBalancer:使用云提供商的负载均衡器,可以向外部暴露服务。外部的负载均衡器可以路由到NodePort服务和ClusterIP服务。
ClusterIP
[root@k8s-master1 nginx]# vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
type: ClusterIP
ports:
- port:
targetPort:
selector:
app: nginx [root@k8s-master1 nginx]# kubectl apply -f nginx-service.yaml
service/nginx-service created
[root@k8s-master1 nginx]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> /TCP 6d15h
nginx-service ClusterIP 10.0.0.6 <none> /TCP 14s
service不会直接到pod,service是直接到endpoint资源,就是地址加端口,再由endpoint再关联到pod。
[root@k8s-master1 nginx]# kubectl get pod -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-deployment-5fc86c987f-jdpkv / Running 21m
nginx-deployment-5fc86c987f-scns6 / Running 21m
nginx-deployment-5fc86c987f-wwvlx / Running 21m
[root@k8s-master1 nginx]# kubectl get ep
NAME ENDPOINTS AGE
kubernetes 192.168.0.123:,192.168.0.124: 6d15h
nginx-service 172.17.32.3:,172.17.73.3:,172.17.73.4: 76s service只要创建完,就会在dns中添加一个资源记录进行解析,添加完成即可进行解析。
[root@k8s-master1 nginx]# kubectl run -it --image=busybox:1.28.4 --rm --restart=Never sh
If you don't see a command prompt, try pressing enter.
/ # nslookup nginx-service
Server: 10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local Name: nginx-service
Address 1: 10.0.0.6 nginx-service.default.svc.cluster.local
NodePort
[root@k8s-master1 ~]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myapp-9b4987d5-hk5n9 / Running 82s pod-template-hash=9b4987d5,run=myapp
myapp-9b4987d5-ngvbk / Running 82s pod-template-hash=9b4987d5,run=myapp
myapp-9b4987d5-r7q49 / Running 82s pod-template-hash=9b4987d5,run=myapp [root@k8s-master1 ~]# vim myapp-service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
release: canary
type: NodePort
ports:
- port:
targetPort:
nodePort: [root@k8s-master1 ~]# kubectl create -f myapp-service.yaml
service/myapp created
[root@k8s-master1 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> /TCP 6d16h
myapp NodePort 10.0.0.214 <none> :/TCP 8m14s
通过NodePort方式已经实现了从集群外部端口进行访问
[root@k8s-master1 ~]# while true;do curl http://192.168.0.125:37695/hostname.html;sleep 1;done
myapp-9b4987d5-ngvbk
myapp-9b4987d5-hk5n9
myapp-9b4987d5-r7q49
myapp-9b4987d5-ngvbk
myapp-9b4987d5-hk5n9
myapp-9b4987d5-r7q49
myapp-9b4987d5-ngvbk
会话保持
[root@k8s-master1 ~]# vim myapp-service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
release: canary
sessionAffinity: ClientIP
type: NodePort
ports:
- port:
targetPort:
nodePort: [root@k8s-master1 ~]# kubectl create -f myapp-service.yaml
service/myapp created [root@k8s-master1 ~]# while true;do curl http://192.168.0.125:37695/hostname.html;sleep 1;done
myapp-9b4987d5-hk5n9
myapp-9b4987d5-hk5n9
myapp-9b4987d5-hk5n9
Headless Service
有时不需要或不想要负载均衡,以及单独的 Service IP。 遇到这种情况,可以通过指定 Cluster IP(spec.clusterIP)的值为 "None" 来创建 Headless Service。
这个选项允许开发人员自由寻找他们自己的方式,从而降低与 Kubernetes 系统的耦合性。 应用仍然可以使用一种自注册的模式和适配器,对其它需要发现机制的系统能够很容易地基于这个 API 来构建。
对这类 Service 并不会分配 Cluster IP,kube-proxy 不会处理它们,而且平台也不会为它们进行负载均衡和路由。 DNS 如何实现自动配置,依赖于 Service 是否定义了 selector。
headless service做dns解析是直接解析到pod的,而servcie是解析到ClusterIP的
[root@k8s-master1 ~]# vim myapp.svc.yaml apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
release: canary
clusterIP: "None"
ports:
- port:
targetPort: [root@k8s-master1 ~]# kubectl apply -f myapp-svc.yaml
service/myapp created
[root@k8s-master1 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> /TCP 6d17h
myapp ClusterIP None <none> /TCP 6m27s
kubernetes-服务发现service(九)的更多相关文章
- 一文看懂 Kubernetes 服务发现: Service
Service 简介 K8s 中提供微服务的实体是 Pod,Pod 在创建时 docker engine 会为 pod 分配 ip,"外部"流量通过访问该 ip 获取微服务.但 ...
- Docker Kubernetes 服务发现原理详解
Docker Kubernetes 服务发现原理详解 服务发现支持Service环境变量和DNS两种模式: 一.环境变量 (默认) 当一个Pod运行到Node,kubelet会为每个容器添加一组环境 ...
- Kubernetes服务发现入门:如何高效管理服务?
愈发复杂的应用程序正在依靠微服务来保持可扩展性和提升效率.Kubernetes为微服务提供了完美的环境,并能够让其与Kubernetes的工具组件和功能兼容.当应用程序的每个部分放置在一个容器中,整个 ...
- Kubernetes服务发现之Service详解
一.引子 Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,然后一旦被销毁生命就永远结束.通过ReplicationController 能够动态地创建和销毁Pod(列如,需 ...
- 基于Kubernetes服务发现机制的探讨Non Service
服务注册 注册中⼼作为一般的RPC/Web服务中的底层设施提供了服务进程元数据(IP, Port, Interface, Group,Method等)存储,被Watch的功能,每个服务进程均需接⼊同⼀ ...
- Kubernetes 服务发现
目录 什么是服务发现? 环境变量 DNS 服务 Linux 中 DNS 查询原理 Kubernetes 中 DNS 查询原理 调试 DNS 服务 存根域及上游 DNS 什么是服务发现? 服务发现就是一 ...
- Kubernetes学习之路(十四)之服务发现Service
一.Service的概念 运行在Pod中的应用是向客户端提供服务的守护进程,比如,nginx.tomcat.etcd等等,它们都是受控于控制器的资源对象,存在生命周期,我们知道Pod资源对象在自愿或非 ...
- k8s入坑之路(11)kubernetes服务发现
kubernetes访问场景 1.集群内部访问 2.集群内部访问外部 3.集群外部访问内部 1.集群内部访问 1.pod之间直接ip通讯(利用calico通过路由表经过三层将ip流量转发)由于容器之间 ...
- 从零开始入门 | Kubernetes 中的服务发现与负载均衡
作者 | 阿里巴巴技术专家 溪恒 一.需求来源 为什么需要服务发现 在 K8s 集群里面会通过 pod 去部署应用,与传统的应用部署不同,传统应用部署在给定的机器上面去部署,我们知道怎么去调用别的机 ...
- Kubernetes 中的服务发现与负载均衡
原文:https://www.infoq.cn/article/rEzx9X598W60svbli9aK (本文转载自阿里巴巴云原生微信公众号(ID:Alicloudnative)) 一.需求来源 为 ...
随机推荐
- Jupyter导出PDF从入门到绝望(已解决)
Jupyter导出PDF从入门到绝望(已解决) 问题描述 我在使用jupyter lab的时候,想要把我的代码和结果导出成pdf格式的(由于里面有图片,所以不想导出成html).然后报错: 然后我用p ...
- 记录一下我的三天清明节假期,TP5.1写企业站
在假期前就计划利用这三天时间写一个企业站,包括pc和wap,和微信公众平台 在计划时有些功能没有想好,导致后面踩了不少坑,前期计划一定要尽量做详细,表字段设计也要考虑好,不然后期开始写代码时会需要来回 ...
- PAT甲级——1098 Insertion or Heap Sort (插入排序、堆排序)
本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90941941 1098 Insertion or Heap So ...
- 离散数学——python实现真值表和打印主范式
最近用python实现了真值表,经过有点儿曲折,刚开始没考虑优先级,直到前天才发现这个问题(离散数学没学好啊),用栈改了一下.话说python就是强,把列表类型当栈用,直接调用列表的pop()和app ...
- JMETER从JSON响应中提取数据
如果你在这里,可能是因为你需要使用JMeter从Json响应中提取变量. 好消息!您正在掌握掌握JMeter Json Extractor的权威指南.作为Rest API测试指南的补充,您将学习掌握J ...
- emmet中的用法
CSS Abbreviations Link VALUES LINK Emmet is about more than just HTML elements. You can inject value ...
- 一步一步在Windows中使用MyCat负载均衡
一步一步在Windows中使用MyCat负载均衡 http://www.cnblogs.com/zhangs1986/p/6408981.html mycat+sqlServer简单demo配置 ...
- spring boot——MockMvc的用法 (SpringBoot 1.5.18)下测试通过
spring boot——MockMvc的用法 1.pom配置 <dependency> <groupId>org.springframework.boot</gro ...
- windows cmd 透明化
1 . 属性 -- 颜色 --不透明度 2 . 快捷键 : Ctrl+Shift+加号/减号 3. cmd 下快速查找文件 : dir a.txt /S
- [WPF自定义控件库]简单的表单布局控件
1. WPF布局一个表单 <Grid Width="400" HorizontalAlignment="Center" VerticalAlignment ...