如何为 Kubernetes 中的容器设置 VPN 和反向代理?

时间:2021-04-11 18:07:58

标签: docker nginx kubernetes docker-compose proxy

所以,我有一个非常具体的应用程序,我正在尝试从 docker-compose 迁移到 kubernetes。我将要描述的一切都在 docker-compose 中完美运行,只是如何在 kubernetes 中复制它让我失望。

目标

我有一个应用程序,我们称之为“我的应用程序”。出于安全原因,my-app 需要通过 VPN 路由其所有请求。但是,我希望 my-app 能够通过“正常”网络接收指令,即发送到其常规公共 IP 地址/主机名。

所以我设置了 docker-compose。我创建了 VPN 容器,并通过它路由了我的应用程序的所有流量。然后我创建了一个 Nginx 反向代理并将其直接链接到 my-app。

结果是我可以使用 my-app 的 API 向它发送命令,然后 my-app 通过 VPN 执行它需要的操作。

我的应用程序具有适当的安全性,因此我不担心恶意攻击。进行此设置的原因是我想让 my-app 继续在其当前主机地址接收命令以方便使用,只有 my-app 在后台执行的请求才需要添加 VPN 安全性。

Docker Compose 设置

这是 docker-compose 配置的精简示例:

version: "3"
services:
    vpn:
        image: vpn-image
        container_name: vpn
        # More VPN configuration

    my-app:
        image: my-app-image
        container_name: my-app
        network_mode: service:vpn
        # More my-app configuration

    my-proxy:
        image: my-proxy-image
        container_name: my-proxy
        links:
            - vpn:my-app
        ports:
            - 8080:80
        # More my-proxy configuration

我在哪里

所以我让 my-app 和 my-proxy 在两个独立的 Kubernetes pod 中运行,并且运行良好。我还将 vpn 容器设置为与 my-app 相同的 pod 中的“sidecar”。

只要我只部署 my-app 和 my-proxy,一切正常。在我包含 vpn 的那一刻,代理不再能够路由到我的应用程序。

我知道这是因为 VPN 正在改变 my-app 处理所有请求的方式。我可以进入 pod 并验证 VPN 是否正常工作、网络连接是否存在等。

这是我的 kubernetes 配置的精简版,用于包含 VPN 和 my-app 的部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-vpn
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app-vpn
  template:
    metadata:
      labels:
        app: my-app-vpn
    spec:
      containers:
        - name: vpn
          image: vpn-image
          securityContext:
            capabilities:
              add:
                - NET_ADMIN
                - SYS_MODULE
          # More vpn configuration
        - name: my-app
          image: my-app-image
          ports:
            - containerPort: 30007
          # More my-app configuration
---
apiVersion: v1
kind: Service
metadata:
  name: my-app-vpn-service
spec:
  type: NodePort
  selector:
    app: my-app-vpn
  ports:
    - port: 30007
      targetPort: 30007
      nodePort: 30007
      protocol: TCP

my-proxy 只是一个非常简单的 nginx 反向代理,我已经在很多应用程序中使用了它。这是 my-app 的代理指令:

location /my-app/ {
    proxy_set_header Host $http_host;
    rewrite ^\/my-app\/(.*)$ /$1 break;
    proxy_pass http://my-app-vpn-service:30007;
}

正如我所说,只要 vpn 容器被注释掉并且没有运行,my-proxy 就会使用上述配置完美地重定向到 my-app。

我需要什么

我对 Kubernetes 网络没有足够的了解,无法知道我做错了什么。我知道必须有一种方法来设置某种服务来弥补这里的差距,相当于 docker“链接”,但我只是不知道该怎么做。

感谢指导。谢谢。

0 个答案:

没有答案