Kubernetes 集群频繁出现java.net.UnknownHostException

事故起因

流量高峰期微服务之间调用频繁出现java.net.UnknownHostException
关键字:
unknownhost、UnknownHost

排查思路

1、Kubernetes集群中出现的UnknownHost,第一时间假设的是Kubernetes的svc有问题,但是线上业务的svc是没有人去删除过,所以排除这个问题。
2、有没有可能是网络的问题,网络流量过大导致一些问题,后来查看了监控,也排除了网络不足的原因。
3、后查阅一些资料,了解是我们使用的底包镜像有问题,我们使用的是Alpine底包作为java的环境。

原因

Alpine Linux 使用了 musl,可能和其他 Linux 发行版使用的 glibc 实现会有所不同。在容器化中最可能遇到的是 DNS 问题,即 musl 实现的 DNS 服务不会使用 resolv.conf 文件中的 search 和 domain 两个配置,这对于一些通过 DNS 来进行服务发现的框架可能会遇到问题。[From InfoQ]
原文: InfoQ

解决方法

既然是底包的问题,我这里就替换底包,这里是我一个Dockerfile

FROM centos:centos7.4.1708
MAINTAINER xiaomai 728xxxx@qq.com

RUN rm -rf /etc/yum.repos.d/*.repo

# 最近去oracle下载的时候发现需要登录,就先下载下来
ADD jdk-8u192-linux-x64.tar.gz /usr/local/

RUN ln -s /usr/local/jdk1.8.0_192 /usr/local/java

# 这里使用阿里云的yum镜像仓库
COPY Centos-7.repo /etc/yum.repos.d/
COPY epel-7.repo /etc/yum.repos.d/
# 解决微信解码的问题
COPY local_policy.jar /usr/local/jdk1.8.0_192/jre/lib/security
COPY US_export_policy.jar /usr/local/jdk1.8.0_192/jre/lib/security


RUN yum makecache && \
yum install -y net-tools nmap-ncat telnet net-tools jq curl openssl wget openssl-devel kde-l10n-Chinese glibc-common && \
yum clean all && \
rm -rf /var/cache/yum && \
rm -rf /anaconda-post.log && \
localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
# 解决中文乱码的问题

ENV LC_ALL zh_CN.utf8
ENV JAVA_HOME /usr/local/java
ENV PATH $JAVA_HOME/bin:$PATH
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib

CMD ["java", "-version"]

JDK8 下载地址:
https://www.oracle.com/techne…
解码包下载地址:
local_policy.jar
US_export_policy.jar
https://www.oracle.com/techne…

意外发现: DNS丢包问题

在/var/log/messages中发现这么一个问题:

nf_conntrack: table full, dropping packet

原来Docker会调用nf_conntrack连接跟踪模块。Linux为每个经过内核网络栈的数据包,生成一个新的连接记录,当服务器处理的连接过多时,连接跟踪表被打满,服务器会丢弃新建的连接数据包。
注意:
内核大于4.20之后的内核版本nf_conntrack_ipv4更改为nf_conntrack

    原文作者:Fonzie
    原文地址: https://segmentfault.com/a/1190000019967715
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞