Set up DNS Proxy
DNS Proxy is a feature for providing the following capabilities:
- Propagating DNS entries of
Services
across clusters in a multi-cluster setup . - Populating DNS entries for
ServiceEntry
.
Kubernetes provides DNS resolution only for Services
in the local cluster.
When you need to provide name resolution for Services
in a remote clusters or
use an internal-only hostname with ServiceEntry
without having an additional
internal-only DNS server, DNS Proxy provides a way to resolve DNS names for such
cases.
Configuring DNS Proxy
Cluster wide configuration
To configure DNS proxy in the cluster, add ISTIO_META_DNS_CAPTURE
proxy
metadata to the ConfigMap
for MeshConfig
. The name of the ConfigMap
has a format
of istio-<revision_name>
. For the details of revision, refer to the overview
of the revision
apiVersion
:
v1
data
:
mesh
:
|-
...
defaultConfig:
proxyMetadata:
ISTIO_META_DNS_CAPTURE: "true"
...
kind
:
ConfigMap
metadata
:
name
:
istio-<revision_name>
namespace
:
istio-system
Per-proxy configuration
To configure DNS proxy for a proxy, add the ISTIO_META_DNS_CAPTURE
proxy metadata
annotation as follows:
kind
:
Deployment
metadata
:
name
:
app1
namespace
:
ns1
spec
:
...
template
:
metadata
:
annotations
:
proxy.istio.io/config
:
|
proxyMetadata:
ISTIO_META_DNS_CAPTURE: "true"
...
Verifying
Name resolution for Service
across clusters
After the multi-cluster setup
,
deploy a Service
only in one of the clusters to verify the cross-cluster name
resolution.
When you have the following example Service
ns1/svc1
,
you can find ClusterIP
in Service
.
$
kubectl
get
-n
ns1
svc1
kind:
Service
metadata:
name:
svc1
namespace:
ns1
spec:
...
ClusterIP:
210
.200.1.1
...
Then, when using curl
from the other
cluster to the Service
, it should show
the ClusterIP
as follows.
curl
-sS
-v
svc1.ns1.svc.cluster.local
*
Trying
210
.200.1.1:80...
Name resolution for ServiceEntry
Add a ServiceEntry
with a hostname not registered in your DNS.
To verify the name resolution the following example has explicit address 192.168.123.123
.
$
kubectl
apply
-f
-
<<EOF
apiVersion:
networking.istio.io/v1beta1
kind:
ServiceEntry
metadata:
name:
test-service-entry
spec:
addresses:
-
"192.168.123.123"
hosts:
-
not-existing-hostname.internal
ports:
-
name:
http
number:
80
protocol:
HTTP
EOF
Then, try DNS resolution in a Pod where DNS Proxy is enabled. For example, if
you run a curl
in the Pod, it should display the IP address as follows:
curl
-sS
-v
not-existing-hostname.internal
*
Trying
192
.168.123.123:80...