您的位置 首页 > 数码极客

如何在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。请求会在内核和用户空间之间来回转发导致效率不高。(如下图)


3.2 iptables代理模型流程

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

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

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


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.

也可以这样理解主要在每个 node 节点使用 iptables,将发向 clusterIP 对应端口的数据,转发到 kube-proxy 中。然后 kube-proxy 自己内部实现有负载均衡的方法,并可以查询到这 个 service 下对应 pod 的地址和端口,进而把数据转发给对应的 pod 的地址和端口。

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: 把集群外部的服务引入到集群内部来,在集群内部直接使用,没有任何类型代理被创建,这只有kuberne 或更高版本的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对外的访问端口。

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

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“如何在service里添加脚本”边界阅读