当前位置: 首页 > news >正文

k8s ingress (二)

k8s ingress ()

Ingress介绍

在前面课程中已经提到,Service对集群之外暴露服务的主要方式有两种:NodePort和LoadBalancer,但是这两种方式,都有一定的缺点:

NodePort方式的缺点是会占用很多集群机器的端口,那么当集群服务变多的时候,这个缺点就愈发明显

LB方式的缺点是每个service需要一个LB,浪费、麻烦,并且需要kubernetes之外的设备的支持。

基于这种现状,kubernetes提供了Ingress资源对象,Ingress只需要一个NodePort或者一个LB就可以满足暴露多个Service的需求。工作机制大致如下图表示:

实际上,Ingress相当于一个7层的负载均衡器,是kubernetes对反向代理的一个抽象,它的工作原理类似于Nginx,可以理解成在Ingress里建立诸多映射规则,Ingress Controller通过监听这些配置规则并转化成Nginx的配置,然后对外部提供服务。在这里有两个核心概念:

ingress:kubernetes中的一个对象,作用就定义请求如何转发到service的规则

ingress controller:具体实现发向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发,实现方式有很多,比如Nginx、Contour、Haproxy等等。

Ingress(以Nginx为例)的工作原理如下:

用户编写Ingress规则,说明哪个域名对应kubernetes集群中欧冠的哪个Service

Ingress控制器动态感知Ingress服务规则的变化,然后生成一段对应的Nginx配置

Ingress控制器会将生成的Nginx配置写入到一个运行着Nginx服务中,并动态更新

到此为止,其实真正在工作的就是Nginx了,内部配置了用户定义的请求转发规则

Ingress 环境准备

在ELB下的监听器中,可以通过监听器协议和端口来判断是4层还是7层的。

如果监听器协议是TCP或UDP,那么该监听器是4层的。这种监听器只能根据目标端口将流量转发到后端实例,不能对流量进行任何处理。

如果监听器协议是HTTP或HTTPS,那么该监听器是7层的。这种监听器可以根据请求的URL、HTTP头部等信息对流量进行处理,并将流量转发到后端实例。

此外,还可以通过监听器端口来判断是4层还是7层的。如果监听器端口是80或443,那么该监听器是7层的;如果监听器端口是其他端口,那么该监听器是4层的

Ingress 的使用

Ingress 环境准备

# 创建文件夹

[root@master ~]# mkdir ingress-controller

[root@master ~]# cd ingress-controller/

# 获取ingress-nginx,本次案例使用的是0.30版本

[root#master ingress-controller]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml

[root#master ingress-controller]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

# 修改mandatory.yaml文件中的仓库(本人实验不需要修改也可以)

# 修改quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0

# 为quay-mirror.qiniu.com/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0

# 创建ingress-nginx

[root@master ingress-controller]# kubectl apply -f ./

# 查看ingress-nginx

[root@master ingress-controller]# kubectl get pod -n ingress-nginx

NAME                                                                           READY    STATUS         RESTARTS             AGE

pod/nginx-ingress-controller-fbf967dd5-4qpbp    1/1         Running        0                            12h

# 查看service

[root@master ingress-controller]# kubectl get svc -n ingress-nginx

NAME                   TYPE             CLUSTER-IP          EXTERNAL-IP PORT(S)                                     AGE

ingress-nginx NodePort      10.98.75.163  <none>         80:32240/TCP,443:31335/TCP    11h

准备servicepod

为了后面的实验比较方便,创建如下图所示的模型

创建tomcat-nginx.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: nginx-deployment 

  namespace: dev

spec:

  replicas: 3 

  selector:   

    matchLabels:

      app: nginx-pod 

  template:

    metadata:  

      labels:    

        app: nginx-pod

    spec:  

      containers:     

      - name: nginx       

        image: nginx:1.17.1       

        ports:       

        - containerPort: 80

---

apiVersion: apps/v1

kind: Deployment

metadata:

  name: tomat-deployment 

  namespace: dev

spec: 

  replicas: 3 

  selector:   

    matchLabels:     

      app: tomcat-pod 

  template:   

    metadata:     

      labels:       

        app: tomcat-pod   

    spec:     

      containers:     

      - name: tomcat       

        image: tomcat:8.5-jre10-slim       

        ports:       

        - containerPort: 8080

---

apiVersion: v1

kind: Service

metadata: 

  name: nginx-service 

  namespace: dev

spec: 

  selector:   

    app: nginx-pod 

  clusterIP: None 

  type: ClusterIP 

  ports: 

  - port: 80   

    targetPort: 80

---

apiVersion: v1

kind: Service

metadata: 

  name: tomcat-service 

  namespace: dev

spec: 

  selector:

    app: tomcat-pod 

  clusterIP: None 

  type: ClusterIP 

  ports: 

  - port: 8080   

targetPort: 8080

# 创建[root@master ~]# kubectl create -f tomcat-nginx.yaml

# 查看

[root@master ~]# kubectl get svc -n dev

NAME                          TYPE                    CLUSTER-IP                 EXTERNAL-IP        PORT(S)         AGE

nginx-service       ClusterIP        None                           <none>                80/TCP          48s

tomcat-service            ClusterIP        None                           <none>                8080/TCP      48s

Http代理

创建ingress-http.yaml

apiVersion: extensions/v1beta1

kind: Ingress

metadata: 

  name: ingress-http 

  namespace: dev

spec: 

  rules: 

  - host: nginx.itheima.com   

    http:     

      paths:     

      - path: /       

        backend:         

          serviceName: nginx-service         

          servicePort: 80 

  - host: tomcat.itheima.com   

    http:     

    paths:     

    - path: /       

      backend:         

      serviceName: tomcat-service         

      servicePort: 8080

# 创建

[root@master ~]# kubectl create -f ingress-http.yaml

ingress.extensions/ingress-http created

# 查看

[root@master ~]# kubectl get ing ingress-http -n dev

NAME                   HOSTS                                                    ADDRESS                     PORTS           AGE

ingress-http  nginx.itheima.com,tomcat.itheima.com                          80                 22s

# 查看详情

[root@master ~]# kubectl describe ing ingress-http -n dev

...

Rules:

Host                     Path backends

----                            ----       --------

nginx.itheima.com /             nginx-service:80(10.244.1.96:80,10.244.1.97:80,10.244.2.112.80)

tomcat.itheima.com     /             tomcat-service:8080(10.244.1.94:8080,10.244.1.95:8080,10.244.2.111.8080)

# 接下来,在本地电脑配置host文件,解析上面的两个域名到192.168.109.100(master)上

# 然后,就可以分别访问tomcat.itheima.com:32240 和nginx.itheima.com:32240 查看效果了

Https代理

创建证书

# 生成证书

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=BJ/L=BJ/0=nginx/CN=itheima.com"

# 创建密钥

kubectl create secret tls tls-secret --key tls.key --cert tls.crt

创建ingress-https.yaml 文件

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

  name: ingress-https

  namespace: dev

spec:

  tls:

    - hosts:

      - nginx.itheima.com

      - tomcat.itheima.com

      secretName: tls-secret # 指定秘钥

  rules:

  - host: nginx.itheima.com

    http:

      paths:

      - path: /

        backend:

          serviceName: nginx-service

          servicePort: 80

  - host: tomcat.itheima.com

    http:

      paths:

      - path: /

        backend:

          serviceName: tomcat-service

          servicePort: 8080

# 创建 inress

[root@master ~]# kubectl create -f ingress-https.yaml

ingress.extensions/ingress-https created

# 查看

[root@master ~]# kubectl get ing ingress-https -n dev

NAME                   HOSTS                                                           ADDRESS                     PORTS    AGE

ingress-https nginx.itheima.com,tomcat.itheima.com     10.104.184.38 80, 443       2m42s

# 查看详情

[root@master ~]# kubectl describe ing ingress-https -n dev

...

TLS:

  tls-secret terminates nginx.itheima.com,tomcat.itheima.com

Rules:

Host                     Path backends

----                            ----       --------

nginx.itheima.com /             nginx-service:80(10.244.1.97:80,10.244.1.98:80,10.244.2.119.80)

tomcat.itheima.com     /             tomcat-service:8080(10.244.1.99:8080,10.244.2.117:8080,10.244.2.120.8080)

# 下面可以通过浏览器访问https://nginx.itheima.com:31335 和 https://tomcat.itheima.com:31335来查看了

相关文章:

k8s ingress (二)

k8s ingress (二) Ingress介绍 在前面课程中已经提到&#xff0c;Service对集群之外暴露服务的主要方式有两种&#xff1a;NodePort和LoadBalancer&#xff0c;但是这两种方式&#xff0c;都有一定的缺点&#xff1a; NodePort方式的缺点是会占用很多集群机器的端口&#xff0…...

如何实现element UI中table操作栏更多按钮的展示与折叠?

解决思路: ​ 直接使用elementUI文档上Popover 弹出框组件 废话不多说,直接上代码吧 <el-table :data="locationList" v-loading="loading" border class="table" ref="multipleTable" @selection-change="handleSelecti…...

SpringBoot(二)

###SpringBoot原理分析 ###SpringBoot监控 ###SpringBoot项目部署 #SpringBoot自动配置 Condition&#xff1a;&#xff08;条件&#xff09; Condition是在Spring4.0增加的条件判断功能&#xff0c;通过这个功能可以实现选择性的创建Bean操作 SpringBoot是如何知道要创建…...

python脚本——批量将word文档转换成pdf文件

语言&#xff1a;python 3 用法&#xff1a;点击运行后&#xff0c;弹出窗口选择word文档所在文件夹&#xff0c;程序运行后对该文件夹下所有的word文件全部转换成pdf文件&#xff0c;生成的pdf文件名字与原wrod文件相同。 如运行中报错&#xff0c;需要自行根据报错内容按照…...

自然语言处理从入门到应用——LangChain:链(Chains)-[通用功能:链的保存(序列化)与加载(反序列化)]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 本文介绍了如何将链保存&#xff08;序列化&#xff09;到磁盘和从磁盘加载&#xff08;反序列化&#xff09;。我们使用的序列化格式是json或yaml。目前&#xff0c;只有一些链支持这种类型的序列化。随着时间的推移&…...

机器学习:开启智能时代的重要引擎

引言 随着科技的飞速发展&#xff0c;人工智能已经渗透到我们生活的各个领域。而在人工智能的众多领域中&#xff0c;机器学习以其强大的数据处理能力和智能决策能力受到了广泛关注。本文将向您介绍机器学习的概念、工作原理、应用领域以及未来的发展前景。 一、什么是机器学…...

ES搭建集群

一、创建 elasticsearch-cluster 文件夹 创建 elasticsearch-7.8.0-cluster 文件夹&#xff0c;在内部复制三个 elasticsearch 服务。 然后每个文件目录中每个节点的 config/elasticsearch.yml 配置文件 node-1001 节点 #节点 1 的配置信息&#xff1a; #集群名称&#xff0…...

# Lua与C++交互(二)———— 交互

C 调用lua 基础调用 再来温习一下 myName “beauty girl” C想要获取myName的值&#xff0c;根据规则&#xff0c;它需要把myName压入栈中&#xff0c;这样lua就能看到&#xff1b;lua从堆栈中获取myName的值&#xff0c;此时栈顶为空&#xff1b;lua拿着myName去全局表中查…...

机器人焊接生产线参数监控系统理解需求

机器人焊接生产线参数监控系统是以参数来反映系统状态并以直观的方式表现 出来&#xff0c;及时了解被监视对象的状态和状态的变化情况。其主要目标是为了达到减少 生产线的处理时间&#xff0c;降低故障率&#xff0c;缩短故障排除时间&#xff0c;从而提高生产线的生产效率 …...

前端基础(ES6 模块化)

目录 前言 复习 ES6 模块化导出导入 解构赋值 导入js文件 export default 全局注册 局部注册 前言 前面学习了js&#xff0c;引入方式使用的是<script s"XXX.js">&#xff0c;今天来学习引入文件的其他方式&#xff0c;使用ES6 模块化编程&#xff0c;…...

第七章,文章界面

7.1添加个人专栏 <template><div class="blog-container"><div class="blog-pages"><!-- 用于渲染『文章列表』和『文章内容』 --><router-view/><div class="col-md-3 main-col pull-left"><div cla…...

HJ102 字符统计

描述 输入一个只包含小写英文字母和数字的字符串&#xff0c;按照不同字符统计个数由多到少输出统计结果&#xff0c;如果统计的个数相同&#xff0c;则按照ASCII码由小到大排序输出。 数据范围&#xff1a;字符串长度满足 1≤len(str)≤1000 1≤len(str)≤1000 输入描述&a…...

Maven聚合项目(微服务项目)创建流程,以及pom详解

1、首先创建springboot项目作为父项目 只留下pom.xml 文件&#xff0c;删除src目录及其他无用文件 2、创建子项目 子项目可以是maven项目&#xff0c;也可以是springboot项目 3、父子项目关联 4、父项目中依赖管理 <?xml version"1.0" encoding"UTF-8&qu…...

Android OkHttp 源码浅析一

演进之路:原生Android框架不好用 ---- HttpUrlConnect 和 Apache HTTPClient 第一版 底层使用HTTPURLConnect 第二版 Square构建 从Android4.4开始 基本使用: val okhttp OkHttpClient()val request Request.Builder().url("http://www.baidu.com").buil…...

【Redis】——Redis基础的数据结构以及应用场景

什么是redis数据库 Redis 是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。&#xff0c;Redis 还支持 事务 、持久化、Lua 脚本、多种集群方案&#xff08;主…...

SpringBoot+WebSocket搭建多人在线聊天环境

一、WebSocket是什么&#xff1f; WebSocket是在单个TCP连接上进行全双工通信的协议&#xff0c;可以在服务器和客户端之间建立双向通信通道。 WebSocket 首先与服务器建立常规 HTTP 连接&#xff0c;然后通过发送Upgrade标头将其升级为双向 WebSocket 连接。 WebSocket使得…...

推荐适用于不同规模企业的会计软件:选择最适合您企业的解决方案

高效的会计软件不仅可以协助企业进行财务管理&#xff0c;做出科学的财务决策&#xff0c;还可以对企业数字化转型提供助力。不同规模的企业需要根据其特定需求选择适合的会计软件。那么有什么适合不同规模企业的会计软件推荐吗&#xff1f; 小型企业的选择 对于小型企业而言&…...

Apache Zookeeper架构和选举机制

ZooKeeper是一个开源的分布式协调服务,旨在解决分布式系统中的一致性、配置管理、领导者选举等问题。它由Apache软件基金会维护,是Hadoop生态系统的一部分,被广泛用于构建高可用、可靠和具有一致性的分布式应用程序和服务。 ZooKeeper提供了一个层次化的命名空间,类似于文…...

车联网TCU USB的配置和使用

1 usb_composition命令 # cat /sbin/usb/target # cd /sys/class/android_usb/android0 # cat functions console shows that QCOM’s default configuration Usage: usb_composition [Pid] [HSIC] [PERSISTENT] [IMMEDIATE] [FROM_ADBD] usb_composition 9025 n y y Then this…...

Linux系统USB摄像头测试程序(三)_视频预览

这是在linux上usb摄像头视频预览程序&#xff0c;此程序用到了ffmpeg、sdl2、gtk3组件&#xff0c;程序编译之前应先安装他们。 #include <sys/ioctl.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <zconf.h> …...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...