Neha
Neha

Reputation: 35

Connecting Kubernetes Pods in same cluster without service via TCP connection

I have been trying to find different methods to connect kubernetes pods. I initally connected two pods using services and a NodePort connection. Now I am trying to do so using tcp socket.

kubectl get pod -o wide
NAME   READY   STATUS    RESTARTS   AGE     IP              NODE    NOMINATED NODE   READINESS GATES
f1     1/1     Running   4          2d18h   10.233.90.120   node1   <none>           <none>
f2     1/1     Running   4          2d18h   10.233.90.117   node1   <none>           <none>

I can see these two Ips which I tried to connect using tcp socket, binding them with tcp port 8080. However it shows that it doesn't connect.

I gather this is not the way to connect them using tcp socket. Is there any method to make one pod server and other pod client and conncet using tcp socket.

EDIT :

I am attaching the two files server.c and client.c for referrenece. I tried using the cluster names f1 and f2 however still the error faced is

root@node1:~/socket# ./server
Socket successfully created..
socket bind failed...

I am also attaching the f1.yaml and f2.yaml files.

f1.yaml

apiVersion: v1
kind: Pod
metadata:
  name: f1
  labels:
    role: f1
spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80
          protocol: TCP

f2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: f2
  labels:
    role: f2
spec:
  containers:
    - name: f2
      image: "gcr.io/google-samples/hello-go-gke:1.0"
      ports:
        - name: web
          containerPort: 80
          protocol: TCP

server.c

  #include <stdio.h> 
#include <netdb.h> 
#include <netinet/in.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#define MAX 80 
#define PORT 8080 
#define SA struct sockaddr 
  
// Function designed for chat between client and server. 
void func(int sockfd) 
{ 
    char buff[MAX]; 
    int n; 
    // infinite loop for chat 
    for (;;) { 
        bzero(buff, MAX); 
  
        // read the message from client and copy it in buffer 
        read(sockfd, buff, sizeof(buff)); 
        // print buffer which contains the client contents 
        printf("From client: %s\t To client : ", buff); 
        bzero(buff, MAX); 
        n = 0; 
        // copy server message in the buffer 
        while ((buff[n++] = getchar()) != '\n') 
            ; 
  
        // and send that buffer to client 
        write(sockfd, buff, sizeof(buff)); 
  
        // if msg contains "Exit" then server exit and chat ended. 
        if (strncmp("exit", buff, 4) == 0) { 
            printf("Server Exit...\n"); 
            break; 
        } 
    } 
} 
  
// Driver function 
int main() 
{ 
    int sockfd, connfd, len; 
    struct sockaddr_in servaddr, cli; 
  
    // socket create and verification 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd == -1) { 
        printf("socket creation failed...\n"); 
        exit(0); 
    } 
    else
        printf("Socket successfully created..\n"); 
    bzero(&servaddr, sizeof(servaddr)); 
  
    // assign IP, PORT 
    servaddr.sin_family = AF_INET; 
//    servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    servaddr.sin_addr.s_addr = htonl("f1"); 
    servaddr.sin_port = htons(PORT); 
  
    // Binding newly created socket to given IP and verification 
    if ((bind(sockfd, (SA*)&servaddr, sizeof(servaddr))) != 0) { 
        printf("socket bind failed...\n"); 
        exit(0); 
    } 
    else
        printf("Socket successfully binded..\n"); 
  
    // Now server is ready to listen and verification 
    if ((listen(sockfd, 5)) != 0) { 
        printf("Listen failed...\n"); 
        exit(0); 
    } 
    else
        printf("Server listening..\n"); 
    len = sizeof(cli); 
  
    // Accept the data packet from client and verification 
    connfd = accept(sockfd, (SA*)&cli, &len); 
    if (connfd < 0) { 
        printf("server acccept failed...\n"); 
        exit(0); 
    } 
    else
        printf("server acccept the client...\n"); 
  
    // Function for chatting between client and server 
    func(connfd); 
  
    // After chatting close the socket 
    close(sockfd); 
} 

client.c

#include <netdb.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/socket.h> 
#define MAX 80 
#define PORT 8080
#define SA struct sockaddr 
void func(int sockfd) 
{ 
    char buff[MAX]; 
    int n; 
    for (;;) { 
        bzero(buff, sizeof(buff)); 
        printf("Enter the string : "); 
        n = 0; 
        while ((buff[n++] = getchar()) != '\n') 
            ; 
        write(sockfd, buff, sizeof(buff)); 
        bzero(buff, sizeof(buff)); 
        read(sockfd, buff, sizeof(buff)); 
        printf("From Server : %s", buff); 
        if ((strncmp(buff, "exit", 4)) == 0) { 
            printf("Client Exit...\n"); 
            break; 
        } 
    } 
} 

int main() 
{ 
    int sockfd, connfd; 
    struct sockaddr_in servaddr, cli; 

    // socket create and varification 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd == -1) { 
        printf("socket creation failed...\n"); 
        exit(0); 
    } 
    else
        printf("Socket successfully created..\n"); 
    bzero(&servaddr, sizeof(servaddr)); 

    // assign IP, PORT 
    servaddr.sin_family = AF_INET; 
//  servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    servaddr.sin_addr.s_addr = inet_addr("f2"); 
    servaddr.sin_port = htons(PORT); 

    // connect the client socket to server socket 
    if (connect(sockfd, (SA*)&servaddr, sizeof(servaddr)) != 0) { 
        printf("connection with the server failed...\n"); 
        exit(0); 
    } 
    else
        printf("connected to the server..\n"); 

    // function for chat 
    func(sockfd); 

    // close the socket 
    close(sockfd); 
} 

Upvotes: 0

Views: 5435

Answers (1)

Rafał Leszko
Rafał Leszko

Reputation: 5531

If you want to connect one Pod to another, you can use their internal Pod IPs (10.233.90.120, 10.233.90.117) or their Pod names f1, f2 (which should be automatically DNS resolved to their internal Pod IPs). You should not have any issues with that. And you don't need any service for that. If they cannot connect, please add the logs and the code they run.

If you want to connect to the Pods from outside the Kubernetes cluster, then you need to expose them with:

  • NodePort/LoadBalancer service OR
  • Kubectl Port Forward

You should always be able to establish a TCP Socket connection.

Upvotes: 1

Related Questions