热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kubernetes学习记录(六):深入理解service和Ingress

1.service防止pod失联(服务发现)定义一组pod的访问规则(负载均衡) 服务发现假设现在是一个deployment控制器,一般为了保证高可用都会至少部署三个副本,而且三个

1. service

  • 防止pod失联(服务发现)

  • 定义一组pod的访问规则(负载均衡)

 

服务发现

假设现在是一个deployment控制器,一般为了保证高可用都会至少部署三个副本,而且三个pod都有独立的ip地址

当一个pod挂掉之后,deployment会立刻拉取一个新的pod,但是新pod的ip地址明显是和挂掉的那个pod不一样

这时候service就发挥了作用,前端和后端pod不需要通过ip地址来直接通信,而是经由service来做一个统一的管理操作

 

负载均衡

当我有多个副本时,客户端发送的请求需要具体转发到哪个pod上,这就是负载均衡

 


1.1 Pod和Service的关系



  • pod与service通过label-selector关联

  • 通过service实现pod的负载均衡(TCP/UDP四层,只负责IP数据包转发

Service看起来就像是为Pod提供了一个网络代理的功能

 


1.2 Service常用类型



  • ClusterIP:默认设置,集群内部使用

  • NodePort:对外暴露应用

  • LoadBalancer:对外暴露应用,适用于公有云

比如在一个客户端-后端-数据库的业务架构中,客户端-后端、后端-数据库之间的通信就要选择ClusterIP,因为这些都不需要暴露

而用户和客户端之间就需要使用NodePort,即我们要把客户端的服务暴露出去

 


1.2.1 ClusterIP

分配一个稳定的IP地址,即VIP,只能在集群内部访问,同一个namesapce内的pod

最典型的ClusterIP就是k8s集群服务的service,我们可以通过下面的指令查看所有的svc

kubectl get svc

 

这个虚拟IP可以在任意一个节点、任意一个pod内访问

 


1.2.2 NodePort

提供一个端口,供外部访问,但其存在一个问题就是可以通过所有的的形式来访问

 

对外暴露的端口号从30000起,默认是集群随机分配的

也可以通过spec.ports.nodePort字段来指定一个暴露端口,但注意可能会存在端口占用情况

这个暴露的端口在每个节点都会监听,不论这个节点有没有提供服务的pod

 

外界访问任意一个node都可以获取服务,通过 的形式,然后统一由service来做负载均衡

 

比如在下面这个svc列表中,web是作为NodePort类型的,可以看到它在 PORT(S)这一项是有两个端口号

左侧是集群内部访问的,也就是一种ClusterIP

右边是通过节点IP地址暴露出去的一个端口号

 

一般来讲,生产环境中所有的node都部署在内网,即使暴露了端口,在公网上也无法访问

这时候一般会有以下解决方案:



  • 找一台有公网IP的服务器,使用nginx反向代理到node

  • 使用外部负载均衡器,比如nginx、LVS、HAProxy做负载均衡,将流量转发到node

 


1.2.3 LoadBalancer

与NodePort类似,在每个节点上启用一个端口来暴露服务

除此之外,k8s还会请求底层云平台上的负载均衡器,将每个Node 作为后端添加进去

用户通过访问公有云上的负载均衡器来访问node 

 


1.3 Service代理模式


1.3.1 Iptables

iptables是Service的默认模式

iptables能做什么?



  • 阻断IP通信

  • 端口映射NAT

  • 跟踪包的状态

  • 数据包的修改

 

kube-proxy组件默认实现iptables,具体来讲就是实现数据包在node之间的转发

将service相关规则来落地实现

如果使用NodePort的访问规则的话,我们在外部访问任意节点IP+暴露端口,采取轮询机制找到一个提供服务的pod

NodePort:192.167.11.89:30008

     -> KUBE-SVC-XXXXXX (负载均衡) --probalility  0.3333333

     -> KUBE-SEP-YYYYYYY

     -> -j DNAT --to-destination 10.244.2.2:80 (提供服务的Pod)

 

iptables的特点:



  • 灵活,功能强大

  • 规则遍历匹配和更新,呈线性时延

 


1.3.2 IPVS

 

LVS就是基于ipvs模块实现的四层负载均衡器

ipvs特点:



  • 工作在内核态,有更好的性能

  • 调度算法丰富:rr、wrr、lc、wlc、ip hash ...

 


2. Ingress

为什么需要Ingress?

首先来看一下NodePort存在的问题:



  • 一个端口只能一个服务来使用,因为在所有的Node上都暴露了这个端口

  • 只支持四层的负载均衡

 


2.1 Ingress和Pod的关系



  • 通过Service完成关联

  • 通过Ingress Controller实现Pod的负载均衡,支持TCP/UDP四层和HTTP七层

 


2.2 部署Ingress Controller

Ingress Controller有很多实现,官方维护的是nginx控制器,其他的主流控制器也有Traefik和Istio

官方提供了很多第三方控制器的项目地址:Ingress 控制器 | Kubernetes

我们使用官方的nginx控制器,下载好yaml之后需要修改镜像源为国内镜像源,修改hostNetwork: true

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.2/deploy/static/provider/cloud/deploy.yaml > ic.yaml

 

根据这个YAML文件创建两个pod,其实是和节点数有关,这是以DaemonSet方式部署的

 


2.3 设置Ingress规则

对于下面这个ingress规则,首先需要指定kind为ingress

最重要的就是service字段,指明暴露的服务名称和端口

同时通过域名绑定服务,如果测试的话需要修改本机hosts来访问


2.4 Ingress根据URL路由到多个服务

比如在下面的示例中,Ingress管理了两个service

用户可以通过域名的方式来访问这两个service,其中/foo和/bar就负责路由的转发

这个Ingress规则的YAML文件如下所示:

 

Ingress规则中有两个后端service,路由路径分别为/foo和/bar

当我们访问foo.bar.com/foo时,ingress就会帮我路由到service1,访问foo.bar.com/bar时,ingress会路由到service2

其中的pathType: Prefix是前缀匹配,也就是说只要是以 "/foo" 开头的URL都会被路由到service1

匹配规则可见:Ingress | Kubernetes

 


2.5 Ingress Controller高可用方案

其中集群模式更为常见,可以在公网节点上部署一个负载均衡器,比如nginx,把流量转发给Ingress Controller

 

参考:

Ingress | Kubernetes

Installation Guide - NGINX Ingress Controller (kubernetes.github.io)

Ingress 控制器 | Kubernetes

 



推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 高可用架构_MySQL高可用架构设计
    文章来自于https:www.jianshu.compd3107bda2963PHP进阶学习交流QQ群:983229225Mysql复制功能介绍Mysql的复制功能提 ... [详细]
  • 【2021Java最新学习路线】开启mysql远程连接
    前言面试技巧另外开篇再说,先上面试干货吧。面试的题目并不一定有严格的顺序关系,有的是从前一个问题延伸而来,(探究的是一个知 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Kubernetes(k8s)基础简介
    Kubernetes(k8s)基础简介目录一、Kubernetes概述(一)、Kubernetes是什么(二& ... [详细]
  • 一、生产服务器netstattcp连接状态 ... [详细]
author-avatar
雲痕影落_969
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有