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-test
  name: index.html
data:
  # 类属性键;每一个键都映射到一个简单的值
  web1.index.html: |
    web1 站点

  web2.index.html: |
    web2 站点
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: shark-test
  name: web1
spec:
  selector:
    matchLabels:
      app: web1 # 必须匹配 .spec.template.metadata.labels
  serviceName: "web1"
  replicas: 1
  minReadySeconds: 10 # 默认值是 0
  template:
    metadata:
      labels:
        app: web1 # 必须匹配 .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: web1
        image: nginx:1.21.6-alpine
        ports:
        - containerPort: 80
          name: web1
        volumeMounts:
        - name: index-html
          mountPath: /usr/share/nginx/html
      volumes:
      - name: index-html          # 给 volumeMounts[].name使用
        configMap:
          name: index.html   # configmap 的名称
          items:
          - key: web1.index.html  # configmap 对象中 data 中的一个 key
            path: index.html      # 挂载到 pod 后,被创建的文件名称
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: shark-test
  name: web2
spec:
  selector:
    matchLabels:
      app: web2 # 必须匹配 .spec.template.metadata.labels
  serviceName: "web2"
  replicas: 1
  minReadySeconds: 10 # 默认值是 0
  template:
    metadata:
      labels:
        app: web2 # 必须匹配 .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: web2
        image: nginx:1.21.6-alpine
        ports:
        - containerPort: 80
          name: web2
        volumeMounts:
        - name: index-html
          mountPath: /usr/share/nginx/html
      volumes:
      - name: index-html          # 给 volumeMounts[].name使用
        configMap:
          name: index.html   # configmap 的名称
          items:
          - key: web2.index.html  # configmap 对象中 data 中的一个 key
            path: index.html      # 挂载到 pod 后,被创建的文件名称
---
apiVersion: v1
kind: Service
metadata:
  namespace: shark-test
  name: web1
  labels:
    app: web1
spec:
  type: ClusterIP
  ports:
  - port: 8080
    name: web1-http
    targetPort: 80
  clusterIP: None
  selector:
    app: web1
---
apiVersion: v1
kind: Service
metadata:
  namespace: shark-test
  name: web2
  labels:
    app: web2
spec:
  type: ClusterIP
  ports:
  - port: 8080
    name: web2-http
    targetPort: 80
  clusterIP: None
  selector:
    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-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - http:
      paths:
      - path: "/web1"
        pathType: Prefix
        backend:
          service:
            name: web1
            port:
              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: controller
  name: 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: controller
  name: nginx-example
  annotations:
    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-tls
  namespace: 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.com
    secretName: testsecret-tls
  rules:
  - host: https-example.foo.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaScript】前端攻击

前端攻击 1. CSRF的基本概念、缩写、全称 CSRF(Cross-site request forgery):跨站请求伪造。 从上图可以看出,要完成一次CSRF攻击,受害者必须满足两个必要的条件: 登录受信任网站A,并在本地生…

【疑问】为什么声明和定义要分离

前言 我们在学习的时候接触过一个话:编写自定义函数的时候 要做到声明和定义分离 那么为什么呢 今天就来简单的了解一下 疑问:错误的发生 下面给出两个源文件和一个头文件以及报错信息 text.cc文件 #include"head.h"int main() {int a 1…

深入理解指针(3)

⽬录 1. 字符指针变量 2. 数组指针变量 3. ⼆维数组传参的本质 4. 函数指针变量 5. 函数指针数组 6. 转移表 1. 字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* ; ⼀般使⽤: int main() {char ch w;char *pc &ch;*pc w;return 0; } 还有…

C++类和对象入门(二)

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、类的作用域 类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要…

云服务器安全组、防火墙、端口问题,结合telnet解决项目部署无法访问

无论是运维还是后台亲自操刀在云服务器上部署项目,往往会遇到项目部署上去了,也确定项目正常运行,但还是没法访问的问题。 如果没有经验的小伙伴,很容易陷入疑惑的状态,无从下手解决。 其实这涉及到云平台安全组、服…

idea创建sping项目

一、环境 window10 IDEA 2022.2.3 maven-3.8.6 二、创建sping项目 1、新建Maven项目 File -> New -> Project 然后如下图选中Maven Archetype,在Archetype,选中maven-archetype-webapp,点击Create 2、配置maven 默认是使用IDEA内置…

《Pandas 简易速速上手小册》第9章:Pandas 数据可视化(2024 最新版)

文章目录 9.1 Pandas 内置可视化工具9.1.1 基础知识9.1.2 重点案例:销售数据分析9.1.3 拓展案例一:产品评价统计9.1.4 拓展案例二:员工满意度分布 9.2 与 Matplotlib 和 Seaborn 集成9.2.1 基础知识9.2.2 重点案例:销售趋势分析9.…

性能测试常用术语

之前在性能测试过程中,对于某些其中的术语一知半解,导致踩了很多坑。这篇博客,就常见的一些性能测试术语进行一次浅析。。。 负载 对被测系统不断施加压力,直到性能指标超过预期或某项资源使用达到饱和,以验证系统的处…

Linux Zip解压缩命令

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

关于java的异常处理

关于java的异常处理 我们在上一篇文章中,对java中的异常有了一个初步的了解,本篇文章我们来了解一下异常的处理机制,如何抛出异常,如何捕捉异常😀 关于java的异常 一、异常类型等级 二、关键字 trycatchfinallythr…

Opencv——图片卷积

图像滤波是尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 线性滤波是图像处理最基本的方法,它允许我们对图像进行处理,产生很多不同的效果。首先,我们需要一个二…

wifi配网(esp8266和esp32)-http get和post方式

wifi配网(esp8266和esp32)-http get和post方式 通过http get和post方式来给esp芯片配网 步骤: 开机,指示灯亮起后(需要灯闪烁3下后),需在3s内(超过3s则会正常启动),按一下按键(注:切…

算法41:掉落的方块(力扣699题)----线段树

题目:https://leetcode.cn/problems/falling-squares/description/ 在二维平面上的 x 轴上,放置着一些方块。 给你一个二维整数数组 positions ,其中 positions[i] [lefti, sideLengthi] 表示:第 i 个方块边长为 sideLengthi &…

【蓝桥杯冲冲冲】[NOIP2001 普及组] 装箱问题

蓝桥杯备赛 | 洛谷做题打卡day26 文章目录 蓝桥杯备赛 | 洛谷做题打卡day26题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 题解代码我的一些话 [NOIP2001 普及组] 装箱问题 题目描述 有一个箱子容量为 V V V,同时有 n n n 个物品,每…

jvm基础篇之垃圾回收[2](垃圾回收算法)

文章目录 版权声明垃圾回收算法核心思想垃圾回收算法的历史垃圾回收算法的评价标准垃圾分类算法分类标记清除算法核心思想标记清除算法优缺点 复制算法核心思想完整案例复制算法的优缺点 标记整理算法核心思想标记整理算法优缺点 分代垃圾回收算法arthas查看分代内存情况核心思…

【android】对于google-webrtc的性能中, memory leak

目录 zlmediakit->webrtcplay->app webrtcutil1/3 测试程序等 zlmediakit->webrtcplay->app 编译sdk 32 有时候会从开始新增5M,就稳定在一个值了 webrtcutil1/3 测试程序等 编译sdk 30

关于可变类型和不可变类型的探究

个人猜想(很遗憾失败了) 在硬盘或者系统中存在一个字符集 如果存在硬盘中,那么硬盘出厂的时候他的字符集所占用的空间就已经确定了。 如果存在于系统的话,硬盘应该在出厂的时候为系统设置一个存储系统字符集的地方。在安装系统…

【Chrono Engine学习总结】2-可视化

由于Chrono的官方教程在一些细节方面解释的并不清楚,自己做了一些尝试,做学习总结。 0、基本概念 类型说明: Chrono的可视化包括两块:实时可视化,以及离线/后处理可视化。 其中,实时可视化,又…

蓝桥杯省赛无忧 背包问题 课件 课件61 多重背包

01 多重背包基础模型 02 小明的背包3 03 二进制优化模型 04 新一的宝藏搜寻加强版