Kubernetes上的Docker Nginx反向代理

时间:2019-07-05 12:41:22

标签: docker nginx kubernetes docker-compose

我有几个应用程序,它们在Docker容器中运行(都在同一VM上)。 在它们前面,我有一个nginx容器作为反向代理。 现在我想将其迁移到Kubernetes。

当我通过docker-composer在本地启动它们时,它的工作与预期的一样。 在Kubernetes上没有。

nginx.conf

http {
        server {
                location / {
                        proxy_pass http://app0:80;
                }

                location /app1/ {
                        proxy_pass http://app1:80;
                        rewrite ^/app1(.*)$ $1 break;
                }

                location /app2/ {
                        proxy_pass http://app2:80;
                        rewrite ^/app2(.*)$ $1 break;
                }
        }
}

edit:kubernetes上不使用nginx.conf。我必须为此使用ingress-controller:

deployment.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: app0
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: app0
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": linux
      containers:
      - name: app0
        image: appscontainerregistry1.azurecr.io/app0:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 80
          name: nginx
---
#the other apps
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx
  annotations:
    # use the shared ingress-nginx
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: apps-url.com
    http:
      paths:
      - path: /
        backend:
          serviceName: app0
          servicePort: 80
      - path: /app1
        backend:
          serviceName: app1
          servicePort: 80
      - path: /app2
        backend:
          serviceName: app2
          servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: ingress-nginx

我在/(app0)上得到响应。不幸的是,子路由不起作用。我在做什么错了?

编辑

我想通了。 Ich错过了安装入口控制器的机会。就像在此页面(https://kubernetes.io/docs/concepts/services-networking/ingress/)所述,如果未安装控制器,则无法使用入口。 我将ingress-nginx用作控制器(https://kubernetes.github.io/ingress-nginx/deploy/)是因为它是我能找到的最详尽描述的安装指南,并且我不想使用HELM。 我还有一个问题。如何更改子网域正在运行的入口。 例如,k8url.com / app1 / subroute每次在我的app1的起始页面上显示给我。 而且,如果我使用域名代理,则每次使用IP都会重写域名。

2 个答案:

答案 0 :(得分:0)

您已经成功创建了部署,但是应该有该服务。 kubernetes上的nginx ngress根据该服务管理流量。

所以流程就像

nginx-ingress > service > deployment pod.

您缺少为两个应用程序创建服务并基于kubernetes入口中的路由添加正确的路由的方法。

答案 1 :(得分:0)

添加此内容:

apiVersion: v1
kind: Service
metadata:
  name: loadbalancer
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: ingress-nginx

因为您没有将Service负载均衡器路由到targetPort80