K8s ingress-nginx根据请求目录不同将请求转发到不同应用

K8s ingress-nginx根据请求目录不同将请求转发到不同应用

1. 起因

有小伙伴做实验想要实现以下需求:

输入www.pana.com/app1访问app1的svc

输入www.pana.com/app2访问app2的svc

2. 实验

2.1 Dockerfile

先准备Dockerfile

bash 复制代码
FROM nginx:1.20

ADD index.html /usr/share/nginx/html/index.html

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

再准备一个index.html

当app1时就把它改为web1 v1.1.0

当app2时就把它改为web2 v1.2.0

html 复制代码
nginx wework-web1 v1.1.0

2.2 Deployment和SVC

将镜像分别上传至harbor后,通过yaml分别部署app1和app2

app1:

yaml 复制代码
kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    app: nginx-app1
  name: nginx-app1
  namespace: test-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-app1
  template:
    metadata:
      labels:
        app: nginx-app1
    spec:
      containers:
      - name: nginx
        image: harbor.panasonic.cn/test-nginx/nginx-web:v1.1.0
        imagePullPolicy: Always
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 1
            memory: "512Mi"
          requests:
            cpu: 500m
            memory: "512Mi"
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-app1-svc
  namespace: test-nginx
  labels:
    app: nginx-app1
spec:
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: nginx-app1
  type: ClusterIP

app2:

app2的nodeport是不需要的,我做其他实验时候用到,和此实验无关

yaml 复制代码
kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    app: nginx-app2
  name: nginx-app2
  namespace: test-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-app2
  template:
    metadata:
      labels:
        app: nginx-app2
    spec:
      containers:
      - name: nginx
        image: harbor.panasonic.cn/test-nginx/nginx-web:v1.2.0
        imagePullPolicy: Always
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 1
            memory: "512Mi"
          requests:
            cpu: 500m
            memory: "512Mi"
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-app2-svc
  namespace: test-nginx
  labels:
    app: nginx-app2
spec:
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 80
      nodePort: 30080
  selector:
    app: nginx-app2
  type: NodePort

测试是否可以正常访问2个应用

2.3 Ingress

创建Ingress的yaml

注意的是小伙伴因为看了之前另外个tomcat的文档发现安装那个配置就一直404报错.

原因也很简单,另外个实验的目录是放在不通的uri下:

app1: www.pana.com/app1

app2: www.pana.com/app2

那么就不需要再对地址重写,而我们这里2个index都是在/下面

那么在匹配了path后就需要将它重写到app的/,于是就用到了nginx.ingress.kubernetes.io/rewrite-target

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-app1-ing
  namespace: test-nginx
  # 以下两行是必须的,小伙伴就卡在这里一直报404错误
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: www.pana.com
    http:
      paths:
      - pathType: Prefix
        path: /app1
        backend:
          service:
            name: nginx-app1-svc
            port:
              number: 80
      - pathType: Prefix
        path: /app2
        backend:
          service:
            name: nginx-app2-svc
            port:
              number: 80

3. 效果

效果如下

可以看到,我们已经实现了预期的效果

小伙伴试验后也表示明白了

相关推荐
切糕师学AI9 小时前
Helm Chart 是什么?
云原生·kubernetes·helm chart
陈桴浮海10 小时前
【Linux&Ansible】学习笔记合集三
linux·运维·云原生·ansible
广州中轴线11 小时前
OpenStack on Kubernetes 生产部署实战(十七)
容器·kubernetes·openstack
研究司马懿12 小时前
【云原生】Gateway API高级功能
云原生·go·gateway·k8s·gateway api
陈桴浮海1 天前
Kustomize实战:从0到1实现K8s多环境配置管理与资源部署
云原生·容器·kubernetes
张小凡vip1 天前
Kubernetes--k8s中部署redis数据库服务
redis·kubernetes
Hello.Reader1 天前
Flink Kubernetes HA(高可用)实战原理、前置条件、配置项与数据保留机制
贪心算法·flink·kubernetes
ShiLiu_mtx1 天前
k8s - 7
云原生·容器·kubernetes
匀泪1 天前
云原生(LVS NAT模式集群实验)
服务器·云原生·lvs
DolitD1 天前
云流技术深度剖析:国内云渲染主流技术与开源和海外厂商技术实测对比
功能测试·云原生·开源·云计算·实时云渲染