kubernetes中的服务偶尔出现Unknownhost异常

时间:2018-08-13 07:44:19

标签: kubernetes kops kube-dns

我在AWS上有一个kubernetes集群设置。当我从Pod调用elasticsearch-client.default.svc.cluster.local时,偶尔会出现未知的主机异常。它必须与名称解析有关,因为直接单击服务IP可以正常工作。

注意:我已经启用了kube-dns自动缩放器。我手动尝试了将近6个kube-dns吊舱。所以我不认为这是因为dns pod扩展。

当我将带有上游服务器值的kube-dns configMap设置为google名称服务器(8.8.8.8和8.8.4.4)时,我没有遇到问题。我认为这是由于AWS在route53上进行的API速率限制。但是我不知道为什么名称解析请求会到达AWS NS。

2 个答案:

答案 0 :(得分:1)

这是一个不错的write-up,可能与您的问题有关,也请通过Weaveworks检出this

去年,在GitHub Kubernetes issue tracker上创建的问题基本上与集群中的各种DNS延迟/问题有关。

值得一提的是,尽管不是所有与DNS相关的问题的解决方案,但CoreDNS自TwoThings版本以来就普遍可用,并且已经或将成为默认设置,因此将1.11替换为默认DNS集群。

以下几个问题可能与您遇到的问题有关:

#47142

#45976

#56903

希望这可以帮助您前进。

答案 1 :(得分:0)

我的自定义Kubernetes集群以及MySQL和Solr也遇到了类似的问题。官方站点的教程建议的Kube DNS检查很好(https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/),我不得不对数据源和Solr客户端应用以下重试逻辑:

...
import org.apache.commons.dbcp.BasicDataSource;
...
public class CommunicationSafeDataSource extends BasicDataSource {
  private static final Logger LOGGER = LoggerFactory.getLogger(CommunicationSafeDataSource.class);

  @Override
  public Connection getConnection() throws SQLException {
    for (int i = 1; i <= 10; i++) {
      try {
        return super.getConnection();
      } catch (Exception e) {
        if ((e instanceof CommunicationsException) || (e.getCause() instanceof CommunicationsException)) {
          LOGGER.warn("Communication exception occurred, retry " + i);
          try {
            Thread.sleep(i * 1000);
          } catch (InterruptedException ie) {
            //
          }
        } else {
          throw e;
        }
      }
    }

    throw new IllegalStateException("Cannot get connection");
  }
}

...
import org.apache.solr.client.solrj.impl.HttpSolrClient;
...
public class CommunicationSafeSolrClient extends HttpSolrClient {

  private static final Logger LOGGER = LoggerFactory.getLogger(CommunicationSafeSolrClient.class);

  protected CommunicationSafeSolrClient(Builder builder) {
    super(builder);
  }

  @Override
  protected NamedList<Object> executeMethod(HttpRequestBase method, ResponseParser processor, boolean isV2Api)
      throws SolrServerException {
    for (int i = 1; i <= 10; i++) {
      try {
        return super.executeMethod(method, processor, isV2Api);
      } catch (Exception e) {
        if ((e instanceof UnknownHostException) || (e.getCause() instanceof UnknownHostException)
        || (e instanceof ConnectException) || (e.getCause() instanceof ConnectException)) {
          LOGGER.warn("Communication exception occurred, retry " + i);
          try {
            Thread.sleep(i * 1000);
          } catch (InterruptedException ie) {
            //
          }
        } else {
          throw e;
        }
      }
    }

    throw new IllegalStateException("Cannot execute method");
  }
}