kubernetes微服务之ingress-nginx

目录

1 ingress-nginx 介绍

2 Ingress-nginx 的工作原理

3 使用 Ingress-nginx 的步骤

4 部署 ingress :

4.1 开启ipvs 模式

4.2 下载部署文件 

4.3 上传镜像到harbor

4.4 修改文件中镜像地址,与harbor仓库路径保持一致  

 4.5 检查是否running

4.6 将ingress的命名空间微服务类型改为LoadBalancer 

4.7 查询分配的IP

5 ingress-nginx功能使用案例

5.1 创建基础的ingress架构:基于路径访问

5.1.1 创建deployment控制器验证MmetalLB是否可用

5.1.2 创建ingress资源类型和服务

 5.1.3 创建 ingress 资源类型作为与内部service的一个链接

5.2 基于域名的访问

5.3 建立tls加密

5.4 建立auth认证

5.5 rewrite重定向


1 ingress-nginx 介绍

Ingress-nginx 是一个广泛使用的 Kubernetes Ingress 控制器,它基于 Nginx 反向代理和负载均衡器来处理进入 Kubernetes 集群的 HTTP 和 HTTPS 流量。Ingress-nginx 提供了一个强大的工具来管理 Kubernetes 集群的入口流量,允许用户通过 Ingress 资源来定义如何将外部请求路由到集群内部的服务。

官网:

Installation Guide - Ingress-Nginx Controller (kubernetes.github.io)icon-default.png?t=O83Ahttps://kubernetes.github.io/ingress-nginx/deploy/

2 Ingress-nginx 的工作原理

Ingress 资源

  • 用户在 Kubernetes 集群中创建 Ingress 资源,定义了如何将外部流量路由到集群内的服务。
  • Ingress 资源可以包含多个规则,每个规则可以指定一个或多个路径,以及这些路径应路由到的后端服务。

Ingress 控制器

  • Ingress-nginx 控制器是一个部署在 Kubernetes 集群中的 Pod,它监视 Ingress 资源的变化。
  • 当 Ingress 资源发生变化时,Ingress-nginx 控制器会更新 Nginx 的配置文件,以反映新的路由规则。

Nginx 配置

  • Ingress-nginx 控制器使用 Nginx 的模板和配置文件来生成 Nginx 的配置。
  • 这些配置文件定义了如何将外部请求路由到集群内的服务,包括负载均衡、SSL 终止、重写规则等。

Nginx 服务

  • Nginx 服务是一个运行在 Kubernetes 集群中的 Pod,它使用 Ingress-nginx 控制器生成的配置文件来处理外部流量。
  • Nginx 服务通常使用 NodePort 或 LoadBalancer 类型的 Service 来暴露到外部网络。

3 使用 Ingress-nginx 的步骤

部署 Ingress-nginx 控制器

  • 使用 Helm Chart 或者 Kubernetes 部署文件在集群中部署 Ingress-nginx 控制器。

创建 Ingress 资源

  • 根据需要创建 Ingress 资源,定义如何将外部流量路由到集群内的服务。

配置 Nginx 服务

  • 配置 Nginx 服务的 Service,使其能够暴露到外部网络。

测试 Ingress

  • 使用外部工具(如 curl)测试 Ingress 资源,确保流量能够正确路由到集群内的服务。

搭建云平台功能metalLB:

  • MetalLB 是一个专注于解决 Kubernetes 集群内部负载均衡问题的工具,特别是在没有云提供商负载均衡器支持的环境下。它提供了类似云提供商负载均衡器的功能。

4 部署 ingress :

ps :

由于是裸金属状态部署ingress,是需要云平台的,而在虚拟机上并没有提供与平台负载均衡器。

所以需要使用MetalLB 使得k8s集群支持云平台功能。本章就不做介绍了,需要搭建的可以去上一章节查看

4.1 开启ipvs 模式

设置ipvs模式
[root@k8s-master yaml]# kubectl -n kube-system get configmaps 
NAME                                                   DATA   AGE
coredns                                                1      4d22h
extension-apiserver-authentication                     6      4d22h
kube-apiserver-legacy-service-account-token-tracking   1      4d22h
kube-proxy                                             2      4d22h
kube-root-ca.crt                                       1      4d22h
kubeadm-config                                         1      4d22h
kubelet-config                                         1      4d22h[root@k8s-master yaml]# kubectl -n kube-system edit configmaps kube-proxy 
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:strictARP: true[root@k8s-master ~]# kubectl -n kube-system get  pods   | awk '/kube-proxy/{system("kubectl -n kube-system delete pods "$1)}'

4.2 下载部署文件 

[root@k8s-master ~]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/baremetal/deploy.yaml

4.3 上传镜像到harbor

# 本地镜像导入 并打标签
[root@k8s-master ingress]# docker tag \
a80c8fd6e522 reg.shuyan.com/ingress-nginx/controller:v1.11.2[root@k8s-master ingress]# docker tag  \
ce263a8653f9 reg.shuyan.com/ingress-nginx/kube-webhook-certgen:v1.4.3[root@k8s-master ingress]# docker push reg.shuyan.com/ingress-nginx/controller:v1.11.2
[root@k8s-master ingress]# docker push reg.shuyan.com/ingress-nginx/kube-webhook-certgen:v1.4.3[root@k8s-master ingress]# docker rmi \
a80c8fd6e522 \
ce263a8653f9 \
reg.shuyan.com/ingress-nginx/controller:v1.11.2 \
reg.shuyan.com/ingress-nginx/kube-webhook-certgen:v1.4.3

4.4 修改文件中镜像地址,与harbor仓库路径保持一致  

[root@k8s-master ~]# vim deploy.yaml
445         image: ingress-nginx/controller:v1.11.2
546         image: ingress-nginx/kube-webhook-certgen:v1.4.3
599         image: ingress-nginx/kube-webhook-certgen:v1.4.3
[root@k8s-master ingress]# kubectl apply -f deploy.yaml

 4.5 检查是否running

[root@k8s-master ingress]# kubectl -n ingress-nginx get pods 
NAME                                       READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-nfjbh       0/1     Completed   0          10h
ingress-nginx-admission-patch-wp7zd        0/1     Completed   1          10h
ingress-nginx-controller-bb7d8f97c-r6z69   1/1     Running     0          10h

4.6 将ingress的命名空间微服务类型改为LoadBalancer 

[root@k8s-master ingress]#  kubectl -n ingress-nginx \
edit service ingress-nginx-controller51   type: LoadBalancer

4.7 查询分配的IP

[root@k8s-master ingress]# kubectl -n ingress-nginx get svc
NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP       PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.97.25.16    192.168.239.201   80:30467/TCP,443:31166/TCP   10h
ingress-nginx-controller-admission   ClusterIP      10.99.91.236   <none>            443/TCP                      10h

# 创建 Ingress 的命令:
kubectl create ingress NAME --rule=host/path=service:port[,tls[=secretname]] [options]# 常用选项
host/path # 服务对应的 FQDN 和 URL
--annotation=[] # 注解信息,格式为 "annotation=value"
--rule=[] # 代理规则,格式为 "host/path=service:port[,tls=secretname]"
--class='' # 此 Ingress 适配的 Ingress Class# 基于 URI 方式代理不同应用的请求时,后端应用的 URI 若与代理时使用的 URI 不同,则需要启用 URL Rewrite 完成 URI 的重写
# Ingress-Nginx 支持使用 "annotation nginx.ingress.kubernetes.io/rewrite-target" 注解进行

5 ingress-nginx功能使用案例

5.1 创建基础的ingress架构:基于路径访问

5.1.1 创建deployment控制器验证MmetalLB是否可用

创建两个deployment资源类型命名为myapp-v1 与 v2

[root@k8s-master ingress]# kubectl create deployment myapp-v1 \
--image myapp:v1 --dry-run=client -o yaml > myapp-v1.yml[root@k8s-master ingress]# kubectl create deployment myapp-v2 \
--image myapp:v2 --dry-run=client -o yaml > myapp-v2.yml

[root@k8s-master ingress]# vim myapp-v1.ymlapiVersion: apps/v1
kind: Deployment
metadata:labels:app: myapp-v1name: myapp-v1
spec:replicas: 1selector:matchLabels:app: myapp-v1template:metadata:labels:app: myapp-v1spec:containers:- image: myapp:v1name: myapp[root@k8s-master ingress]# vim myapp-v2.yml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: myapp-v2name: myapp-v2
spec:replicas: 1selector:matchLabels:app: myapp-v2template:metadata:labels:app: myapp-v2spec:containers:- image: myapp:v2name: myapp# 声明资源类型
[root@k8s-master ingress]# kubectl apply -f myapp-v1.yml
[root@k8s-master ingress]# kubectl apply -f myapp-v1.yml# 查看是否创建成功[root@k8s-master ingress]# kubectl get deployments.apps 
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
myapp-v1   1/1     1            1           85m
myapp-v2   1/1     1            1           85m# 查看集群IP
[root@k8s-master ingress]# kubectl get pods -o wide 
NAME                        READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
myapp-v1-7479d6c54d-x2zvr   1/1     Running   0          86m   10.244.2.51   k8s-node2   <none>           <none>
myapp-v2-7cd6d597d-gmgt6    1/1     Running   0          86m   10.244.1.43   k8s-node1   <none>           <none># 测试集群内是否可访问
[root@k8s-master ingress]# curl 10.244.2.51
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@k8s-master ingress]# curl 10.244.1.43
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

5.1.2 创建ingress资源类型和服务

使用ingress进行七层与外界通讯

由于ingress 类型是由外界传到ingress再由ingress传给内部的service 所以需要暴露端口需要创建service 进行连通

myapp-v1添加微服务

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: myapp-v1name: myapp-v1
spec:replicas: 1selector:matchLabels:app: myapp-v1template:metadata:labels:app: myapp-v1spec:containers:- image: myapp:v1name: myapp
--- 
apiVersion: v1
kind: Service
metadata:labels:app: myapp-v1name: myapp-v1
spec:ports:- port: 80protocol: TCPtargetPort: 80selector:app: myapp-v1

myapp-v2添加微服务 

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: myapp-v2name: myapp-v2
spec:replicas: 1selector:matchLabels:app: myapp-v2template:metadata:labels:app: myapp-v2spec:containers:- image: myapp:v2name: myapp
---
apiVersion: v1
kind: Service
metadata:labels:app: myapp-v2name: myapp-v2
spec:ports:- port: 80protocol: TCPtargetPort: 80selector:app: myapp-v2

 重新声明更新

[root@k8s-master ingress]# kubectl apply -f myapp-v1.yml
[root@k8s-master ingress]# kubectl apply -f myapp-v2.yml[root@k8s-master ingress]# kubectl get service
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1        <none>            443/TCP        5d11h
myapp-v1     ClusterIP      10.108.70.49     <none>            80/TCP         91m
myapp-v2     ClusterIP      10.101.121.115   <none>            80/TCP         86m

 5.1.3 创建 ingress 资源类型作为与内部service的一个链接

[root@k8s-master ingress]# kubectl create ingress webcluster \
--rule '*/=shuyan-svc:80' --dry-run=client -o yamlapiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: webcluster
spec:rules:- host: '*'http:paths:- backend:service:name: shuyan-svcport:number: 80path: /pathType: Exact
status:loadBalancer: {}[root@k8s-master ingress]# kubectl create ingress webcluster \
--rule '*/=shuyan-svc:80' --dry-run=client -o yaml > shuyan-inccress.yml[root@k8s-master ingress]# vim shuyan-inccress.yml
## 以下是修改之后 的
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: webclusterannotations:nginx.ingress.kubernetes.io/rewrite-target: /    # 访问路径后加任何内容都被定向到/
spec:ingressClassName: nginxrules:- http:paths:- backend:service:name: myapp-v1port:number: 80path: /v1            # 定义访问路径为v1pathType: Prefix- backend:service:name: myapp-v2port:number: 80path: /v2            # 定义访问路径为v2pathType: Prefix

声明ingress类型

[root@k8s-master ingress]# kubectl apply -f shuyan-inccress.yml

查看ingress分配的地址

[root@k8s-master ingress]# kubectl -n ingress-nginx get services 
NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP       PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.97.25.16    192.168.239.201   80:30467/TCP,443:31166/TCP   11h
ingress-nginx-controller-admission   ClusterIP      10.99.91.236   <none>            443/TCP                      11h

访问分配的地址

[root@complete ~]# curl 192.168.239.201/v1
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@complete ~]# curl 192.168.239.201/v2
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

5.2 基于域名的访问

[root@k8s-master ingress]# vim shuyan-inccress.ymlapiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: webclusterannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:ingressClassName: nginxrules:- host: myapp-v1.shuyan.com    # v1 域名http:paths:- backend:service:name: myapp-v1port:number: 80path: /pathType: Prefix- host: myapp-v2.shuyan.com    # v2 域名http:paths:- backend:service:name: myapp-v2port:number: 80path: /pathType: Prefix

声明修改后代码

[root@k8s-master ingress]# kubectl apply -f shuyan-inccress.yml

查看是否创建成功

[root@k8s-master ingress]# kubectl describe ingress webcluster 

 

 在集群之外的主机做域名解析

[root@complete ~]# vim /etc/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.239.20  complete reg.shuyan.com
192.168.239.110 k8s-node1
192.168.239.120 k8s-node2
192.168.239.100 k8s-master
192.168.239.201 myapp-v1.shuyan.com  myapp-v2.shuyan.com # 添加解析

[root@complete ~]# curl myapp-v1.shuyan.com
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@complete ~]# curl myapp-v2.shuyan.com
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

5.3 建立tls加密

建立证书

这条命令创建了一个名为 web-tls-secret 的 Secret,其中包含了你之前生成的 TLS 证书 (tls.crt) 和私钥 (tls.key)。Secret 是 Kubernetes 中用于存储敏感信息的对象,如密码、密钥等。

创建证书

[root@k8s-master ingress]# openssl req -newkey rsa:2048 \
-nodes -keyout tls.key -x509 -days 365 \
-subj "/CN=nginxsvc/O=nginxsvc" -out tls.crt
[root@k8s-master ingress]# kubectl describe secrets web-tls-secret 
Name:         web-tls-secret
Namespace:    default
Labels:       <none>
Annotations:  <none>Type:  kubernetes.io/tlsData
====
tls.crt:  1164 bytes
tls.key:  1704 bytes
[root@k8s-master ingress]# kubectl get secrets web-tls-secret -o yaml

 

[root@k8s-master ingress]# vim myapp-v1.yml 
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: myapp-v1name: myapp-v1
spec:replicas: 1selector:matchLabels:app: myapp-v1template:metadata:labels:app: myapp-v1spec:containers:- image: myapp:v1name: myapp
--- 
apiVersion: v1
kind: Service
metadata:labels:app: myapp-v1name: myapp-v1
spec:ports:- port: 80protocol: TCPtargetPort: 80selector:app: myapp-v1

 

[root@k8s-master ingress]# vim ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: webclusterannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:tls:                # 使用tls- hosts:- myapp-v1.shuyan.comsecretName: web-tls-secret    # 指定secret资源类型的名称ingressClassName: nginxrules:- http:paths:- backend:service:name: myapp-v1port:number: 80path: /pathType: Prefix

删除原有的,声明新的 

[root@k8s-master ingress]# kubectl delete -f shuyan-inccress.yml [root@k8s-master ingress]# kubectl apply -f ingress.yml 

查看是否成功

[root@k8s-master ingress]# kubectl describe ingress webcluster 
Name:             webcluster
Labels:           <none>
Namespace:        default
Address:          192.168.239.110
Ingress Class:    nginx
Default backend:  <default>
TLS:web-tls-secret terminates myapp-v1.shuyan.com
Rules:Host        Path  Backends----        ----  --------*           /   myapp-v1:80 (10.244.2.51:80)
Annotations:  nginx.ingress.kubernetes.io/rewrite-target: /
Events:Type    Reason  Age                    From                      Message----    ------  ----                   ----                      -------Normal  Sync    3m46s (x2 over 4m17s)  nginx-ingress-controller  Scheduled for sync

网页输入认证

5.4 建立auth认证

[root@k8s-master ingress]# yum install httpd-tools# 创建本地文件为auth 用户名为shuyan
[root@k8s-master ingress]# htpasswd -cm auth shuyan
New password: 
Re-type new password: 
Adding password for user shuyan[root@k8s-master ingress]# ls | grep auth 
auth[root@k8s-master ingress]# cat auth 
shuyan:$apr1$Zqqr6uJj$a0Kb0nUK2CiqXYP7OugYj1[root@k8s-master ingress]# kubectl create secret generic auth-web \
--from-file /root/ingress/auth 

查看本地导入的资源类型

[root@k8s-master ingress]# kubectl describe secrets auth-web 
Name:         auth-web
Namespace:    default
Labels:       <none>
Annotations:  <none>Type:  OpaqueData
====
auth:  45 bytes
[root@k8s-master ingress]# kubectl get secrets auth-web -o yaml
apiVersion: v1
data:auth: c2h1eWFuOiRhcHIxJFpxcXI2dUpqJGEwS2IwblVLMkNpcVhZUDdPdWdZajEK
kind: Secret
metadata:creationTimestamp: "2024-09-08T11:42:25Z"name: auth-webnamespace: defaultresourceVersion: "733478"uid: 84cc365b-de63-40f3-b134-75ed984a1692
type: Opaque

 建立ingress2基于用户认证的yaml文件

[root@k8s-master ingress]# vim ingress2.yml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-authannotations:nginx.ingress.kubernetes.io/auth-type: basic        # 定义认证类型nginx.ingress.kubernetes.io/auth-secret: auth-web   # 选定导入的本地加密文件名称nginx.ingress.kubernetes.io/auth-realm: "Please input username and password"    # 打印一条语句nginx.ingress.kubernetes.io/rewrite-target: /
spec:tls:- hosts:- myapp-v1.shuyan.comsecretName: web-tls-secretingressClassName: nginxrules:- http:paths:- backend:service:name: myapp-v1port:number: 80path: /pathType: Prefix

删除旧的并创建新的 

[root@k8s-master ingress]# kubectl delete -f ingress.yml 
[root@k8s-master ingress]# kubectl apply -f ingress2.yml 

查看认证文件资源类型

[root@k8s-master ingress]# kubectl describe ingress ingress-auth 
Name:             ingress-auth
Labels:           <none>
Namespace:        default
Address:          
Ingress Class:    nginx
Default backend:  <default>
TLS:web-tls-secret terminates myapp-v1.shuyan.com
Rules:Host        Path  Backends----        ----  --------*           /   myapp-v1:80 (10.244.2.51:80)
Annotations:  nginx.ingress.kubernetes.io/auth-realm: Please input username and passwordnginx.ingress.kubernetes.io/auth-secret: auth-webnginx.ingress.kubernetes.io/auth-type: basicnginx.ingress.kubernetes.io/rewrite-target: /
Events:Type    Reason  Age   From                      Message----    ------  ----  ----                      -------Normal  Sync    27s   nginx-ingress-controller  Scheduled for 

实现效果

5.5 rewrite重定向

基于正则表达式的重定向

[root@k8s-master ingress]# vim ingress3.yml apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-rewiteannotations:nginx.ingress.kubernetes.io/rewrite-target: /$2nginx.ingress.kubernetes.io/use-regex: "true"
spec:ingressClassName: nginxrules:- http:paths:- backend:service:name: myapp-v1port:number: 80path: /pathType: Prefix- backend:service:name: myapp-v2port:number: 80path: /shuyan(/|$)(.*)pathType: ImplementationSpecifichost: myapp-v1.shuyan.comnginx.ingress.kubernetes.io/rewrite-target: /$2:
这个注解告诉 Nginx Ingress 控制器,对于匹配 /shuyan/(/|$)(.*) 的路径,
将路径重写为 / 后面加上 $2。$2 是正则表达式中捕获的第二个分组,即 / 或空字符串后面的所有内容。
例如,请求 https://myapp-v1.shuyan.com/shuyan/some/path 将被重写为 /some/path。根路径请求:
客户端请求 https://myapp-v1.shuyan.com/,直接转发到 myapp-v1 服务。带 /shuyan 的路径请求:
客户端请求 https://myapp-v1.shuyan.com/shuyan/some/path,
匹配 /shuyan/(/|$)(.*),路径重写为 /some/path,然后转发到 myapp-v2 服务。

声明并查看状态 

[root@k8s-master ingress]# kubectl delete -f ingress2.yml 
[root@k8s-master ingress]# kubectl apply -f ingress3.yml[root@k8s-master ingress]# kubectl describe ingress ingress-rewite 
Name:             ingress-rewite
Labels:           <none>
Namespace:        default
Address:          192.168.239.110
Ingress Class:    nginx
Default backend:  <default>
Rules:Host                 Path  Backends----                 ----  --------myapp-v1.shuyan.com  /                  myapp-v1:80 (10.244.2.51:80)/shuyan(/|$)(.*)   myapp-v2:80 (10.244.1.43:80)
Annotations:           nginx.ingress.kubernetes.io/rewrite-target: /$2nginx.ingress.kubernetes.io/use-regex: true
Events:Type    Reason  Age                  From                      Message----    ------  ----                 ----                      -------Normal  Sync    5m50s (x5 over 18m)  nginx-ingress-controller  Scheduled for sync

 

[root@complete ~]# curl myapp-v1.shuyan.com
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@complete ~]# curl myapp-v1.shuyan.com/shuyan/index.html
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[root@complete ~]# curl myapp-v1.shuyan.com/shuyan/hostname.html
myapp-v2-7cd6d597d-gmgt6

基于根目录的重定向

[root@k8s-master ingress]# vim ingress4.yml apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-rewiteannotations:nginx.ingress.kubernetes.io/app-root: /hostname.html
spec:ingressClassName: nginxrules:- http:paths:- backend:service:name: myapp-v1port:number: 80path: /pathType: Prefixhost: myapp-v1.shuyan.com

声明并查看 

[root@k8s-master ingress]# kubectl delete -f ingress3.yml[root@k8s-master ingress]# kubectl apply -f ingress4.yml [root@k8s-master ingress]# kubectl describe ingress ingress-rewite 
Name:             ingress-rewite
Labels:           <none>
Namespace:        default
Address:          192.168.239.110
Ingress Class:    nginx
Default backend:  <default>
Rules:Host                 Path  Backends----                 ----  --------myapp-v1.shuyan.com  /   myapp-v1:80 (10.244.2.51:80)
Annotations:           nginx.ingress.kubernetes.io/app-root: /hostname.html
Events:Type    Reason  Age               From                      Message----    ------  ----              ----                      -------Normal  Sync    9s (x2 over 16s)  nginx-ingress-controller  Scheduled for sync

 

[root@complete ~]# curl -L myapp-v1.shuyan.com/
myapp-v1-7479d6c54d-x2zvr[root@complete ~]# curl  myapp-v1.shuyan.com/123/3123/ -L
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.12.2</center>
</body>
</html>

能不能写什么都会被重定向到指定目录呢?

当然可以

使用 nginx.ingress.kubernetes.io/rewrite-target 注解来重写所有请求到 /hostname.html 的 Ingress 规则:

[root@k8s-master ingress]# vim ingress5.yml apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-rewiteannotations:nginx.ingress.kubernetes.io/rewrite-target: /hostname.html
spec:ingressClassName: nginxrules:- host: myapp-v1.shuyan.comhttp:paths:- backend:service:name: myapp-v1port:number: 80path: /pathType: Prefix
[root@k8s-master ingress]# kubectl delete -f ingress4.yml 
ingress.networking.k8s.io "ingress-rewite" deleted
[root@k8s-master ingress]# kubectl apply -f ingress5.yml 
ingress.networking.k8s.io/ingress-rewite created

[root@complete ~]# curl  myapp-v1.shuyan.com/123/3123/ -L
myapp-v1-7479d6c54d-x2zvr
[root@complete ~]# curl  myapp-v1.shuyan.com/123/3123/ 
myapp-v1-7479d6c54d-x2zvr
[root@complete ~]# curl  myapp-v1.shuyan.com/123/31233123/ 
myapp-v1-7479d6c54d-x2zvr
[root@complete ~]# curl  myapp-v1.shuyan.com/123/31233123/3213 
myapp-v1-7479d6c54d-x2zvr根据新的 Ingress 规则,所有请求都将被重写到 /hostname.html。这意味着:请求 https://myapp-v1.shuyan.com/ 将被重写到 /hostname.html。
请求 https://myapp-v1.shuyan.com/123 也将被重写到 /hostname.html。
请求 https://myapp-v1.shuyan.com/some/path 也将被重写到 /hostname.html。

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

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

相关文章

轻松上手,高效产出:音频剪辑工具年度精选

不知道你有没有拍vlog记录生活的习惯&#xff0c;有时候视频里穿插进自己的声音能让视频更加丰富贴上自己的标签。这次我们一起探讨当下有哪些好用的在线音频剪辑工具。 1.FOXIT音频剪辑 链接直达>>https://www.foxitsoftware.cn/audio-clip/ 这个工具是一款专业的音…

Java 数据类型详解:基本数据类型与引用数据类型

在 Java 编程语言中&#xff0c;数据类型主要分为两大类&#xff1a;基本数据类型和引用数据类型。理解这两种类型的区别、使用场景及其转换方式是学习 Java 的基础。本文将深入探讨这两类数据类型的特点&#xff0c;并展示自动类型转换、强制类型转换以及自动拆箱和封箱的使用…

虚拟现实辅助工程技术助力多学科协同评估

在当今高速发展的经济环境中&#xff0c;制造业面临着多重挑战&#xff0c;包括提高产品性能、压缩设计周期、实现轻量化设计和降低成本。为了有效应对这些挑战&#xff0c;多学科协同评估成为缩短研发周期和提升研制质量的关键手段。 传统的多学科评估面临着数据孤立与融合困难…

《‌黑神话:‌悟空》‌游戏攻略‌

时光荏苒&#xff0c;岁月如梭&#xff0c;不知不觉已经来到了2024年的9月份了。 ‌突然想写一篇关于《‌黑神话&#xff1a;‌悟空》‌的游戏攻略‌。 在《‌黑神话&#xff1a;‌悟空》‌这款以中国古代名著《‌西游记》‌为背景的动作角色扮演游戏中&#xff0c;‌玩家将扮…

LeetCode 热题 100 回顾9

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

【redis】redis的特性和主要应用场景

文章目录 redis 的特性在内存中存储数据可编程的扩展能力持久化集群高可用快 redis 的应用场景实时数据存储缓存消息队列 redis 的特性 redis 的一些特性&#xff08;优点&#xff09;成就了它 在内存中存储数据 In-memory data structures MySQL 主要是通过“表”的方式来…

JavaEE-HTTPHTTPS

目录 HTTP协议 一、概念 二、http协议格式 http请求报文 http响应报文 URL格式 三、认识方法 四、认识报头 HTTP响应中的信息 HTTPS协议 对称加密 非对称加密 中间人攻击 解决中间人攻击 HTTP协议 一、概念 HTTP (全称为 "超⽂本传输协议") 是⼀种应⽤…

Mysql中的锁机制详解

一、概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中&#xff0c;除了传统的计算资源&#xff08;如CPU、RAM、I/O等&#xff09;的争用以外&#xff0c;数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决…

一文讲懂Spring Event事件通知机制

目录 一 什么是spring event 二 怎么实现spring event 一 什么是spring event 我不会按照官方的解释来说什么是spring event&#xff0c;我只是按照自己的理解来解释&#xff0c;可能原理上会和官方有偏差&#xff0c;但是它的作用和功能就是这个&#xff0c;我更加偏向于从他…

详解React setState调用原理和批量更新的过程

1. React setState 调用的原理 setState目录 1. React setState 调用的原理2. React setState 调用之后发生了什么&#xff1f;是同步还是异步&#xff1f;3. React中的setState批量更新的过程是什么&#xff1f; 具体的执行过程如下&#xff08;源码级解析&#xff09;&#x…

安卓13带有系统签名的应用不能正常使用webview 调用webview失败 系统应用app apk

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.彩蛋1.前言 android版本高一些的平台,经常会遇到一些权限安全问题,像客户的应用如果带有系统签名,会导致不能正常使用webview问题。 2.问题分析 我们log信息,可以发现下面的提示: Fo…

网络层ip协议

一.概念 ip协议主要是为了在复杂的网络环境中确定一个合适的路径来传输主机间的数据。简单来说就是用来确定主机的位置。 ip协议中的一些设备如下&#xff1a; 主机: 配有 IP 地址, 但是不进行路由控制的设备;路由器: 即配有 IP 地址, 又能进行路由控制;节点: 主机和路由器的统…

传统CV算法——边缘算子与图像金字塔算法介绍

边缘算子 图像梯度算子 - Sobel Sobel算子是一种用于边缘检测的图像梯度算子&#xff0c;它通过计算图像亮度的空间梯度来突出显示图像中的边缘。Sobel算子主要识别图像中亮度变化快的区域&#xff0c;这些区域通常对应于边缘。它是通过对图像进行水平和垂直方向的差分运算来…

5.2.数据结构-c/c++二叉树详解(下篇)(算法面试题)

本章所有代码请见&#xff1a;5.3.数据结构-c/c二叉树代码-CSDN博客 上篇:5.数据结构-c/c二叉树详解(上篇)&#xff08;遍历方法&#xff0c;完全二叉树&#xff09;-CSDN博客 目录 1 求二叉树 第k层的节点 2 查找一个节点是否在二叉树中 3 求二叉树节点的个数 4 求二叉树…

数据结构(邓俊辉)学习笔记】排序 1——快速排序:算法A

文章目录 1. 分而治之2. 轴点3. 构造轴点4. 单调性 不变性5. 实例 1. 分而治之 主题就是排序。实际上我们对于排序问题并不陌生。你应该记得在最开始的几章&#xff0c;我们就分别介绍过起泡排序、插入排序、选择排序以及归并排序&#xff0c;而在介绍散列技术时&#xff0c;我…

自定义TextView实现结尾加载动画

最近做项目&#xff0c;仿豆包和机器人对话的时候&#xff0c;机器人返回数据是流式返回的&#xff0c;需要在文本结尾添加加载动画&#xff0c;于是自己实现了自定义TextView控件。 源码如下&#xff1a; import android.content.Context import android.graphics.Canvas imp…

基于云原生向量数据库 PieCloudVector 的 RAG 实践

近年来&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;已然成为最热门的话题之一。工业界出现了各种内容生成工具&#xff0c;能够跨多种模态产生多样化的内容。这些主流的模型能够取得卓越表现&#xff0c;归功于创新的算法、模型规模的大幅扩展&#xff0c;以及海…

用Boot写mybatis的增删改查

一、总览 项目结构&#xff1a; 图一 1、JavaBean文件 2、数据库操作 3、Java测试 4、SpringBoot启动类 5、SpringBoot数据库配置 二、配置数据库 在项目资源包中新建名为application.yml的文件&#xff0c;如图一。 建好文件我们就要开始写…

【MySQL00】【 杂七杂八】

文章目录 一、前言二、MySQL 文件1. 参数文件2. 日志文件3. 套接字文件4. pid 文件5. 表结构定义文件6. InnoDB 存储引擎文件 二、BTree 索引排序三、InnoDB 关键特性1. 插入缓冲1.1 Insert Buffer 和 Change Buffer1.1 缓冲合并 2. 两次写2. 自适应哈希索引3. 异步IO4. 刷新邻…

江协科技STM32学习- P9 OLED调试工具

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…