Gabriel Petrovay
Gabriel Petrovay

Reputation: 21934

Kubernetes Service does not get its external IP address

When I build a Kubernetes service in two steps (1. replication controller; 2. expose the replication controller) my exposed service gets an external IP address:

initially:
    NAME         CLUSTER_IP     EXTERNAL_IP     PORT(S)   SELECTOR    AGE
    app-1        10.67.241.95                   80/TCP    app=app-1    7s

and after about 30s:

NAME         CLUSTER_IP     EXTERNAL_IP     PORT(S)   SELECTOR    AGE
app-1        10.67.241.95   104.155.93.79   80/TCP    app=app-1   35s

But when I do it in one step providing the Service and the ReplicationController to the kubectl create -f dir_with_2_files the service gets created but it does not get and External IP:

NAME         CLUSTER_IP      EXTERNAL_IP   PORT(S)   SELECTOR    AGE
app-1        10.67.251.171   <none>        80/TCP    app=app-1   2m

The <none> under External IP worries me.

For the Service I use the JSON file:

{                                                                                                                 
    "apiVersion": "v1",                                                                                           
    "kind": "Service",                                                                                            
    "metadata": {                                                                                                 
        "name": "app-1"                                                                                           
    },                                                                                                            
    "spec": {                                                                                                     
        "selector": {
            "app": "app-1"
        },
        "ports": [                                                                                                
            {                                                                                                     
                "port": 80,                                                                                       
                "targetPort": 8000                                                                                
            }                                                                                                     
        ]
    }                                                                                                             
}

and for the ReplicationController:

{
    "apiVersion": "v1",
    "kind": "ReplicationController",
    "metadata": {
        "name": "app-1"
    },
    "spec": {
        "replicas": 1,
        "template": {
            "metadata": {
                "labels": {
                    "app": "app-1"
                }
            },
            "spec": {
                "containers": [
                    {
                        "name": "service",
                        "image": "gcr.io/sigma-cairn-99810/service:latest",
                        "ports": [
                            {
                                "containerPort": 8000
                            }
                        ]
                    }
                ]
            }
        }
    }
}

and to expose the Service manually I use the command:

kubectl expose rc app-1 --port 80 --target-port=8000 --type="LoadBalancer"

Upvotes: 1

Views: 3443

Answers (1)

Prashanth B
Prashanth B

Reputation: 5123

If you don't specify the type of a Service it defaults to ClusterIP. If you want the equivalent of expose you must:

  1. Make sure your Service selects pods from the RC via matching label selectors
  2. Make the Service type=LoadBalancer

Upvotes: 3

Related Questions