Search code examples
socketskubernetesservicetcp

Verify if service is connecting to pod?


I created a server pod using the following yaml file :

apiVersion: v1
kind: Pod
 metadata:
   name: server
   labels:
     app: server
 spec:
   containers:
     - name: server
       imagePullPolicy: Never
       image: localhost:5000/server
       command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
       ports:
         - containerPort: 80

I created a service for this pod using following yaml file :

apiVersion: v1
kind: Service
metadata:
        name: server-svc
        labels:
                app: server
spec:
        ports:
        - port: 80
          protocol: TCP
        selector:
                app: server

I created a client pod using the following yaml file in the same cluster as server pod:

 apiVersion: v1
 kind: Pod
 metadata:
   name: client
   labels:
     app: client
 spec:
   containers:
     - name: client
       imagePullPolicy: Never
       image: localhost.localdomain:5000/client
       command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
       ports:
         - containerPort: 80

I want to verify if connecting to this server-svc service is enabling connecting to server pod.

For the I exec into client pod and server pod and tried to establish a tcp socket connection between the two using the following files.

server.c inside the server pod.

#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_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 inside the client pod :

#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("10.233.90.193"); 
    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); 
} 

The problem is when I used the server pod's IP address in client.c it estabilished a TCP connection. But when I used server-svc Cluster IP address it could not connect.

I am doubtful if this service is even connecting to the server pod. Is there any way to verify that? Also if it is connecting how can I estabilish a TCP connection using the same?


Solution

  • Looks like your server is listening on port 8080, you have to set your service to port 8080 instead of 80 and then the service should be able to pass the traffic to the right place.