<p>I have recently followed the tutorial on how to use Kubernetes with Windows pods ( <a href="https://learn.microsoft.com/en-us/azure/container-service/kubernetes/container-service-kubernetes-windows-walkthrough" rel="nofollow noreferrer">https://learn.microsoft.com/en-us/azure/container-service/kubernetes/container-service-kubernetes-windows-walkthrough</a> ). I decided to extend the example to two services, one front calling the one in the back. Simplified:</p>

<p><a href="https://gist.github.com/sebug/f478f1cfd0a793e8d556c6001bbbe142" rel="nofollow noreferrer">https://gist.github.com/sebug/f478f1cfd0a793e8d556c6001bbbe142</a></p>

<p>But now when I connect to one of the front nodes:</p>

<pre><code>kubectl exec -it samplefront-2836659004-4m824 -- powershell
</code></pre>

<p>I can't ping the other service:</p>

<pre><code>PS C:\&gt; ping sample-back
Ping request could not find host sample-back. Please check the name and try again.
</code></pre>

<p>I heard that it may be because of the two network interfaces and the wrong DNS server being chosen, but I have not found a way to specify anything in the deployment.</p>

<pre><code>Windows IP Configuration


Ethernet adapter vEthernet (Container NIC 7baf5cc0):

Connection-specific DNS Suffix  . :
Link-local IPv6 Address . . . . . : fe80::f182:e2e7:7bce:ed60%33
IPv4 Address. . . . . . . . . . . : 10.244.0.211
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 10.244.0.1

Ethernet adapter vEthernet (Container NIC ae765bad):

Connection-specific DNS Suffix  . : 10jheu23yh0ujpey5vzw0q45qg.ax.internal.cloudapp.net
Link-local IPv6 Address . . . . . : fe80::c4dc:b785:9cd:2a7b%37
IPv4 Address. . . . . . . . . . . : 172.31.245.122
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Default Gateway . . . . . . . . . : 172.31.240.1
</code></pre>

<blockquote>
  <p>Can't resolve another service's hostname inside my Kubernetes.</p>
</blockquote>

<p>This is a by design behavior. Because the cluster IP does not exist.</p>

<p>In Kubernetes, all the services in a cluster are handled by <strong>kube-proxy</strong>. kube-proxy runs on every node in the cluster, and what it does it write <strong>iptables</strong> rules for each service (Linux node, same as windows). These iptables rules manage the traffic <strong>towards</strong> the service IPs. They don’t actually have any rules for ICMP, because it’s not needed.</p>

<p>But we can ping pod IP or pod's DNS.</p>

<p>For example, we can use this command to list pods IP addresses:</p>

<pre><code>root@k8s-master-9F42C511-0:~# kubectl get pods -o wide
NAME                               READY     STATUS    RESTARTS   AGE       IP           NODE
azure-vote-back-3048739398-8zx8b   1/1       Running   0          18m       10.244.1.2   k8s-agent-9f42c511-0
azure-vote-front-837696400-tglpn   1/1       Running   0          18m       10.244.1.3   k8s-agent-9f42c511-0
</code></pre>

<p>Then we use one pod to ping those IP addresses:</p>

<pre><code>root@k8s-master-9F42C511-0:~# kubectl exec -it azure-vote-front-837696400-tglpn -- /bin/bash
root@azure-vote-front-837696400-tglpn:/app# ping 10.244.1.3
PING 10.244.1.3 (10.244.1.3): 56 data bytes
64 bytes from 10.244.1.3: icmp_seq=0 ttl=64 time=0.063 ms
64 bytes from 10.244.1.3: icmp_seq=1 ttl=64 time=0.052 ms
^C--- 10.244.1.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.052/0.057/0.063/0.000 ms
root@azure-vote-front-837696400-tglpn:/app# ping 10.244.1.4
PING 10.244.1.4 (10.244.1.4): 56 data bytes
64 bytes from 10.244.1.4: icmp_seq=0 ttl=64 time=0.102 ms
64 bytes from 10.244.1.4: icmp_seq=1 ttl=64 time=0.098 ms
^C--- 10.244.1.4 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.098/0.100/0.102/0.000 ms
</code></pre>

<p>Also, we can ping pod's A record. In kubernetes, pod's A record in the form of <code>pod-ip-address.my-namespace.pod.cluster.local</code>.</p>

<p>For example, a pod with IP <code>1.2.3.4</code> in the namespace <code>default</code> with a DNS name of <code>cluster.local</code> would have an entry: <code>1-2-3-4.default.pod.cluster.local</code></p>

<p>In my lab, my pod's A record like this:</p>

<pre><code>root@k8s-master-9F42C511-0:~# kubectl exec -it azure-vote-front-837696400-tglpn -- /bin/bash
root@azure-vote-front-837696400-tglpn:/app# ping 10-244-1-2.default.pod.cluster.local                                                                                                              
PING 10-244-1-2.default.pod.cluster.local (10.244.1.2): 56 data bytes
64 bytes from 10.244.1.2: icmp_seq=0 ttl=64 time=0.103 ms
64 bytes from 10.244.1.2: icmp_seq=1 ttl=64 time=0.087 ms
64 bytes from 10.244.1.2: icmp_seq=2 ttl=64 time=0.096 ms
^C--- 10-244-1-2.default.pod.cluster.local ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.087/0.095/0.103/0.000 ms
</code></pre>

<p>So, we <strong>can't</strong> ping cluster IP address, but we can use URL to test it. We can ping pod's IP address, and A record.</p>

<hr>

<p><strong>Update</strong>:<br>
Sorry for my mistake, the k8s A record rules work for Linux Agent, but does not work for windows agent.</p>

<p><a href="https://i.stack.imgur.com/1spI8.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/1spI8.png" alt="enter image description here"></a>
More information about windows server containers, please refer to this <a href="https://kubernetes.io/docs/getting-started-guides/windows/" rel="nofollow noreferrer">article</a>.</p>
