--- --- * TOC {:toc} Services map a port on each cluster node to ports on one or more pods. The mapping uses a `selector` key:value pair in the service, and the `labels` property of pods. Any pods whose labels match the service selector are made accessible through the service's port. For more information, see the [Services Overview](/docs/user-guide/services/). ## Create a service Services are created by passing a configuration file to the `kubectl create` command: ```shell $ kubectl create -f FILE ``` Where: * `-f FILE` or `--filename FILE` is a relative path to a [service configuration file](#service-configuration-file) in either JSON or YAML format. A successful service create request returns the service name. You can use a [sample file](#sample_files) below to try a create request. ### Service configuration file When creating a service, you must point to a service configuration file as the value of the `-f` flag. The configuration file can be formatted as YAML or as JSON, and supports the following fields: ```json { "kind": "Service", "apiVersion": "v1", "metadata": { "name": string }, "spec": { "ports": [{ "port": int, "targetPort": int }], "selector": { string: string }, "type": "LoadBalancer" } } ``` Required fields are: * `kind`: Always `Service`. * `apiVersion`: Currently `v1`. * `metadata`: Contains: * `name`: The name to give to this service. * `spec`: Contains: * `ports`: The ports to map. `port` is the service port to expose on the cluster IP. `targetPort` is the port to target on the pods that are part of this service. * `selector`: The label key:value pair that defines the pods to target. * `type`: Optional. If the type is `LoadBalancer`, sets up a [network load balancer](/docs/user-guide/load-balancer/) for your service. This provides an externally-accessible IP address that sends traffic to the correct port on your cluster nodes. For the full `service` schema see the [Kubernetes api reference](/docs/api-reference/v1/definitions/#_v1_service). ### Sample files The following service configuration files assume that you have a set of pods that expose port 9376 and carry the label `app=example`. Both files create a new service named `myapp` which resolves to TCP port 9376 on any pod with the `app=example` label. The difference in the files is in how the service is accessed. The first file does not create an external load balancer; the service can be accessed through port 8765 on any of the nodes' IP addresses. {% capture tabspec %}servicesample JSON,json,service-sample.json,/docs/user-guide/services/service-sample.json YAML,yaml,service-sample.yaml,/docs/user-guide/services/service-sample.yaml{% endcapture %} {% include tabs.html %} The second file uses [network load balancing](/docs/user-guide/load-balancer/) to create a single IP address that spreads traffic to all of the nodes in your cluster. This option is specified with the `"type": "LoadBalancer"` property. {% capture tabspec %}loadbalancesample JSON,json,load-balancer-sample.json,/docs/user-guide/services/load-balancer-sample.json YAML,yaml,load-balancer-sample.yaml,/docs/user-guide/services/load-balancer-sample.yaml{% endcapture %} {% include tabs.html %} To access the service, a client connects to the external IP address, which forwards to port 8765 on a node in the cluster, which in turn accesses port 9376 on the pod. See the [Service configuration file](#service-configuration-file) section of this doc for directions on finding the external IP address. ## View a service To list all services on a cluster, use the `kubectl get` command: ```shell $ kubectl get services ``` A successful get request returns all services that exist on the specified cluster: ```shell NAME LABELS SELECTOR IP PORT myapp app=MyApp 10.123.255.83 8765/TCP ``` To return information about a specific service, use the `kubectl describe` command: ```shell $ kubectl describe service NAME ``` Details about the specific service are returned: ```conf Name: myapp Labels: Selector: app=MyApp IP: 10.123.255.83 Port: 8765/TCP NodePort: 31474/TCP Endpoints: Session Affinity: None No events. ``` To return information about a service when event information is not required, substitute `get` for `describe`. ## Delete a service To delete a service, use the `kubectl delete` command: ```shell $ kubectl delete service NAME ``` A successful delete request returns the deleted service's name.