所以,我有一个非常具体的应用程序,我正在尝试从 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“链接”,但我只是不知道该怎么做。
感谢指导。谢谢。