Kubernetes Ingress

文章目录

  • 一、为什么需要 Ingress
  • 二、什么是Ingress,Ingress Controller
  • 三、Ingress 的工作原理
  • 四、Ingress 配置资源模版
  • 五、实例
    • 1、搭建 Ingress 环境
      • 1.1、Ingress-Nginx官网地址
      • 1.2、master 节点下载 deploy.yaml
      • 1.3、所有节点提前 pull 必须的镜像
      • 1.4、修改并应用 deploy.yaml 文件
      • 1.5、查看 ingress-nginx
      • 1.6、查看 service
    • 2、准备 service 和 pod
      • 2.1、创建 nginx 和 tomcat 的 Deployment
      • 2.2、创建并查看对应 svc,pod
    • 3、HTTP代理
      • 3.1、创建 ingress-http.yaml
      • 3.2、应用并查看
      • 3.3、本地电脑配置 hosts 解析
      • 3.4、通过域名+端口号查看
    • 4、HTTPS代理
      • 4.1、生成证书
      • 4.2、创建密钥
      • 4.3、创建ingress-https.yaml
      • 4.4、应用并查看
      • 4.5、通过 https://域名+端口号 访问

一、为什么需要 Ingress

我们使用传统的NodePort类型的Service的确能将集群内的服务暴露给集群外部客户端去访问,但是使用这种类型的Service存在以下问题:

  • 一个端口只能使用一个服务,所有通过NodePort暴露的端口都需要提前规划;

  • 如果集群上的Service的数量太多的话,暴露的NodePort端口不具有连续性。后期维护成本太大,且不宜于管理;

  • 无论是Iptables或者是Ipvs模型的Service都配置在Linux内核中的Netfilter之上进行四层调度。是一种比较通用的调度器。支持调度HTTP、Mysql等应用层服务,不过,也正是工作于传输层从而使得它无法做到类似卸载HTTPS中的SSL会话,也不支持基于URL的请求调度机制,因为它工作在传输层。kubernetes也不支持为此类负载均衡配置任何类型的健康状态检测机制。

为了解决这种需求,提供了一种高级的流量管理,也就Ingress和Ingress Controller,kubernetes使用Ingress Controller来接收所有入口的流量,然后通过Ingress资源来定义流量如何区分,以及如何转发的规则。有了Ingress和Ingress控制器。我们就可以直接定义流量转发规则来发布服务,而无需创建许多的NodePort和LoadBalancer类型的Service。

image-20240917180553792

二、什么是Ingress,Ingress Controller

Ingress 是 Kubernetes 中的一个 API 对象,用于定义集群内部服务的外部可访问性。简而言之,Ingress 是用来描述如何将外部请求路由到集群内部的服务的规则集合。Ingress 提供了一种定义 HTTP 路由规则的方式,使得外部客户端可以通过一个统一的入口点访问集群内部的服务。

img

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

在这里有两个核心概念:

  • ingress:kubernetes中的一个对象,作用是定义请求如何转发到service的规则
  • ingress controller:具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发,实现方式有很多,比如Nginx, Contour, Haproxy等等

三、Ingress 的工作原理

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

  1. 用户编写Ingress规则,说明哪个域名对应kubernetes集群中的哪个Service
  2. Ingress控制器动态感知Ingress服务规则的变化,然后生成一段对应的Nginx反向代理配置
  3. Ingress控制器会将生成的Nginx配置写入到一个运行着的Nginx服务中,并动态更新
  4. 到此为止,其实真正在工作的就是一个Nginx了,内部配置了用户定义的请求转发规则

image-20240917184743873

四、Ingress 配置资源模版

apiVersion: networking.k8s.io/v1   # 资源所属的API群组和版本
kind: Ingress   # 资源类型
metadata:   # 元数据name:  <string>   # 资源名称namespace: <string>  # 命名空间
spec:     ingressClassName: "nginx"   # 适用的Ingress控制器类别,须明确指明rules: <[]object>    # Ingress规则列表- host: <string>      # 虚拟主机的FQDN,俗称域名http: <object>paths: <[]object>      # 虚拟主机的PATH定义列表- path: <string>    # 匹配以什么开头类似于nginx中的locationpathType: <string>    # Prefix前缀匹配,不区分大小写 Exact。精确匹配URL,区分大小写backend: <object>     # 后端service: <object>   #关联后端的Servicename: <string>   # 后端Service的名称port: <object>   #后端Service的端口name:      # 端口名称number:   # 端口号

五、实例

1、搭建 Ingress 环境

1.1、Ingress-Nginx官网地址

#Ingress-Nginx 官网地址
https://kubernetes.github.io/ingress-nginx/#Ingress-Nginx GitHub地址
https://github.com/kubernetes/ingress-nginx

1.2、master 节点下载 deploy.yaml

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.4/deploy/static/provider/baremetal/deploy.yaml

image-20240917195944285

1.3、所有节点提前 pull 必须的镜像

docker pull registry.cn-hangzhou.aliyuncs.com/eagleslab/service:ingresswebhook111docker tag c41e9fcadf5a k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1docker pull registry.cn-hangzhou.aliyuncs.com/eagleslab/service:ingresscontroller104docker tag a9f76bcccfb5 k8s.gcr.io/ingress-nginx/controller:v1.0.4

1.4、修改并应用 deploy.yaml 文件

如果是提前pull的镜像,要删除掉deploy.yaml中对镜像sha256的检查,在image标签中,删除 @sha256到行尾

sed -i 's/@sha256:.*//g' deploy.yamlkubectl apply -f deploy.yaml

image-20240917220226247

1.5、查看 ingress-nginx

kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx

image-20240918101812536

1.6、查看 service

kubectl get svc -n ingress-nginx

image-20240918101850149

2、准备 service 和 pod

image-20240917222647664

2.1、创建 nginx 和 tomcat 的 Deployment

apiVersion: v1
kind: Namespace
metadata:name: dev---apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentnamespace: dev
spec:replicas: 3selector:matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80---apiVersion: apps/v1
kind: Deployment
metadata:name: tomcat-deploymentnamespace: dev
spec:replicas: 3selector:matchLabels:app: tomcat-podtemplate:metadata:labels:app: tomcat-podspec:containers:- name: tomcatimage: tomcat:8.5-jre10-slimports:- containerPort: 8080---apiVersion: v1
kind: Service
metadata:name: nginx-servicenamespace: dev
spec:selector:app: nginx-podclusterIP: Nonetype: ClusterIPports:- port: 80targetPort: 80---apiVersion: v1
kind: Service
metadata:name: tomcat-servicenamespace: dev
spec:selector:app: tomcat-podclusterIP: Nonetype: ClusterIPports:- port: 8080targetPort: 8080

2.2、创建并查看对应 svc,pod

kubectl apply -f tomcat-nginx.yamlkubectl get pods,svc -n dev

image-20240918103916622

3、HTTP代理

3.1、创建 ingress-http.yaml

ingressClassName: nginx

使用 nginx 的 IngressClass(关联的 ingress-nginx 控制器)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-nginxnamespace: dev
spec:rules:- host: nginx.bbj1030.cnhttp:paths:- path: /pathType: Prefixbackend: service:name: nginx-serviceport: number: 80ingressClassName: nginx
---apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-tomcatnamespace: dev
spec:rules:- host: tomcat.bbj1030.cnhttp:paths:- path: /pathType: Prefixbackend:service:name: tomcat-serviceport: number: 8080ingressClassName: nginx

3.2、应用并查看

kubectl get ing -n dev

image-20240918120230378

kubectl describe ing -n dev

image-20240918120311196

3.3、本地电脑配置 hosts 解析

将以上 nginx.bbj1030.cn 和 tomcat.bbj1030.cn 解析到 master 节点 192.168.112.10上

192.168.112.10 nginx.bbj1030.cn
192.168.112.10 tomcat.bbj1030.cn

image-20240918120828477

3.4、通过域名+端口号查看

nginx.bbj1030.cn:32596tomcat.bbj1030.cn:32596

image-20240918112152192

image-20240918120508649

image-20240918130957117

4、HTTPS代理

4.1、生成证书

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

4.2、创建密钥

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

image-20240918121104780

4.3、创建ingress-https.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: https-nginxnamespace: dev
spec:tls:- hosts:- nginx.bbj1030.cnsecretName: tls-secret # 指定秘钥rules:- host: nginx.bbj1030.cnhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-serviceport: number: 80ingressClassName: nginx
---apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: tomcat-httpsnamespace: dev
spec:tls:- hosts:- tomcat.bbj1030.cnsecretName: tls-secret # 指定秘钥rules:- host: tomcat.bbj1030.cnhttp:paths:- path: /pathType: Prefixbackend:service:name: tomcat-serviceport: number: 8080ingressClassName: nginx

4.4、应用并查看

需要先删除之前创建的 ingress 不然会报错

image-20240918121547056

kubectl delete -f ingress-http.yamlkubectl apply -f ingress-https.yaml

image-20240918121408401

kubectl get ing -n devkubectl describe ing -n dev

image-20240918121642798

4.5、通过 https://域名+端口号 访问

https://nginx.bbj1030.cn:31563https://tomcat.bbj1030.cn:31563

image-20240918131142580

image-20240918121928061

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

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

相关文章

保护您的企业免受网络犯罪分子侵害的四个技巧

在这个日益数字化的时代&#xff0c;小型企业越来越容易受到网络犯罪的威胁。网络犯罪分子不断调整策略&#xff0c;并使用人工智能来推动攻击。随着技术的进步&#xff0c;您的敏感数据面临的风险也在增加。 风险的不断增大意味着&#xff0c;做好基本工作比以往任何时候都更…

JavaEE:网络编程(套接字)

文章目录 Socket套接字TCP和UDP的区别有连接/无连接可靠传输/不可靠传输面向字节流/面向数据报全双工/半双工 UDP/TCP api的使用UDPDatagramSocketDatagramPacketInetSocketAddress练习 TCPServerSocketSocket练习 Socket套接字 Socket是计算机网络中的一种通信机制&#xff0…

MySQL高阶1777-每家商店的产品价格

题目 找出每种产品在各个商店中的价格。 可以以 任何顺序 输出结果。 准备数据 create database csdn; use csdn;Create table If Not Exists Products (product_id int, store ENUM(store1, store2, store3), price int); Truncate table Products; insert into Products …

运行npm install 时,卡在sill idealTree buildDeps没有反应

一直停留在sill idealTree buildDeps 解决方法 npm config set registry https://registry.npm.taobao.org 配置后用下面命令看是否配置成功 npm config get registry 如果配置还不好使 就执行下行的ssl npm set strict-ssl false 然后执行 npm install 成功执行

【Python报错已解决】 TypeError: Descriptors cannot not be created directly

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

Java--stream流、方法引用

Stream流 - Stream流的好处 - 直接阅读代码的字面意思即可完美展示无关逻辑方式的语义 - Stream流把真正的函数式编程风格引入到Java中 - 代码简洁 - Stream流的三类方法 - 获取Stream流 - 创建一条流水线,并把数据放到流水线上准备进行操作 - 中间方法 - 流水线上的操作 - 一次…

83.static关键字

目录 一.static关键字 1.1 修饰局部变量 1.2 修饰全局变量 1.3 修饰函数 二.视频教程 一.static关键字 static关键字可以修饰局部变量&#xff0c;全局变量和函数。 1.1 修饰局部变量 使用static关键字修饰局部变量&#xff0c;只在第一次进入作用域的时候初始化 。函数…

C++ | Leetcode C++题解之第409题最长回文串

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestPalindrome(string s) {unordered_map<char, int> count;int ans 0;for (char c : s)count[c];for (auto p : count) {int v p.second;ans v / 2 * 2;if (v % 2 1 and ans % 2 0)ans;}retur…

下拉框QComboBox

文本 // 获取和设置当前条目的索引 int currentIndex() const void setCurrentIndex(int index)// 获取和设置当前条目的文本 QString currentText() const void setCurrentText(const QString &text)// 获取和设置指定索引条目的文本 QString itemText(int index) co…

AI+代码审核平台CodeSec获CCIA中国网络安全创新创业大赛总决赛三等奖

近日&#xff0c;由中央网信办指导&#xff0c;中国网络安全产业联盟&#xff08;CCIA&#xff09;主办的2024年中国网络安全创新创业大赛总决赛及颁奖典礼在国家网络安全宣传周落下帷幕。开源网安“AI代码审核平台CodeSec V4.0” 凭借在AI方向的技术创新、技术突破及功能应用创…

TCP.IP四层模型

一、TCP/IP模型协议分层 1、应用层&#xff1a; 2、传输层&#xff1a; TCP&#xff1a;传输控制协议 UDP&#xff1a;用户数据报协议 3、网络层&#xff1a; IP: 国际协议&#xff08;IP地址&#xff09; ICMP&#xff1a; 互联网控制消息协议&#xff08;互联网…

blender软件下载地址,blender哪个版本好用

​blender软件下载 不废话&#xff0c;blender软件下载直接点&#xff1a;https://download.blender.org/release/ blender最新稳定版&#xff1a;Blender 4.2.1 LTS 【渲染101云渲染】&#xff1a;如果您希望使用Blender的最新功能&#xff0c;并且愿意接受可能存在的一些小…

JAVA基础,利用for循环找水仙花个数

public class learn2 {public static void main(String[] args) {int count 0;//定义水仙花的个数for (int i 100; i<999; i){int g i%10;int s i/10%10;int b i/100%10;if (i b*b*b s*s*s g*g*g){count1;System.out.println(i);}}System.out.println("一共有"…

食品检测与分类系统源码分享

食品检测与分类检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

2024.9.18

1.已知网址www.hqyj.com截取出网址的每一个部分 菜单栏中 ----> 虚拟机 -----> 设置 -----> 网络适配器 选择桥接模式 菜单栏中 ----> 编辑 -----> 虚拟网络编辑器 更改设置 将桥接改成自动 如果桥接连不上网 尝试还原默认设置后&#xff0c;在重新连接桥接…

【读点论文】Text Recognition in the Wild: A Survey 非常纯粹的OCR研究,专业细致,脉络清晰

Text Recognition in the Wild: A Survey 文本的历史可以追溯到几千年前。文本所携带的丰富而精确的语义信息在广泛的基于视觉的应用场景中非常重要。因此&#xff0c;自然场景中的文本识别一直是计算机视觉和模式识别中一个活跃的研究领域。近年来&#xff0c;随着深度学习的…

通信工程学习:什么是GPON吉比特无源光网络

GPON&#xff1a;吉比特无源光网络 GPON&#xff08;Gigabit-Capable Passive Optical Network&#xff0c;吉比特无源光网络&#xff09;是一种基于ITU-T G.984.x标准的最新一代宽带无源光综合接入技术。该技术以其高带宽、高效率、大覆盖范围和用户接口丰富等特点&#xff0c…

Longman Dictionary of Contemporary English (朗文当代高级英语辞典)

Longman Dictionary of Contemporary English {朗文当代高级英语辞典} 1. Longman Dictionary of Contemporary English1.1. school References 1. Longman Dictionary of Contemporary English https://www.ldoceonline.com/ 1.1. school https://www.ldoceonline.com/dicti…

Python | Leetcode Python题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; class Solution:def sumOfLeftLeaves(self, root: TreeNode) -> int:if not root:return 0isLeafNode lambda node: not node.left and not node.rightq collections.deque([root])ans 0while q:node q.popleft()if node.left:if is…

基于python+django+vue的外卖管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的外…