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;请你在该数组中找出 和为目标…

前端页面加载由模糊到清晰的实现方案

要实现图片加载时由模糊逐渐变得清晰的效果,可以使用 CSS 和 JavaScript 的结合。这里的思路是:先让图片在加载时模糊显示,等图片完全加载完后,再去掉模糊效果。 1. 使用 CSS 实现模糊效果 我们可以使用 filter: blur() 来为图片添加模糊效果,结合 transition 属性在加载…

MongoDB Limit 与 Skip 方法

MongoDB Limit 与 Skip 方法 MongoDB 是一个流行的 NoSQL 数据库&#xff0c;它提供了灵活的数据存储和强大的查询功能。在处理大量数据时&#xff0c;我们常常需要限制返回的结果数量或者跳过一部分结果&#xff0c;这时就可以使用 MongoDB 的 limit 和 skip 方法。 Limit 方…

Python中差分进化differential_evolution的调用及参数说明

在场景应用中&#xff0c;要求我们的函数计算结果尽可能的逼近实际测量结果&#xff0c;可转化计算结果与测量结果的残差&#xff0c;通过最小化残差&#xff0c;便可求出最优的结果。但使用最小二乘等方法来计算时&#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 (全称为 "超⽂本传输协议") 是⼀种应⽤…

WEB项目解决CORS 跨域问题

为了安全&#xff0c;web默认是不允许跨域访问的。不过实际项目中&#xff0c;会遇到不同模块之间来回跳转的情况。所以&#xff0c;项目内部一般会修改配置或者代码来解决CORS跨域问题。 我的后端使用的是 Jetty 服务器&#xff0c;所以下面就拿jetty来举例。Jetty 提供了一个…

14.2 k8s中我们都需要监控哪些组件

本节重点介绍 : k8s中关注四大块指标总结 容器基础资源指标k8s资源指标k8s服务组件指标部署在pod中业务埋点指标 k8s关注指标分析 k8s中组件复杂&#xff0c;我们主要专注的无外乎四大块指标&#xff1a; 容器基础资源指标 为何关注这些指标 我们的应用从独享一台机器上…

springboot组件使用-mybatis组件使用

文章目录 springboot使用mybatis组件1. 添加依赖2. 配置数据源3. 创建实体类4. 创建Mapper接口5. 创建Mapper XML文件6. 使用Mapper7. 启动类配置 mybtis 动态SQL1. Mapper 注解2. Select 注解3. Insert 注解4. Update 注解5. Delete 注解6. Results 注解7. Param 注解8. Cache…

Mysql中的锁机制详解

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

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

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

Rust:Restful API 服务程序开发详述

0. 关于异步程序设计 0.1 对异步机制的理解 运行效率对于后端程序来讲很重要。我曾经以为&#xff0c;多线程机制是后端设计的终极方法&#xff0c;后来才发现&#xff0c;异步机制才是榨干 CPU 运行效率资源的关键所在。 我最初对于异步程序设计有误解&#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 地址, 又能进行路由控制;节点: 主机和路由器的统…

分库分表:应对大数据量挑战的数据库扩展策略

随着互联网技术的发展&#xff0c;数据量的爆炸性增长给数据库系统带来了前所未有的挑战。为了有效管理大规模数据并保持高性能&#xff0c;分库分表成为了一种常见的数据库扩展策略。本文将探讨分库分表的概念、动机、实施策略以及潜在的挑战和解决方案。 什么是分库分表&…