How to redirect traffic from .svc.cluster.local to .svc.k8s.my-domain.com in Kubernetes?

9/16/2021

My cluster has its own domain name k8s.my-domain.com.

Originally when I deploy Dgraph, I met issue that their pods cannot talk to each other by dgraph-service.dgraph-namespace.svc.cluster.local.

If they talk to each other by

  • dgraph-service.dgraph-namespace
  • dgraph-service.dgraph-namespace.svc.k8s.my-domain.com

it will work.

I fixed by removing .svc.cluster.local part from Dgraph yaml and created the pull request at https://github.com/dgraph-io/dgraph/pull/7976.

Today, when I deploy Yugabyte, I met the same issue again. I created a ticket at https://github.com/yugabyte/yugabyte-operator/issues/38 and hopefully Yugabyte team can fix it.

However, I am not sure if this approach is good now. I hope I can do something on my side.

Is there a way to redirect from .svc.cluster.local to .svc.k8s.my-domain.com?
Maybe in CoreDNS so that I don't need to change original Dgraph or Yugabyte YAML file? Thanks!


UPDATE 1:

Based on @CodeWizard suggestion, and because I got a warning from my IDE:

enter image description here

So I tried both versions:

apiVersion: v1
kind: Service
metadata:
  name: external-service
spec:
  type: ExternalName
  externalName: k8s.my-domain.com

and

apiVersion: v1
kind: Service
metadata:
  name: external-service
spec:
  type: ExternalName
  externalName: cluster.local

After applying this yaml file.

However, I still got same error deploying Yugabyte to my cluster.

-- Hongbo Miao
coredns
dns
kubernetes
yaml
yugabyte-db

1 Answer

9/16/2021

You can use ExternalName in your service.

kind: "Service"
apiVersion: "v1"
metadata:
  name: "external-mysql-service"
spec:
  type: ExternalName
  externalName: example.domain.name
selector: {} # The selector field to leave blank.

Using an External Domain Name

  • Using external domain names makes it easier to manage an external service because you do not have to worry about the external service’s IP addresses changing.

  • You can use an ExternalName service to direct traffic to an external service.

  • Using an external domain name service tells the system that the DNS name in the externalName field (example.domain.name in the previous example) is the location of the resource that backs the service.
  • When a DNS request is made against the Kubernetes DNS server, it returns the externalName in a CNAME record telling the client to look up the returned name to get the IP address.
-- CodeWizard
Source: StackOverflow