【K8S 云原生】K8S的对外服务—ingress

目录

一、K8S的Service

1、Service的作用

2、Service类型:

二、ingress

1、ingress的组成:

2、ingress资源的定义项:

3、ingress暴露服务端的方式

3.1、Deployment+LoadBalancer模式:

1、工作流程图:

3.2、Daemonset+hostnetwork+nodeSelector模式:

1、工作流程图

2、实验:

3.3、deployment+NodePort

1、实验:

4、通过虚拟主机的方式实现http代理

三、总结:


一、K8S的Service

1、Service的作用

Service的作用体现在两个方面:

1、集群内部:不断跟踪pod的变化,更新endpoints中的pod对象,基于pod的IP地址不断变化的一种服务发现机制

2、集群外部:类似负载均衡器,可以把流量IP+端口,不涉及转发url(http、https),把请求转发到pod中

2、Service类型:

NodePort:容器端口—Service端口—NodePort映射。设定了NodePort之后每个节点都会有一个端口被打开30000-32767

LoadBalancer:云平台上的Service服务。由云平台提供负载均衡的IP地址

ExternalName:域名映射

ingress:基于域名进行映射,转发的是url请求(http、https)转发到Service,再由Service转发到每一个pod

ingress只需要一个或者是少量的公网IP或者LB,可以把多个http请求暴露到外网

他是七层反向代理

可以将ingress理解为,Service的Service。是一组基于域名和url路径把请求转发到一个或者多个请求转发到Service的规则

ingress先七层转发转发都Service,Service再四层转发转发到pod

二、ingress

1、ingress的组成:

ingress是一个api对象,通过yaml文件来进行配置。ingress作用就是定义请求如何转发到Service的规则

ingress通过http和https暴露集群内部的Service,给Service提供一个外部的url、负载均衡、ssl/tls(https)的能力,实现一个基于域名的负载均衡

ingress-controller:由这个组件来具体的实现反向代理和负载均衡的程序,以及对ingress定义的规则进行解析,根据ingress的配置的规则进行请求的转发。

但是这个ingress-controller不是K8S自带的组件功能,ingress-controller是一个统称(一系列工具)

比如nginx ingress-controller、traefik都是ingress-controller,开源的软件

ingress-controller是pod的方式运行在节点上

2、ingress资源的定义项:

  1. 定义外部流量的路由规则
  2. 定义的服务暴露的方式、主机名、访问的路径和其他的一些选项
  3. 负载均衡(ingress-controller实现)

3、ingress暴露服务端的方式

3.1、Deployment+LoadBalancer模式:

ingress部署在公有云。ingress配置文件中会有type。type:LoadBalancer。公有云平台会为这个LoadBalancer的Service自动创建一个负载均衡器。绑定公网地址

通过域名指向公网地址,实现集群对外暴露

1、工作流程图:

3.2、Daemonset+hostnetwork+nodeSelector模式:

Daemonset:在每个节点都会创建一个pod

hostnetwork:共享节点主机的网络命名空间。容器内直接使用节点主机的IP+端口。pod上的容器可以直接访问主机上的网络资源

nodeSelector:根据标签选择部署的节点。选择nginx-ingress-controller部署的节点

缺点:直接利用节点主机的网络和端口资源,一个node只能部署一个ingress-controller的pod

适用场景:大并发场景的生产环境。性能是最好的

1、工作流程图

Service和endpoints来发现节点

最终转发是由ingress-controller来转发请求(http)和负载均衡

用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访问服务。这时,ingress-controller所在的node机器就很类似传统架构的边缘节点,比如机房入口的nginx服务器。该方式整个请求链路最简单,性能相对NodePort模式更好。

缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod。 比较适合大并发的生产环境使用。

2、实验:
#mandatory.yaml文件中包含了很多资源的创建,包括namespace、ConfigMap、role,ServiceAccount等等所有部署ingress-controller需要的资源。官方下载地址:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.0/deploy/static/mandatory.yaml上面可能无法下载,可用国内的 gitee
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.25.0/deploy/static/mandatory.yaml
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml

DaemonSet+HostNetwork具体的部署过程 

下载安装ingress-controller pod及相关资源

每个节点上,上传ingress-contro控制器

解压安装
tar -xf ingree.contro-0.30.0.tar.gz
docker load -i ingree.contro-0.30.0.tar#节点打标签,用于选择节点部署ingress-controller
kubectl label nodes node02 ingress=true

192-215行修改配置文件

启动 nginx-ingress-controller,并检查该pod的运行状况 

kubectl apply -f mandatory.yaml#nginx-ingress-controller 已经运行 node02 节点
kubectl get pod -n ingress-nginx -o widekubectl get cm,daemonset -n ingress-nginx -o wide#到 node02 节点查看
netstat -lntp | grep nginx

由于配置了 hostnetwork,nginx 已经在 node 主机本地监听 80/443/8181 端口。其中 8181 是 nginx-controller 默认配置的一个 default backend(Ingress 资源没有匹配的 rule 对象时,流量就会被导向这个 default backend)。

这样,只要访问 node 主机有公网 IP,就可以直接映射域名来对外网暴露服务了。如果要 nginx 高可用的话,可以在多个 node

上部署,并在前面再搭建一套 LVS+keepalived 做负载均衡。

创建 ingress 规则

创建一个业务pod和svc资源和ingress规则:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc
spec:accessModes:- ReadWriteManystorageClassName: nfs-client-storageclassresources:requests:storage: 2Gi---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-applabels:app: nginx1
spec:replicas: 3selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- name: nginximage: nginx:1.22volumeMounts:- name: nfs-pvcmountPath: /usr/share/nginx/htmlvolumes:- name: nfs-pvcpersistentVolumeClaim:claimName: nfs-pvc---
apiVersion: v1
kind: Service
metadata:name: nginx-app-svc
spec:ports:- protocol: TCPport: 80targetPort: 80selector:app: nginx1---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-app-ingress
spec:rules:- host: www.test1.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-app-svcport:number: 80
#选择一台客户机,直接添加node02的节点的IP与pod的域名进行映射
vim /etc/hosts
20.0.0.63 www.test1.com访问curl www.test1.com

3.3、deployment+NodePort

同样用deployment模式部署ingress-controller,并创建对应的service,但是type为NodePort。这样,ingress就会暴露在集群节点ip的特定端口上。由于nodeport暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境ip地址不变的场景

NodePort方式暴露ingress虽然简单方便,但是NodePort多了一层NAT,在请求量级很大时可能对性能会有一定影响

1、实验:

如果做了上一个操作,就将所有的yaml文件通过delete进行清除。继续下面的操作 

下载相关的ingress和service-nodeport模板
mkdir /opt/ingress/test
cd /opt/ingress/test
#官方下载地址:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml#国内 gitee 资源地址:
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml#在所有 node 节点上传镜像包 ingress-controller-0.30.0.tar 到 /opt/ingress-nodeport 目录,并加载镜像
docker load -i ingress-controller-0.30.0.tar

直接启动官方模板即可使用

#若是新的mandatory.yaml文件,直接启动即可,若是用上个实验的,要还原到最初始
kubectl apply -f mandatory.yaml

还原脚本如下:

在所有节点上部署ingress-controller

#启用Service-nodeport
kubectl apply -f service-nodeport.yaml

#//如果K8S Pod 调度失败,在 kubectl describe pod资源时显示:
Warning  FailedScheduling  18s (x2 over 18s)  default-scheduler  0/2 nodes are available: 2 node(s) didn't match node selector解决方案:
1. 给需要调度的node加上对应标签
# 相对上面这个Yaml文件的例子
kubectl label nodes node_name kubernetes.io/os=linux
2. 删除Yaml文件中的nodeSelector,如果对节点没有要求的话,直接删除节点选择器即可

进行Ingress Http代理访问的操作演示

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc
spec:accessModes:- ReadWriteManystorageClassName: nfs-client-storageclassresources:requests:storage: 2Gi---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-applabels:app: nginx1
spec:replicas: 3selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- name: nginximage: nginx:1.22volumeMounts:- name: nfs-pvcmountPath: /usr/share/nginx/htmlvolumes:- name: nfs-pvcpersistentVolumeClaim:claimName: nfs-pvc---
apiVersion: v1
kind: Service
metadata:name: nginx-app-svc
spec:ports:- protocol: TCPport: 80targetPort: 80selector:app: nginx1---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-app-ingress
spec:rules:- host: www.test1.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-app-svcport:number: 80

访问IP+NodePort端口

工作流程:

每个节点都是从controller----接收到解析后的请求IP+端口----ingress-----Service----pod

总结:

nginx-ingress-controller

host—>ingresss的配置找到pod—>controller—>请求发到pod

nodeport--->controller--->ingress--->service--->pod

NodePort暴露端口的方式最简单的方法,NodePort多了一层nat(地址转换)

并发量大的对性能会有一定影响,内部都会用nodePort

4、通过虚拟主机的方式实现http代理

通过ingress的方式实现:一个ingress可以访问不同的主机

我们知道nginx和apache能够设置三种虚拟主机,分别为:基于IP,基于域名,基于端口。同样ingress-nginx这里也可以设置出这三种虚拟主机。下面将以最常用的基于域名的虚拟主机为例子,进行操作演示

先创建两个pod和Service

虚拟主机1:

apiVersion: apps/v1
kind: Deployment
metadata:name: deployment1labels:test: nginx1
spec:replicas: 1selector:matchLabels:test: nginx1template:metadata:labels:test: nginx1spec:containers:- name: nginx1image: nginx:1.22
---
apiVersion: v1
kind: Service
metadata:name: svc-1
spec:ports:- port: 80targetPort: 80protocol: TCPselector:test: nginx1

虚拟主机2将上面标签全部替换

再创建ingress资源

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress1
spec:rules:- host: www1.test.comhttp:paths:- path: /pathType: Prefixbackend:service:name: svc-1port:number: 80---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress2
spec:rules:- host: www2.test.comhttp:paths:- path: /pathType: Prefixbackend:service:name: svc-2port:number: 80

映射域名:
vim /etc/hosts#这里任意填写一个node节点的IP即可
20.0.0.62 www.test.com www.abc.com   

然后就可以基于域名+NodePort端口进行访问了

三、总结:

ingress两个重要的组件:

ingress--nginx-ingress-controller

traefik

都是开源的ingress-controller

三种工作方式:

1、deployment+LoadBalancer,需要云平台提供一个负载均衡的公网地址,公有云上做

2、Daemonset+hostnetwork+nodeSelector,指定节点部署controller,缺点就是和宿主机共享网络,只能是一个controller的pod

        hostnetwork这个配置回合宿主机共享网络资源

3、deployment+NodePort,最常见,最常用,也是最简单的方式。他是集中一个NodePort端口,所有的ingress的请求都会转发到NodePort,然后由Service把流量转发到pod

一个ingress的NodePort可以实现访问多个虚拟主机(域名),和nginx是一样的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/240505.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDF转PowerPoint - Java实现方法

通过编程实现PDF转PPT的功能,可以自动化转换过程,减少手动操作的工作量,并根据需要进行批量转换。将PDF文件转换为PPT文档后,可以利用PPT的丰富功能和动画效果,达到更好的演示效果。 在Java中,我们可以使用…

PyTorch损失函数(二)

损失函数 5、nn.L1Loss nn.L1Loss是一个用于计算输入和目标之间差异的损失函数,它计算输入和目标之间的绝对值差异。 主要参数: reduction:计算模式,可以是none、sum或mean。 none:逐个元素计算损失,返…

清晰光谱空间:全自动可调波长系统的高光谱成像优势

高光谱成像技术 高光谱成像技术是一种捕获和分析宽波长信息的技术,能够对材料和特征进行详细的光谱分析和识别。高光谱成像技术的实现通过高光谱相机,其工作原理是使用多个光学传感器或光学滤波器分离不同波长的光,并捕获每个波段的图像&…

Node+Express编写接口---服务端

开始: 个人兴趣爱好,欢迎大家多多指教!(点击直达源码!) node_vue_admin: 第一个以node为后端,vue为前端的后台管理项目https://gitee.com/ah-ah-bao/node_vue_admin.git 第一步:安装 安装Node.js 点击直达Node.js (nodejs.org) 安装Navic…

点赞模块设计 - Redis缓存 + 定时写入数据库实现高性能点赞功能

点赞模块设计 - Redis缓存 定时写入数据库实现高性能点赞功能 源码地址:github.com/cachecats/c… 点赞是作为整个系统的一个小模块,代码在 user-service 用户服务下。 本文基于 SpringCloud, 用户发起点赞、取消点赞后先存入 Redis 中,再…

WordPress回收站自动清空时间?如何关闭回收站或设置自动清理天数?

我们在WordPress后台的文章、页面、评论等页面都可以看到有回收站,意思就是我们不能直接删除某篇文章、页面、评论,而是需要现将它们移至回收站,然后再到回收站永久删除,或等回收站自动清理。 如上图所示,WordPress 6.…

javacv和opencv对图文视频编辑-裸眼3D图片制作

通过斗鸡眼,将左右两张相似的图片叠加到一起看,就会有3D效果。 3D图片,3D眼镜,3D视频等原理类似,都是通过两眼视觉差引起脑补产生3D效果。 图片: 图片来源: 一些我拍摄的真*裸眼3D照片 - 哔哩…

Java21 + SpringBoot3集成Spring Data JPA

Java21 SpringBoot3集成Spring Data JPA 文章目录 Java21 SpringBoot3集成Spring Data JPA前言相关技术简介ORM(Object-Relational Mapping,对象-关系映射)JPA(Java Persistence API,Java持久层API)Hiber…

新版K8s:v1.28拉取Harbor仓库镜像以及本地镜像(docker弃用改用containerd,纯纯踩坑)

目录 一、项目概述二、环境三、项目样式Harborkuboard运行样式 四、核心点Harbor安装config.toml文件修改(containerd)ctr、nerdctl相关命令kuboard工作负载 五、总结 一、项目概述 使用Kuboard作为k8s集群的管理平台,Harbor作为镜像仓库,拉取Harbor镜像…

【kafka】记录用-----------1

主题(topic):消息的第一次分类 根据人为的划分条件将消息分成不同的主题 主题的划分是人为的根据不同的任务情景去划分 比如,我们有两个主题,一个是"订单",另一个是"库存"。每个主题代…

24号资源——程序:电力系统程序集合已提供下载资源

24号资源:程序集合包含17个程序(经典电力系统经济调度程序;2解决带储;3智能微电网PSO优化算法;微电网调度等等见资源描述)资源-CSDN文库https://download.csdn.net/download/LIANG674027206/88752141&#…

ruoyi-cloud—若依微服务打包部署

1. 前端端口修改 2. 后端端口修改 (1)修改ruoyi-gateway服务中的bootstrap.yml的port端口 (2)修改ruoyi-ui中的vue.confing.js的target中的端口 3. 后端部署 (1) 在本地电脑上代码界面上打包后端 在ruoyi项目的bin目录下执行pa…

迭代器模式介绍

目录 一、迭代器模式介绍 1.1 迭代器模式定义 1.2 迭代器模式原理 1.2.1 迭代器模式类图 1.2.2 模式角色说明 1.2.3 示例代码 二、迭代模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 抽象迭代类 2.2.2 抽象集合类 2.2.3 主题类 2.2.4 具体迭代类 2.2.5 具体集合类 …

【动态规划】【数学】【C++算法】18赛车

作者推荐 视频算法专题 本文涉及知识点 动态规划 数学 LeetCode818赛车 你的赛车可以从位置 0 开始,并且速度为 1 ,在一条无限长的数轴上行驶。赛车也可以向负方向行驶。赛车可以按照由加速指令 ‘A’ 和倒车指令 ‘R’ 组成的指令序列自动行驶。 当…

软件工程应用题汇总

绘制数据流图(L0/L1/L2) DFD/L0(基本系统模型) 只包含源点终点和一个处理(XXX系统) DFD/L1(功能级数据流图)在L0基础上进一步划分处理(XXX系统) 个人理解 DFD/L2(在L1基础上进一步分解后的数据流图) 数据…

flex布局(3)

九、骰子 *{margin:0;padding: 0;box-sizing: border-box; } .flex{display: flex;flex-flow: row wrap;justify-content: space-between;align-items: center;align-content: space-between;padding:20px; } .touzi{width: 120px;height: 120px;background-color: aliceblue;…

canvas绘制美队盾牌

查看专栏目录 canvas示例教程100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

陶瓷碗口缺口检测-图像分割

图像分割 由于对碗口进行缺口检测,因此只需要碗口的边界信息。得到陶瓷碗区域填充后的图像,对图像进行边缘检测。这是属于图像分割中的内容,在图像的边缘中,可以利用导数算子对数字图像求差分,将边缘提取出来。 本案…

React 基于Ant Degisn 实现table表格列表拖拽排序

效果图: 代码: myRow.js import { MenuOutlined } from ant-design/icons; import { DndContext } from dnd-kit/core; import { restrictToVerticalAxis } from dnd-kit/modifiers; import {arrayMove,SortableContext,useSortable,verticalListSorti…

探案录 | 人大金仓一个底座+多场景应用

近日,金仓大世界发布了《2023城市数字经济发展报告》,福尔摩斯•K从报告中抓住了三大重点:第一,数字经济规模超过50万亿元,占GDP比重提升至41.5%;第二,数字经济与实体经济融合愈发紧密&#xff…