SolrCloud Kubernetes 部署和连接

问题描述

我有一个基于 Marketplace Solr Kubernetes 部署的基于 Kubernetes 的 SolrCloud 部署。可以在 https://github.com/GoogleCloudPlatform/click-to-deploy/tree/master/k8s/solr 中找到实现的详细信息。

对于我的用例,我正在尝试使用 GitHub 操作来更新/创建 SolrCloud 集合:

  1. 如果集合不存在,则创建它
  2. 如果集合存在,则根据架构更改更新它

我正在运行以下服务:

# kubectl get services
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)             AGE
ilb-service            LoadBalancer   XXX            XXX           8983:30072/TCP      92d
kubernetes             ClusterIP      XXX            <none>        443/TCP             92d
solr-1-solr-exporter   ClusterIP      XXX            <none>        9983/TCP            92d
solr-1-solr-headless   ClusterIP      XXX            <none>        8983/TCP            92d
solr-1-solr-svc        ClusterIP      XXX            <none>        8983/TCP            92d
solr-1-zk-client       ClusterIP      XXX            <none>        2181/TCP            92d
solr-1-zk-headless     ClusterIP      None           <none>        2888/TCP,3888/TCP   92d

对于本地开发,我已经像这样对 solr-1-zk-client 进行了端口转发:

kubectl port-forward \                                                                                                                                          
        svc/solr-1-zk-client \
        --namespace default 2181

我正在尝试使用以下脚本来测试是否可以添加文档:

import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.solr.client.solrj.solrClient;
import org.apache.solr.client.solrj.solrQuery;
import org.apache.solr.client.solrj.solrserverException;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.solr.client.solrj.impl.LBHttpSolrClient;
import org.apache.solr.client.solrj.request.QueryRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.solrDocument;
import org.apache.solr.common.solrInputDocument;
import picocli.CommandLine;

import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Optional;

@CommandLine.Command(name = "SolrManager",description = "Creates a solr collection using a provided config.",mixinStandardHelpOptions = true)
public class SolrManager implements Runnable{
    private static final Logger LOG = LogManager.getLogger(SolrManager.class);

    @CommandLine.Option(names = { "-z","--zkHost"},paramLabel = "ZKHOST",description = "zkHost to connect to")
    String zkHost;

    @CommandLine.Option(names = { "-DzkACLProvider" },paramLabel = "zkACLProvider",required = true)
    String DzkACLProvider;

    @CommandLine.Option(names = { "-DzkCredentialsProvider" },paramLabel = "zkCredentialsProvider",required = true)
    String DzkCredentialsProvider;

    @CommandLine.Option(names = { "-DzkDigestUsername" },paramLabel = "zkDigestUsername",required = true)
    String DzkDigestUsername;

    @CommandLine.Option(names = { "-DzkDigestPassword" },paramLabel = "zkDigestPassword",required = true)
    String DzkDigestPassword;

    @CommandLine.Option(names = { "-DzkDigestReadonlyUsername" },paramLabel = "zkDigestReadonlyUsername",required = true)
    String DzkDigestReadonlyUsername;

    @CommandLine.Option(names = { "-DzkDigestReadonlyPassword" },paramLabel = "zkDigestReadonlyPassword",required = true)
    String DzkDigestReadonlyPassword;


    public static void main(String... args) {
        CommandLine.run(new SolrManager(),System.err,args);
    }

    @Override
    public void run() {
        System.setProperty("zkACLProvider",DzkACLProvider);
        System.setProperty("zkCredentialsProvider",DzkCredentialsProvider);
        System.setProperty("zkDigestUsername",DzkDigestUsername);
        System.setProperty("zkDigestPassword",DzkDigestPassword);
        System.setProperty("zkDigestReadonlyUsername",DzkDigestReadonlyUsername);
        System.setProperty("zkDigestReadonlyPassword",DzkDigestReadonlyPassword);
        System.setProperty("basicauth",Dbasicauth);

        LOG.debug("Connecting to Solr cluster: " + zkHost);
        CloudSolrClient client = new CloudSolrClient.Builder(Collections.singletonList(zkHost),Optional.empty()).build();
        client.setDefaultCollection("test");
        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("id","1234");
        doc.addField("content","A lovely summer holiday");

        try {
            client.add(doc);
            client.commit();
        } catch (SolrserverException e) {
            e.printstacktrace();
        } catch (IOException e) {
            e.printstacktrace();
        }

        try {
            client.close();
        } catch (IOException e) {
            e.printstacktrace();
        }
    }
}

我希望这会起作用,但出现以下异常:

Exception in thread "main" picocli.CommandLine$ExecutionException: Error while running command (SolrManager@53fdffa1): org.apache.solr.client.solrj.impl.CloudSolrClient$RouteException: IOException occurred when talking to server at: http://solr-1-solr-0.solr-1-solr-headless.default:8983/solr/test_shard1_replica_n1
    at picocli.CommandLine.executeUserObject(CommandLine.java:1948)
    at picocli.CommandLine.access$1300(CommandLine.java:145)
    at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2352)
    at picocli.CommandLine$RunLast.handle(CommandLine.java:2346)
    at picocli.CommandLine$RunLast.handle(CommandLine.java:2311)
    at picocli.CommandLine$AbstractParseResultHandler.handleParseResult(CommandLine.java:2172)
    at picocli.CommandLine.parseWithHandlers(CommandLine.java:2550)
    at picocli.CommandLine.run(CommandLine.java:3008)
    at picocli.CommandLine.run(CommandLine.java:2959)
    at SolrManager.main(SolrManager.java:62)
Caused by: org.apache.solr.client.solrj.impl.CloudSolrClient$RouteException: IOException occurred when talking to server at: http://solr-1-solr-0.solr-1-solr-headless.default:8983/solr/test_shard1_replica_n1
    at org.apache.solr.client.solrj.impl.CloudSolrClient.getRouteException(CloudSolrClient.java:125)
    at org.apache.solr.client.solrj.impl.CloudSolrClient.getRouteException(CloudSolrClient.java:46)
    at org.apache.solr.client.solrj.impl.BaseCloudSolrClient.directUpdate(BaseCloudSolrClient.java:581)
    at org.apache.solr.client.solrj.impl.BaseCloudSolrClient.sendRequest(BaseCloudSolrClient.java:1076)
    at org.apache.solr.client.solrj.impl.BaseCloudSolrClient.requestWithRetryOnStaleState(BaseCloudSolrClient.java:934)
    at org.apache.solr.client.solrj.impl.BaseCloudSolrClient.request(BaseCloudSolrClient.java:866)
    at org.apache.solr.client.solrj.solrRequest.process(SolrRequest.java:214)
    at org.apache.solr.client.solrj.solrClient.add(SolrClient.java:177)
    at org.apache.solr.client.solrj.solrClient.add(SolrClient.java:138)
    at org.apache.solr.client.solrj.solrClient.add(SolrClient.java:156)
    at SolrManager.run(SolrManager.java:83)
    at picocli.CommandLine.executeUserObject(CommandLine.java:1939)
    ... 9 more
Caused by: org.apache.solr.client.solrj.solrserverException: IOException occurred when talking to server at: http://solr-1-solr-0.solr-1-solr-headless.default:8983/solr/test_shard1_replica_n1
    at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:695)
    at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:266)
    at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:248)
    at org.apache.solr.client.solrj.impl.LBSolrClient.doRequest(LBSolrClient.java:369)
    at org.apache.solr.client.solrj.impl.LBSolrClient.request(LBSolrClient.java:297)
    at org.apache.solr.client.solrj.impl.BaseCloudSolrClient.lambda$directUpdate$0(BaseCloudSolrClient.java:555)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.apache.solr.common.util.ExecutorUtil$MDCAwareThreadPoolExecutor.lambda$execute$0(ExecutorUtil.java:218)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.net.UnkNownHostException: solr-1-solr-0.solr-1-solr-headless.default: Name or service not kNown
    at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:929)
    at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1515)
    at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:848)
    at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505)
    at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364)
    at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298)
    at org.apache.http.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45)
    at org.apache.http.impl.conn.DefaultHttpClientConnectionoperator.connect(DefaultHttpClientConnectionoperator.java:112)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376)
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
    at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:571)
    ... 10 more

我预计所有请求都会发送到我通过端口转发的 Zookeeper 服务,但似乎 CloudSolrClient 客户端正在尝试从我的本地开发机器调用 http://solr-1-solr-0.solr-1-solr-headless.default:8983/solr/test_shard1_replica_n1 服务器。

我该如何解决这个问题?我是 kubernetes 的新手。我是否必须将我的 Java 应用程序包装在 Docker 容器中并从同一个集群执行我的代码,以便它可以与那里的其他服务通信?我真的很感激有关如何在 Kubernetes 部署中正确执行此操作的一些帮助。谢谢!

解决方法

您还需要转发 8983。 solr 客户端不会 100% 通过 Zookeeper。