我在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。
答案 0 :(得分:1)
这是一个不错的write-up,可能与您的问题有关,也请通过Weaveworks检出this。
去年,在GitHub Kubernetes issue tracker上创建的问题基本上与集群中的各种DNS延迟/问题有关。
值得一提的是,尽管不是所有与DNS相关的问题的解决方案,但CoreDNS自TwoThings
版本以来就普遍可用,并且已经或将成为默认设置,因此将1.11
替换为默认DNS集群。
以下几个问题可能与您遇到的问题有关:
希望这可以帮助您前进。
答案 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");
}
}