通过 pod 进行隧道传输

Are*_*res 3 portforwarding tunnel kubernetes

我在服务器上运行了多个 Kubernetes pod。其中一个 Pod 包含一个仅接受来自特定子网(即其他 Kubernetes Pod)的连接的数据库应用程序。

我试图从服务器本身连接到数据库应用程序,但连接被拒绝,因为服务器的 IP 不是允许的子网的一部分。

有没有办法创建一个简单的 pod,它接受来自服务器的连接并将它们转发到包含 DB 应用程序的 pod?

不幸的是,数据库应用程序无法重新配置为接受其他连接。

谢谢

Jan*_*art 5

最简单的解决方案可能是向运行 socat 或类似内容的 pod 添加另一个容器,并使其侦听并连接到本地 pod 的 IP(重要:如果您的数据库程序配置为仅接受,则连接到 pod ip,而不是 127.0.0.1来自覆盖网络的连接)。然后修改您为这些 pod 提供的服务并添加额外的端口。

下面的示例假设端口 2000 正在运行您的程序,并且 2001 将是转发到 pod 内的 2000 的端口。

示例(该示例正在运行 netcat 模拟您的数据库程序):

apiVersion: v1
kind: Pod
metadata:
  name: database
  labels:
    app: database
spec:
  containers:
  - name: alpine
    image: alpine
    command: ["nc","-v","-n","-l","-p","2000"]
    ports:
    - containerPort: 2000
  - name: socat
    image: toughiq/socat
    ports:
    - containerPort: 2001
    env:
    - name: LISTEN_PROTO
      value: "TCP4"
    - name: LISTEN_PORT
      value: "2001"
    - name: TARGET_PROTO
      value: "TCP4"
    - name: TARGET_HOST
      valueFrom:
        fieldRef:
          fieldPath: status.podIP
    - name: TARGET_PORT
      value: "2000"
---
apiVersion: v1
kind: Service
metadata:
  name: database
spec:
  selector:
    app: database
  ports:
  - name: myport
    port: 2000
    targetPort: 2000
    protocol: TCP
  - name: socat
    port: 2001
    targetPort: 2001
    protocol: TCP
  externalIPs: [xxxxxx]
Run Code Online (Sandbox Code Playgroud)