K8s——Service详解

Posted IT小分享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K8s——Service详解相关的知识,希望对你有一定的参考价值。

1 Service 含义

K8s service可以理解为对一组Pod的抽象。类似于nginx能够把请求转发 对应的服务上。

2 Service作用

2.1 pod使用时因某些问题重启,从而导致pod 的IP发生变化,会导致旧的IP不能用,影响用户对系统使用。service的出现很好 解决此问题,客户端通过service 访问pod,当podIP有变化也不会影响(service通过Label Selector跟pod绑定)。

2.2 对外暴露pod访问请求端口。

2.3 固定IP。

2.4 负载均衡。

3 Service 工作机制

3.1 userspace代理模型流程

userspace指Linux操作系统的用户空间(物理上为内存)。对于service会对外暴露端口号,用户空间中的kube-proxy会监控service端口上请求,并把请求转发到对应的pod上。

请求到达内核空间后经由套接字送往用户空间的kube-proxy,并调度至后端pod。请求会在内核和用户空间之间来回转发导致效率不高。(如下图)


K8s——Service详解

3.2 iptables代理模型流程

kube-proxy负责跟踪API Server上的Service和Endpoints对象的变动,并根据变动做出iptables的变动。

iptables捕捉到达clusterIP与端口的请求,并将请求转发到当前service后端pod。

iptables模型不用将流量在用户空间和内核空间来回切换,因而更加高效和可靠,不过其缺点是iptables代理模型不会在被挑中的后端Pod资源无响应时进行重定向。


K8s——Service详解

3.3 ipvs代理模型

K8s从1.9版本引入ipvs代理模型,且从1.11版本起成为默认设置。

它和iptables模型很类似,唯一一点不同的是在其请求流量的调度功能由ipvs实现,余下的功能仍由iptables完成。

ipvs是建立在netfilter的钩子函数上,但它使用hash表作为底层数据结构并工作于内核空间,因此流量转发速度特别快、规则同步性很好,

而且它支持众多调度算法,rr(轮询)、lc(最小连接数)、dh(目标哈希)、sh(源哈希)、sed(最短期望延迟)、nq(不排队调度)。


3 Service 类型

3.1 ClusterIp:默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP.

3.2 NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,这样可以通过NodeIP:NodePort来访问服务。

也可以这样理解在于在 node 上暴露了一个端口,将向该端口的流量导入到 kube-proxy,然后由 kube-proxy 进一步到给对应的 pod。

k8s配置好对外访问端口后,linux防火墙也需要通过命令配置(-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT)

3.3 LoadBalancer:在NodePort基础上,借助cloud provider创建一个外部负载均衡器,并将请求转发到NodeIP:NodePort。

另一种理解调用cloud provider 去创建 LB 来向节点导流

3.4 ExternalName: 把集群外部的服务引入到集群内部来,在集群内部直接使用,没有任何类型代理被创建,这只有kubernetes1.7 或更高版本的kube-dns才支持

4 port nodePort targetPod 区别

4.1 port service暴露在cluster ip上的端口,<cluster ip>:port 是提供给集群内部客户访问service的入口

4.2 nodePort 是kubernetes提供给集群外部客户访问service入口的一种方式(另一种方式是LoadBalancer),所以,<nodeIP>:nodePort 是提供给集群外部客户访问service的入口.

4.3 targetPort 是pod上的端口,从port和nodePort上到来的数据最终经过kube-proxy流入到后端pod的targetPort上进入容器

4 Service脚本创建

apiVersion: v1
kind: Service
metadata:
name: myService
spec:
selector:
app: tomcat
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
- name: https
protocol: TCP
port: 443
targetPort: 443

selector字段中指定了为哪一个标签的app进行负载均衡即暴露pod 的name为tomcat对外的访问端口。

最后预祝各位小伙伴新年快乐,牛年吉祥! 这次分享对大家工作学习有帮助吧,欢迎下方留言,提出建议或意见。



以上是关于K8s——Service详解的主要内容,如果未能解决你的问题,请参考以下文章

K8s——Service详解

k8s之service详解

k8s service使用详解

Python3 - k8s创建Service服务实例详解

Python3 - k8s创建Service服务实例详解

Python3 - k8s创建Service服务实例详解