Kubernetes Ingress

news/2024/9/20 5:37:06

目录
  • 一、为什么需要 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.ryyt.cn/news/61924.html

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

相关文章

JVM--解析运行期优化与JIT编译器

JVM开发团队一直在努力,缩小Java与C/C++语言在运行效率上的差距。 本篇博客,我们来谈一谈JVM(HotSpot)为了提高Java程序的运行效率,都实现了哪些激动人心的技术~ 1 JIT编译器的引入 首先我们这篇文章中所说的编译器都是指JVM的组成部分之一---即时编译器(JIT),与生成J…

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式) @目录十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)1. Spring Boot 配置 MyBatis 的详细步骤2. 最后:MyBatis 的官方文档:https://mybatis.p2hp.com/ 关于 MyBatis 的学习的详细内容,大家可以移步至:✏️✏️…

学习高校课程-软件工程-软件流程(ch3)

3.1 A GENERIC PROCESS MODEL 通用过程模型 线性流和迭代流演化流和并行流3.2 DEFINING A FRAMEWORK ACTIVITY 定义框架活动 What actions are appropriate for a framework activity, given the nature of the problem to be solved, the characteristics of the people doing…

Rainbow Bracket Sequence

The 2024 ICPC Asia East Continent Online Contest (I) 题意 构造长度为 \(2n\) 的合法括号序列。 对于每个左括号在的位置 \(i\), 都有颜色 \(c_i\) 和价值 \(v_i\)。 左括号颜色视为所在位置颜色, 价值同理。 对于每个颜色,满足左括号为该颜色的个数 \(\geq l_i\)。 求满足…

字符编码发展史2 — ISO-8859-N

2.2. 第二个阶段 本地化2.2.1. ANSI 2.2.2. ISO/IEC 8859-N2.2.2.1. 什么是ISO/IEC 8859-N? 2.2.2.2. ISO 8859-1的编码表上一篇《字符编码发展史1 — ASCII和EASCII》我们讲解了字符编码的起源ASCII和EASCII。本篇我们将继续讲解字符编码的第二个发展阶段中的ISO 8859-N。 2.…

?

CF1194G 在外层枚举\(x\)和\(y\),令\(x=x\times t,y=y\times t\),且\(x\times t\)十进制包含\(x\),\(y\)同理。 因为有进位,从低位向高位dp。 设\(f[T][0/1][0/1][i][j][0/1][0/1]\)表示处理到第T位,在当前这些为中\(x\times t\)是否大于\(n\),\(y\times t\)是否大于\(n\),…

在idea中使用mysql失败

在idea中测试mysql显示失败idea方面视图 - 工具窗口 - 数据库 或者右边有图标直接点开新建 - 数据源 - mysql名称 - 用户(root) - 密码 - 测试连接如果测试连接有切换相关提示直接点击, 如果出绿色对勾就成功了 到这里本可以结束了, 但是我最开始做的时候这个流程没有成功 以防…