网站首页 > 技术文章 正文
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: 把集群外部的服务引入到集群内部来,在集群内部直接使用,没有任何类型代理被创建,这只有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对外的访问端口。
最后预祝各位小伙伴新年快乐,牛年吉祥! 这次分享对大家工作学习有帮助吧,欢迎下方留言,提出建议或意见。
猜你喜欢
- 2024-10-12 Kong 优雅实现微服务网关鉴权,登录场景落地实战篇
- 2024-10-12 k8s安装与使用入门(k8s安装步骤)
- 2024-10-12 应用无损上下线(应用无损上下线怎么关闭)
- 2024-10-12 另一个Kubernetes(k8s)指南(kubernetesk8s怎么使用)
- 2024-10-12 Kubernetes 安全专家(CKS)必过心得
- 2024-10-12 深入理解K8S网络原理上(k8s网络解决方案)
- 2024-10-12 一次客户需求引发的K8S网络探究(基于客户需求)
- 2024-10-12 今天讲讲k8s的pod控制器及无状态和有状态
- 2024-10-12 k8s如何滚动升级应用(k8s升级组件方法)
- 2024-10-12 k8s基础知识之service类型(k8s的service类型)
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)