Ingress

文章目录

    • 环境准备
    • 什么是 Ingress
    • 认识 Ingress 资源
    • Ingress 控制器(controller)
    • Ingress 规则
    • pathType 路径类型
    • 多重匹配
    • Ingress 类
    • TLS
      • 生成证书
      • 创建密钥

环境准备

下面的 yaml 文件内容,是使用 sts 创建两个 web 服务,并配置对应的 servcie。web 服务的首页内容使用 configmap 配置并挂载到各自的 POD 中。

apiVersion: v1
kind: Namespace
metadata:name: shark-test
---
apiVersion: v1
kind: ConfigMap
metadata:namespace: shark-testname: index.html
data:# 类属性键;每一个键都映射到一个简单的值web1.index.html: |web1 站点web2.index.html: |web2 站点
---
apiVersion: apps/v1
kind: StatefulSet
metadata:namespace: shark-testname: web1
spec:selector:matchLabels:app: web1 # 必须匹配 .spec.template.metadata.labelsserviceName: "web1"replicas: 1minReadySeconds: 10 # 默认值是 0template:metadata:labels:app: web1 # 必须匹配 .spec.selector.matchLabelsspec:terminationGracePeriodSeconds: 10containers:- name: web1image: nginx:1.21.6-alpineports:- containerPort: 80name: web1volumeMounts:- name: index-htmlmountPath: /usr/share/nginx/htmlvolumes:- name: index-html          # 给 volumeMounts[].name使用configMap:name: index.html   # configmap 的名称items:- key: web1.index.html  # configmap 对象中 data 中的一个 keypath: index.html      # 挂载到 pod 后,被创建的文件名称
---
apiVersion: apps/v1
kind: StatefulSet
metadata:namespace: shark-testname: web2
spec:selector:matchLabels:app: web2 # 必须匹配 .spec.template.metadata.labelsserviceName: "web2"replicas: 1minReadySeconds: 10 # 默认值是 0template:metadata:labels:app: web2 # 必须匹配 .spec.selector.matchLabelsspec:terminationGracePeriodSeconds: 10containers:- name: web2image: nginx:1.21.6-alpineports:- containerPort: 80name: web2volumeMounts:- name: index-htmlmountPath: /usr/share/nginx/htmlvolumes:- name: index-html          # 给 volumeMounts[].name使用configMap:name: index.html   # configmap 的名称items:- key: web2.index.html  # configmap 对象中 data 中的一个 keypath: index.html      # 挂载到 pod 后,被创建的文件名称
---
apiVersion: v1
kind: Service
metadata:namespace: shark-testname: web1labels:app: web1
spec:type: ClusterIPports:- port: 8080name: web1-httptargetPort: 80clusterIP: Noneselector:app: web1
---
apiVersion: v1
kind: Service
metadata:namespace: shark-testname: web2labels:app: web2
spec:type: ClusterIPports:- port: 8080name: web2-httptargetPort: 80clusterIP: Noneselector:app: web2

什么是 Ingress

Ingress 是管理集群外部访问集群内部服务的流量的 API 对象,是 kubernetes 中对 service 的反向代理。 流量的去向由 Ingress 资源所定义的规则来控制。
可提供负载均衡、SSL 和基于名称的虚拟主机功能。

主要的访问方式是 HTTP/HTTPS,不支持四层协议。下一代替代 Ingress 的产品 Gateway API 可以实现 四层和七层协议流量管理。

Ingress 在 kubernentes v1.28 版本停止更新,并推出了可以实现更多功能的 Gateway API。

集群
负载均衡器
Ingress 的路由规则
Ingress
Pod
Service
Pod
客户端

认识 Ingress 资源

Ingress 资源的 YAML 文件,可以理解为是对 Nginx 子配置文件的抽象,因为它和 nginx 中关于虚拟机主机 server 配置块的功能一致 。

下面是 Nginx 子配置文件和Ingress 的 yaml 文件的对比图。
在这里插入图片描述

  1. 红色框就是请求中的 url
  2. 黄色框就是 nginx 的 rewrite ,用于实现地址(url)重写,这里实现的功能是去掉请求 url 中的前缀。
  3. 绿色框就是 后端服务的连接信息,nginx 中是 upstream 的名称,kubernetes 中是 service 名称
  4. 紫色框就是后端服务的监听端口。

资源名称: Ingress 对象的命名必须是合法的 DNS 子域名名称。

  • 不能超过 253 个字符
  • 只能包含小写字母、数字,以及 ‘-’ 和 ‘.’
  • 必须以字母数字开头
  • 必须以字母数字结尾
    注解(annotations): Ingress 经常使用一些注解来配置一些选项,以便扩展功能,例如 rewrite-target 注解。 不同的 Ingress 控制器支持不同的注解。

规则(rule): 其中包含对所有入站请求进行匹配的规则列表。

Ingress 控制器(controller)

为了让 Ingress 对象有效的创建和工作,需要有一个 Ingress Controller 。
Ingress Controller 的角色是用一个反向代理实现的。反向代理可以是 nginx、haproxy 等其中的一个,因此 Ingress Controller 可以有很多种。

这里我用最常用的 Ingress-Nginx Controller 为例说明。

当一个 Ingress 对象被成功创建后,Ingress Controller 会把 Ingress 对象中的内容转换成 nginx 的子配置文件,并让 Ingress Controller 使用。

后续会详细介绍。

Ingress 规则

一个简单的 Ingress 资源示例。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: minimal-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:ingressClassName: nginx-examplerules:- http:paths:- path: "/web1"pathType: Prefixbackend:service:name: web1port:number: 8080

每个 HTTP 规则都包含以下信息:

  • 可选的 host。在此示例中,未指定 host,因此该规则适用于使用指定 IP 地址进行入站 HTTP 请求的情况。 如果提供了 host(例如 foo.shark.com),则 rules 适用于所指定的主机( foo.shark.com)。
  • path 路径列表(例如 /web1)。每个路径都有一个由 service.nameservice.port.nameservice.port.number 确定的关联后端。入站请求的内容都必须与 hostpath 的值相匹配,负载均衡器才会将流量引导到所引用的 Service,
  • backend(后端)是 Service 中所定义的 名称和端口的组合, 或者是通过 CRD 方式来实现的自定义资源后端。

通常会在 Ingress 控制器中配置 defaultBackend(默认后端), 以便为无法与规约中任何路径匹配的所有请求提供服务,也就是通常会返回 404 页面。

pathType 路径类型

Ingress 中的每个路径都需要有对应的路径类型(Path Type)。未明确设置 pathType 的路径无法通过合法性检查。当前支持的路径类型有三种:

  1. ImplementationSpecific:对于这种路径类型,匹配方法取决于 IngressClass。 具体实现可以将其作为单独的 pathType 处理或者作与 Prefix 或 Exact 类型相同的处理。

  2. Exact:精确匹配 URL 路径,且区分大小写。

  3. Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写, 并且对路径中各个元素逐个执行匹配操作。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。

说明: 如果 path 值的最后一个元素是请求路径中最后一个元素的子字符串,则不会被视为匹配 (例如:/foo/bar 匹配 /foo/bar/baz, 但不匹配 /foo/barbaz)。

多重匹配

有的时候,一个请求会和一个 Ingress 中的多个 path 匹配,这时 path 最长者优先匹配。 如果仍然有两条同等的匹配路径,则精确路径类型优先于前缀路径类型。

Ingress 类

Ingress 可以由不同的控制器实现,通常使用不同的配置。 每个 Ingress 应当指定一个类,也就是一个对 IngressClass 资源的引用。 IngressClass 资源包含额外的配置,其中包括应当实现该类的控制器名称。

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:labels:app.kubernetes.io/component: controllername: nginx-example
spec:controller: k8s.io/ingress-nginx

设置默认的 Ingress 类,只需要在注解中添加:
ingressclass.kubernetes.io/is-default-class: "true"

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:labels:app.kubernetes.io/component: controllername: nginx-exampleannotations:ingressclass.kubernetes.io/is-default-class: "true"
spec:controller: k8s.io/ingress-nginx

TLS

生成证书

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=itheima.com”

创建密钥

可以通过设定包含 TLS 私钥和证书的Secret 来保护 Ingress。TLS Secret 的数据中必须包含键名为 tls.crt 的证书和键名为 tls.key 的私钥, 才能用于 TLS 目的。例如:

apiVersion: v1
kind: Secret
metadata:name: testsecret-tlsnamespace: default
data:tls.crt: base64 编码的证书tls.key: base64 编码的私钥
type: kubernetes.io/tls

也可以使用下面的方法创建

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

注意,不能针对默认规则使用 TLS,因为这样做需要为所有可能的子域名签发证书。 因此,tls 字段中的 hosts 的取值需要与 rules 字段中的 host 完全匹配。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: tls-example-ingress
spec:tls:- hosts:- https-example.foo.comsecretName: testsecret-tlsrules:- host: https-example.foo.comhttp:paths:- path: /pathType: Prefixbackend:service:name: service1port:number: 80

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

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

相关文章

微信小程序(三十三)promise异步写法

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.promise异步与普通异步的写法区别 2.promise异步的优势 源码&#xff1a; index.wxml <view class"preview" bind:tap"onChoose"><image src"{{avatar}}" mode"…

网络时间协议NTP工作模式

单播服务器/客户端模式 单播服务器/客户端模式运行在同步子网中层数较高层上。这种模式下,需要预先知道服务器的IP地址。 客户端:运行在客户端模式的主机(简称客户端)定期向服务器端发送报文,报文中的Mode字段设置为3(客户端模式)。当客户端接收到应答报文时,客户端会…

Chapter One - The History of Computers

Chapter One - The History of Computers 第一章 - 计算机的历史 I. Reading Material I. 阅读材料 My friends, let’s embark on an enlightening journey through the captivating history of computers, unraveling the intricate threads that have woven the technolog…

DockerCompose+SpringBoot+Nginx+Mysql实践

DockerComposeSpringBootNginxMysql实践 1、Spring Boot案例 首先我们先准备一个 Spring Boot 使用 Mysql 的小场景&#xff0c;我们做这样一个示例&#xff0c;使用 Spring Boot 做一个 Web 应 用&#xff0c;提供一个按照 IP 地址统计访问次数的方法&#xff0c;每次请求时…

linux交叉编译方法——虚拟机编译,在树莓派平台上运行

一、 交叉编译是什么 交叉编译 是在一个平台上生成另一个平台上的可执行代码。 我们再windows上面编写C51代码&#xff0c;并编译成可执行代码&#xff0c;如xx.hex, 是在c51上面运行&#xff0c;不是在windows上面运行 我们在ubuntu上面编写树…

Kubernetes k8s

Kubernetes k8s 一个开源的容器编排引擎&#xff0c;用来对容器化应用进行自动化部署、 扩缩和管理。 从架构设计层面&#xff0c;k8s能很好的解决可用性&#xff0c;伸缩性&#xff1b;从部署运维层面&#xff0c;服务部署&#xff0c;服务监控&#xff0c;应用扩容和故障处…

springboot并mybatis入门启动

pom.xml,需要留意jdk的版本&#xff08;11&#xff09;和springboot版本要匹配&#xff08;2.7.4&#xff09;&#xff0c;然后还要注意mybatis启动l类的版本&#xff08;2.2.2&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xm…

MAX31865读取PT100/PT1000电阻值

1、芯片介绍 MAX31865是简单易用的热敏电阻至数字输出转换器,优化用于铂电阻温度检测器(RTD)。外部电阻设置RTD灵敏度,高精度Δ- Σ ADC将RTD电阻与基准电阻之比转换为数字输出。MAX31865输入具有高达45V的过压保护,提供可配置的RTD及电缆开路、短路条件检测。 2、芯片特点…

解决Docker打包Eureka注册中心,其他服务无法注册问题

​前言 本文主要是介绍利用docker打包Eureka注册中心&#xff0c;并且发布镜像到服务器&#xff0c;遇到的一个比较坑的问题。主要是服务镜像部署完毕之后&#xff0c;docker容器都能启动&#xff0c;并且也能访问&#xff0c;但是其他服务就是无法注册到注册中心。排除问题&a…

查看阿里云maven仓中某个库有哪些版本

起因 最近项目上有做视频业务&#xff0c;方案是使用阿里云的短视频服务&#xff0c;其中也有使用到阿里云的上传SDK&#xff0c;过程中有遇一个上传SDK的内部崩溃&#xff0c;崩溃栈如下&#xff1a; Back traces starts. java.lang.NullPointerException: Attempt to invok…

只用一台服务器部署上线(宝塔面板) 前后端+数据库

所需材料 工具&#xff1a;安装宝塔面板服务器至少一台、域名一个 前端&#xff1a;生成dist文件&#xff08;前端运行build命令&#xff09; 后端&#xff1a;生成jar包&#xff08;maven运行package命令&#xff09; 准备&#xff1a; 打开宝塔面板&#xff0c;点击进入软…

2、安全开发-Python-Socket编程端口探针域名爆破反弹Shell编码免杀

用途&#xff1a;个人学习笔记&#xff0c;欢迎指正&#xff01; 目录 主要内容&#xff1a; 一、端口扫描(未开防火墙情况) 1、Python关键代码: 2、完整代码&#xff1a;多线程配合Queue进行全端口扫描 二、子域名扫描 三、客户端&#xff0c;服务端Socket编程通信cmd命…

Nginx简单阐述及安装配置

目录 一.什么是Nginx 二.Nginx优缺点 1.优点 2.缺点 三.正向代理与反向代理 1.正向代理 2.反向代理 四.安装配置 1.添加Nginx官方yum源 2.使用yum安装Nginx 3.配置防火墙 4.启动后效果 一.什么是Nginx Nginx&#xff08;“engine x”&#xff09;是一个高性能的HTTP…

Linux Zip解压缩命令

Zip 用法 $ zip [-选项] [-b 路径] [-t 日期] [-n 后缀名] [压缩文件列表] [-xi 列表] 默认操作是添加或替换压缩文件列表中的压缩文件条目&#xff0c;压缩文件列表可以包括特殊名称 -&#xff0c;压缩标准输入数据 Zip 是一个创建和管理 zip 文件的压缩工具 Unzip 是一个用…

算法day10

算法day10 20 有效的括号1047 删除字符串中的所有相邻重复性150 逆波兰表达式求值 20 有效的括号 拿到这个题的想法&#xff0c;首先我在想我能不能用数组的操作来扫描做。后来想想&#xff0c;如果这样做那特判也太多了&#xff0c;不好做。然后第二个想法就是用栈来做&…

机器学习-基础分类算法-KNN详解

KNN-k近邻算法 k-Nearest Neighbors 思想极度简单应用数学只是少效果好可以解释机器学习算法使用过程中的很多细节问题更完整的刻画机器学习应用的流程 创建简单测试用例 import numpy as np import matplotlib.pyplot as plt raw_data_X [[3.393533211, 2.331273381],[3.1…

ubuntu20.04安装sumo

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 有问题&#xff0c;请大家指出&#xff0c;争取使方法更完善。这只是ubuntu安装sumo的一种方法。一、注意事项1、首先明确你的ubuntu的用户名是什么 二、sumo安装1.…

基于springboot篮球论坛系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项…

国家博物馆逆向抢票协议

逆向工程的具体步骤可以因项目和目标系统的不同而有所变化。然而&#xff0c;以下是一般逆向工程的一般步骤&#xff1a; 1. 分析目标系统&#xff1a;对待逆向的系统进行调研和了解&#xff0c;包括其架构、功能、使用的技术等方面的信息。 2. 反汇编或反编译&#xff1a;使…

保姆级CDN使用教程,解决可能出现的各种问题

如果你还没有注册雨云&#xff08;rainyun&#xff09;&#xff0c;可以通过该链接进行注册雨云 - 新一代云服务提供商 通过该链接注册是可以白嫖到优惠券的&#xff0c;可以白嫖CDN。 比直接注册划算。 雨云的cdn在国内表现是非常不错的&#xff0c;而且不需要域名进行备案 在…