ibkr-docker icon indicating copy to clipboard operation
ibkr-docker copied to clipboard

Can it be deployed to Kubernetes (EKS)?

Open soujiro0725 opened this issue 6 months ago • 0 comments

Is there anyone who has succeeded in deploying it to AWS kubernetes?

I tried and the deployment of the gateway was successful. VNC was visible through a loadbalancer on browsers. However, API connection was not successful, although it showed like the following.

kubectl get svc ibkr-gateway-us -n trading-infrastructure NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ibkr-gateway-us LoadBalancer 10.xxx.28.xxx acxxxxxxxxxxxxx7feaa38ac-227xxxxxxxxxxxx4a94.elb.ap-northeast-1.amazonaws.com 6080:32047/TCP,8888:30783/TCP 18m

I tried to make a connection like

#!/usr/bin/env python3
"""
Fixed IB Gateway connection test script.
"""

import sys
import time
import logging
from ib_async import *

# Configure logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

# Fixed connection parameters
IB_GATEWAY_HOST = "acxxxxxxxxxxxxx7feaa38ac-227xxxxxxxxxxxx4a94.elb.ap-northeast-1.amazonaws.com"
IB_GATEWAY_PORT = 8888 
IB_CLIENT_ID = 8

def test_connection():
    """Test IB Gateway connection"""
    logger.info(f"Testing connection to {IB_GATEWAY_HOST}:{IB_GATEWAY_PORT}")
    
    # Create IB client instance
    ib = IB()
    
    try:
        # Test basic connection first
        logger.info(f"Connecting with clientId {IB_CLIENT_ID}...")
        
        ib.connect(
            IB_GATEWAY_HOST, 
            IB_GATEWAY_PORT, 
            clientId=IB_CLIENT_ID,
            #timeout=30
        )

        # Check if connected
        if ib.isConnected():
            logger.info("✅ Successfully connected to IB Gateway!")
            
            # Test basic API functionality
            logger.info("Testing API functionality...")
            
            # Try to get managed accounts
            try:
                accounts = ib.managedAccounts()
                logger.info(f"Managed accounts: {accounts}")
            except Exception as e:
                logger.warning(f"Could not get managed accounts: {e}")
            
            # Try to get account summary
            try:
                account_values = ib.accountSummary()
                logger.info(f"Received {len(account_values)} account values")
                
                # Print first few values
                for i, value in enumerate(account_values[:3]):
                    logger.info(f"  {value.tag}: {value.value} {value.currency}")
            except Exception as e:
                logger.warning(f"Could not get account summary: {e}")
                
            logger.info("✅ Connection test successful!")
            return True
            
        else:
            logger.error("❌ Failed to connect to IB Gateway")
            return False
            
    except ConnectionRefusedError:
        logger.error(f"❌ Connection refused - Check if IB Gateway is running and API is enabled")
        return False
    except TimeoutError:
        logger.error("❌ Connection timed out - Check firewall and network connectivity")
        return False
    except Exception as e:
        logger.error(f"❌ Connection failed: {str(e)}")
        logger.error(f"Error type: {type(e).__name__}")
        return False
    finally:
        # Always disconnect
        if ib.isConnected():
            ib.disconnect()
            logger.info("Disconnected from IB Gateway")

def test_port_connectivity():
    """Test basic port connectivity"""
    import socket
    
    logger.info("Testing basic port connectivity...")
    
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(10)
        result = sock.connect_ex((IB_GATEWAY_HOST, IB_GATEWAY_PORT))
        
        if result == 0:
            logger.info("✅ Port is reachable")
            sock.close()
            return True
        else:
            logger.error(f"❌ Port not reachable (error code: {result})")
            return False
            
    except Exception as e:
        logger.error(f"❌ Port test failed: {e}")
        return False

def main():
    """Main function"""
    logger.info("=== IB Gateway Connection Test ===")
    
    # Test 1: Basic port connectivity
    # if not test_port_connectivity():
    #     logger.error("Basic connectivity failed. Check network and firewall settings.")
    #     return
    
    # Test 2: IB API connection
    test_connection()

if __name__ == "__main__":
    main()

the output log was

2025-06-26 17:45:40,140 - main - INFO - === IB Gateway Connection Test === 2025-06-26 17:45:40,140 - main - INFO - Testing connection to acxxxxxxxxxxxxx7feaa38ac-227xxxxxxxxxxxx4a94.elb.ap-northeast-1.amazonaws.com:8888 2025-06-26 17:45:40,141 - main - INFO - Connecting with clientId 8... 2025-06-26 17:45:40,141 - ib_async.client - INFO - Connecting to acxxxxxxxxxxxxx7feaa38ac-227xxxxxxxxxxxx4a94.elb.ap-northeast-1.amazonaws.com:8888 with clientId 8... 2025-06-26 17:45:40,159 - ib_async.client - INFO - Connected 2025-06-26 17:45:44,160 - ib_async.client - INFO - Disconnecting 2025-06-26 17:45:44,161 - ib_async.client - ERROR - API connection failed: TimeoutError() 2025-06-26 17:45:44,161 - ib_async.client - INFO - Disconnected. 2025-06-26 17:45:44,161 - main - ERROR - ❌ Connection timed out - Check firewall and network connectivity

Can anyone help me out?

soujiro0725 avatar Jun 26 '25 10:06 soujiro0725