JDK dns not respect system dns setting in kubernetes

5/15/2020

I custom the k8s core dns file to resolve a custom name.which works fine in pods checked by ping xx. But it not resolved in java appliation(jdk14). Nameserver is ok.

/ # cat /etc/resolv.conf
nameserver 10.96.0.10
search xxxx-5-production.svc.cluster.local svc.cluster.local cluster.local

/ # ping xx
PING xx (192.168.65.2): 56 data bytes
64 bytes from 192.168.65.2: seq=0 ttl=37 time=0.787 ms

Edit: I use coredns rewrite host name xx to host.docker.internal,this is change to coredns config

    rewrite name regex (^|(?:\S*\.)*)xx\.?$ {1}host.docker.internal

I add some debug code to the entry:

  static void runCommand(String... commands)  {
        try {
            ProcessBuilder cat = new ProcessBuilder(commands);
            Process start = cat.start();
            start.waitFor();
            String output = new BufferedReader(new InputStreamReader(start.getInputStream())).lines().collect(Collectors.joining());
            String err = new BufferedReader(new InputStreamReader(start.getErrorStream())).lines().collect(Collectors.joining());
            log.info("\n{}: stout {}", Arrays.toString(commands),output);
            log.info("\n{}: sterr{}", Arrays.toString(commands),err);
        } catch (IOException | InterruptedException e) {
            log.error(e.getClass().getCanonicalName(), e);
        }
    }


    public static void main(String[] args) {
        try {
            InetAddress xx = Inet4Address.getByName("xx");
            log.info("{}: {}", "InetAddress xx", xx.getHostAddress());
        } catch (IOException e) {
            log.error(e.getClass().getCanonicalName(), e);
        }
        runCommand("cat", "/etc/resolv.conf");
        runCommand("ping", "xx","-c","1");
        runCommand("ping", "host.docker.internal","-c","1");
        runCommand("nslookup", "xx");
        runCommand("ifconfig");
        SpringApplication.run(FileServerApp.class, args);
    }

Here is output:

01:01:39.950 [main] ERROR com.j.file_server_app.FileServerApp - java.net.UnknownHostException
java.net.UnknownHostException: xx: Name or service not known
    at java.base/java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
    at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:932)
    at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1505)
    at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:851)
    at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1495)
    at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1354)
    at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1288)
    at java.base/java.net.InetAddress.getByName(InetAddress.java:1238)
    at com.j.file_server_app.FileServerApp.main(FileServerApp.java:43)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:51)
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52)
01:01:39.983 [main] INFO com.j.file_server_app.FileServerApp -
[cat, /etc/resolv.conf]: stout nameserver 10.96.0.10search default.svc.cluster.local svc.cluster.local cluster.localoptions ndots:5
01:01:39.985 [main] INFO com.j.file_server_app.FileServerApp -
[cat, /etc/resolv.conf]: sterr
01:01:39.991 [main] INFO com.j.file_server_app.FileServerApp -
[ping, xx, -c, 1]: stout
01:01:39.991 [main] INFO com.j.file_server_app.FileServerApp -
[ping, xx, -c, 1]: sterrping: unknown host
01:01:39.998 [main] INFO com.j.file_server_app.FileServerApp -
[ping, host.docker.internal, -c, 1]: stout PING host.docker.internal (192.168.65.2): 56 data bytes64 bytes from 192.168.65.2: icmp_seq=0 ttl=37 time=0.757 ms--- host.docker.internal ping statistics ---1 packets transmitted, 1 packets received, 0% packet lossround-trip min/avg/max/stddev = 0.757/0.757/0.757/0.000 ms
01:01:39.998 [main] INFO com.j.file_server_app.FileServerApp -
[ping, host.docker.internal, -c, 1]: sterr
01:01:40.045 [main] INFO com.j.file_server_app.FileServerApp -
[nslookup, xx]: stout Server:       10.96.0.10Address:  10.96.0.10#53Non-authoritative answer:Name: host.docker.internalAddress: 192.168.65.2** server can't find xx: NXDOMAIN
01:01:40.045 [main] INFO com.j.file_server_app.FileServerApp -
[nslookup, xx]: sterr
01:01:40.048 [main] INFO com.j.file_server_app.FileServerApp -
[ifconfig]: stout eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 10.1.3.14  netmask 255.255.0.0  broadcast 0.0.0.0        ether ce:71:60:9a:75:05  txqueuelen 0  (Ethernet)        RX packets 35  bytes 3776 (3.6 KiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 22  bytes 1650 (1.6 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536        inet 127.0.0.1  netmask 255.0.0.0        loop  txqueuelen 1000  (Local Loopback)        RX packets 1  bytes 29 (29.0 B)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 1  bytes 29 (29.0 B)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
01:01:40.048 [main] INFO com.j.file_server_app.FileServerApp -
[ifconfig]: sterr

Looks like coredns not working,but in the front end pod,ping is ok,this is front end Dockerfile

FROM library/nginx:stable-alpine
RUN mkdir /app
EXPOSE 80
ADD dist /app
COPY nginx.conf /etc/nginx/nginx.conf

Using docker inspect for fontend and backend container,both network setting are:

"NetworkSettings": {
    "Bridge": "",
    "SandboxID": "",
    "HairpinMode": false,
    "LinkLocalIPv6Address": "",
    "LinkLocalIPv6PrefixLen": 0,
    "Ports": {},
    "SandboxKey": "",
    "SecondaryIPAddresses": null,
    "SecondaryIPv6Addresses": null,
    "EndpointID": "",
    "Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "IPAddress": "",
    "IPPrefixLen": 0,
    "IPv6Gateway": "",
    "MacAddress": "",
    "Networks": {}
}

Both frontend and backend has service with type: LoadBalancer,now my question is why the name resolve behave different in this two pods?

-- zssng
java
kubernetes

0 Answers