如何在kubernetes集群中管理网站的“链接转发”

问题描述

我有一个使用相对href链接的网站(例如,该链接指向“ / login”,而不是“ http://somesite.com/login”)。这在普通服务器上可以正常工作,但我想在Docker容器内使用网站作为kubernetes集群的一部分。我的目标是拥有多个网站副本来管理高负载时间,认情况下将两个副本进行动态扩展。

我将服务设置为“负载平衡器”,如下所示:

apiVersion: v1
kind: Service
Metadata:
  name: websiteservice
spec:
  selector:
    app: websiteapp
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

这里的问题是,如果我导航到负载平衡器的URL(在我的主机上自动创建-数字海洋),则尽管网站的主页已加载,但其他任何页面都会给我一个404,因为而不是加载容器的“ / login”页面将加载不存在的负载均衡器的“ / login”页面。如何配置群集或负载平衡器以将所有子目录(.com之后的任何内容)转发到Web服务器?

编辑1 评论中,建议我设置入口。我认为我已经完成了对Yaml的更改:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
Metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: Nginx
spec:
  rules:
  - host: somesite.co.uk
    http:
      paths:
      - backend:
          serviceName: websiteservice
          servicePort: 80
---
apiVersion: v1
kind: Service
Metadata:
  name: websiteservice
spec:
  selector:
    app: websiteapp
  type: ClusterIP
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
Metadata:
  name: websiteapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: websiteapp
  template:
    Metadata:
      labels:
        app: websiteapp
    spec:
      containers:
      - name: websiteapp
        image: mydocker.co.uk/websiteimg
      imagePullSecrets:
      - name: regcred
      nodeselector:
        beta.kubernetes.io/instance-type: s-2vcpu-4gb

但是我仍然无法导航到网站首页之外。

解决方法

您的Ingress文件应如下所示:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: somesite.co.uk
    http:
      paths:
      - path: /*
        backend:
          serviceName: websiteservice
          servicePort: 80

只需添加路径即可重定向流量。

看看:host-path-routingingress-path-matching