Service Directory for GKE overview

Service Directory for Google Kubernetes Engine (GKE) provides a single view of all services across all of your GKE deployments and beyond. You can add various types of GKE services, annotate them, and then see those services in Service Directory.

Service Directory for GKE offers the following features:

  • It lets you discover services through gRPC and HTTP, and resolve services over DNS using Service Directory DNS zones. The Service Directory and Cloud DNS integration lets you configure a Service Directory DNS zone.
  • Service Directory registers services outside of GKE, allowing GKE and non-GKE services to easily discover each other.
  • Service Directory enforces IAM permission and VPC Service Controls checks to ensure proper security and privacy of customer data.

To learn about how to configure Service Directory to automatically register your GKE services with Service Directory, see Configuring Service Directory for GKE.

Service mapping

When you register a service with Service Directory, a service is created in the Connect project using the name of the GKE namespace and region of the GKE cluster. The following table describes how the properties on the GKE service are mapped to the properties on the created service in Service Directory for all GKE service types.

Top level properties

Service Directory property GKE property
Project Connect project
Region Region of the cluster
Namespace GKE Namespace

LoadBalancer service type

The following example shows how a GKE LoadBalancer service is mapped to Service Directory. The Service Directory service exists in a namespace with the same name as the GKE namespace in the Connect project and region of the GKE cluster.

Service Directory property GKE property
Service name Service name
Endpoint name Auto-generated by Service Directory Controller
Endpoint IP address LoadBalancer ingress
Endpoint port LoadBalancer service port
Endpoint network VPC network of the cluster

The following is an example of a GKE LoadBalancer service:

apiVersion: v1
kind: Service
metadata:
  name: hello-app
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
  labels:
    app: hello-app
    sd-import: "true"
spec:
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
  selector:
    app: hello-app
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 10.140.0.5

The following is an example of a Service Directory service:

service:
  endpoints:
  - address: 10.140.0.5
    metadata:
       cloud.google.com/load-balancer-type: "Internal"
    name: projects/my-project/locations/us-central1/namespaces/default/services/hello-app/endpoints/gke-hello-cluster-12345
    port: 80
    network: projects/my-project/locations/global/networks/default
  name: projects/my-project/locations/us-central1/namespaces/default/services/hello-app

NodePort service type

The following example shows how a GKE NodePort Service is mapped to Service Directory. The Service Directory service exists in a namespace with the same name as the GKE namespace in the project of the hub and region of the GKE cluster.

Service Directory property GKE property
Service name Service name
Endpoint name Auto-generated by Service Directory Controller
Endpoint IP address Node internal IP address for each node that runs a pod for the service
Endpoint port Static node port
Endpoint network VPC network of the cluster

The following is an example of a GKE NodePort service:

apiVersion: v1
kind: Service
metadata:
  name: hello-app
  annotations:
    key1: "value1"
spec:
  ports:
  - nodePort: 30007
    port: 80
    targetPort: 8080
    protocol: TCP
  selector:
    app: hello-app
  type: NodePort
  

The following is an example of GKE nodes:

apiVersion: v1
items:
- apiVersion: v1
  kind: Node
  metadata:
    name: gke-hello-cluster-default-pool-a40cbab6-d2rr
  status:
    addresses:
    - address: 10.142.0.27
      type: InternalIP
    - address: 34.73.248.170
- apiVersion: v1
  kind: Node
  metadata:
    name: gke-hello-cluster-default-pool-a40cbab6-kb38
  status:
    addresses:
    - address: 10.142.0.29
      type: InternalIP
    - address: 35.196.219.215
      type: ExternalIP
- apiVersion: v1
  kind: Node
  metadata:
    name: gke-hello-cluster-default-pool-a40cbab6-x34q
  status:
    addresses:
    - address: 10.142.0.28
      type: InternalIP
    - address: 34.75.202.26
      type: ExternalIP
    

The following is an example of a Service Directory service:

service:
  endpoints:
  - address: 10.142.0.27
    metadata:
      key1: value1
    name: projects/my-project/locations/us-central1/namespaces/default/services/hello-app/endpoints/gke-hello-cluster-12345
    port: 30007
    network: projects/my-project/locations/global/networks/default
  - address: 10.142.0.28
    metadata:
      key1: value1
    name: projects/my-project/locations/us-central1/namespaces/default/services/hello-app/endpoints/gke-hello-cluster-23456
    port: 30007
    network: projects/my-project/locations/global/networks/default
  - address: 10.142.0.29
    metadata:
      key1: value1
    name: projects/my-project/locations/us-central1/namespaces/default/services/hello-app/endpoints/gke-hello-cluster-34567
    port: 30007
    network: projects/my-project/locations/global/networks/default
  name: projects/my-project/locations/us-central1/namespaces/default/services/hello-app
  

ClusterIP service

The following example shows how a GKE ClusterIP service is mapped to Service Directory. The Service Directory service exists in a namespace with the same name as the GKE namespace in the Connect project and region of the GKE cluster.

Service Directory property GKE property
Service name Service name
Endpoint name Auto-generated by Service Directory Controller
Endpoint IP address ClusterIP
Endpoint port Service port
Endpoint network VPC network of the cluster

The following is an example of a GKE ClusterIP service:

apiVersion: v1
kind: Service
metadata:
  name: hello-app
  annotations:
    key1: "value1"
  labels:
    app: hello-app
    sd-import: "true"
spec:
  clusterIP: 10.15.254.17
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
  selector:
    app: hello-app
  type: ClusterIP
  

The following is an example of a Service Directory service:

service:
  endpoints:
  - address: 10.15.254.17
    metadata:
      key1: value1
    name: projects/my-project/locations/us-central1/namespaces/default/services/hello-app/endpoints/gke-hello-cluster-12345
    port: 80
    network: projects/my-project/locations/global/networks/default
  name: projects/my-project/locations/us-central1/namespaces/default/services/hello-app
  

Headless (ClusterIP is None)

The following example shows how a GKE Headless service is mapped to Service Directory. The Service Directory service exists in a namespace with the same name as the GKE namespace in the Connect project and region of the GKE cluster.

Service Directory property GKE property
Service name Service name
Endpoint name Auto-generated by Service Directory Controller
Endpoint IP address Endpoint IP of each endpoint
Endpoint port Endpoint port of each endpoint
Endpoint network VPC network of the cluster

The following is an example of GKE Headless service:

apiVersion: v1
kind: Service
metadata:
  name: hello-app
  annotations:
    key1: "value1"
  labels:
    app: hello-app
    sd-import: "true"
spec:
  clusterIP: None
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
  selector:
    app: hello-app
  type: ClusterIP
  

The following is an example of GKE endpoints:

apiVersion: v1
kind: Endpoints
metadata:
  name: hello-app
  labels:
    app: hello-app
subsets:
- addresses:
  - ip: 10.12.0.9
    nodeName: gke-hello-cluster-default-pool-a40cbab6-d2rr
    targetRef:
      kind: Pod
      name: hello-app-748b85645c-l7fhc
  - ip: 10.12.1.9
    nodeName: gke-hello-cluster-default-pool-a40cbab6-kb38
    targetRef:
      kind: Pod
      name: hello-app-748b85645c-hkf89
  - ip: 10.12.2.9
    nodeName: gke-hello-cluster-default-pool-a40cbab6-x34q
    targetRef:
      kind: Pod
      name: hello-app-748b85645c-zpfr7
  ports:
  - port: 8080
    protocol: TCP
    

The following is an example of a Service Directory service:

service:
  endpoints:
  - address: 10.12.0.9
    metadata:
      key1: value1
    name: projects/my-project/locations/us-central1/namespaces/default/services/hello-app/endpoints/gke-hello-cluster-12345
    port: 8080
    network: projects/my-project/locations/global/networks/default
  - address: 10.12.1.9
    metadata:
      key1: value1
    name: projects/my-project/locations/us-central1/namespaces/default/services/hello-app/endpoints/gke-hello-cluster-23456
    port: 8080
    network: projects/my-project/locations/global/networks/default
  - address: 10.12.2.9
    metadata:
      key1: value1
    name: projects/my-project/locations/us-central1/namespaces/default/services/hello-app/endpoints/gke-hello-cluster-34567
    port: 8080
    network: projects/my-project/locations/global/networks/default
  name: projects/my-project/locations/us-central1/namespaces/default/services/hello-app
  

What's next