0

I am using active FTP to transfer file(via the PORT command). I can initiate active FTP sessions using LoadBalancer IP and Loadbalancer Service Target Port. I tried a similar way to initiate active FTP session using Node External IP and Node Port from NodePort service but I am not able to do it. I am using npm.js basic-ftp module for it. The code for my connection is given below:

let client = new ftp.Client(ftpTimeout * 1000);
client.prepareTransfer = prepareTransfer;

And prepareTransfer has implementation like:

 export async function prepareTransfer(ftp: FTPContext): Promise<FTPResponse> {
  // Gets the  ip address of either LoadBalancer(for LoadBalancer service) or Node(For NodePort Service)
   const ip = await getIp();
  // Gets a TargetPort for LoadBalancer service or Node Port for NodePort service
  const port = await getFtpPort();

  // Example command: PORT 192,168,150,80,14,178
  // The first four octets are the IP address while the last two octets comprise the 
  //port that will be used for the data connection.
  // To find the actual port multiply the fifth octet by 256 and then add the sixth 
  //octet to the total.
  // Thus in the example above the port number is ( (14*256) + 178), or 3762
  const p1 = Math.floor(port / 256);
  const p2 = port % 256;
  const command = `PORT ${ip.replace(/\./g, ',')},${p1},${p2}`;

  // https://github.com/patrickjuchli/basic-ftp/issues/195
  // Data socket pipes before the connection so use the mock socket.
  const mockSocket = new MockSocket();
  ftp.dataSocket = mockSocket as any;

  let ftpResponse = new Promise<FTPResponse>((resolve, reject) => {
    let response: FTPResponse;
    const server = createServer(function (socket) {
      console.log('FTP Client connected');
      mockSocket.setSocket(socket, server, port);
    });

    server.on('error', err => {
      reject(err);
    });
    server.listen(port, async () => {
      console.log(`socket server for FTP started at port ${port}`);
      // send the port request
      response = await ftp.request(command);
      if (response.code !== 200) {
        reject('Could not connect');
        server.close();
      }
      resolve(response);
    });
  });

  return ftpResponse;
}

Any idea why NodePort is not working here?

Helm Chart for NodePort:

apiVersion: v1
kind: Service
metadata:
  name: "ftp-service"
spec:
  type: NodePort
  externalTrafficPolicy: Local
  selector:
    statefulset.kubernetes.io/pod-name: "kinetic-{{ $jobber.name }}-{{$i}}"
  ports:
  - protocol: TCP
    name: ftp-8000
    port: 8000
    targetPort: 8000
    nodePort: 30014

Helm chart for loadbalancer:

apiVersion: v1
kind: Service
metadata:
  name: "ftp-service-load"
spec:
  type: LoadBalancer 
  externalTrafficPolicy: Local
  selector:
    statefulset.kubernetes.io/pod-name: "kinetic-{{ $jobber.name }}-{{$i}}"
  ports:
  - protocol: TCP
    name: ftp-8000
    port: 8000
    targetPort: 8000
    nodePort: 30014

0 Answers0