2

私は、Google Kubernetes を使用して Apache Tomcat Docker コンテナに Web アーティファクトをデプロイする Java アプリケーションに取り組んでいます。Docker イメージとコンテナーの処理アクティビティを実行するためにhttps://github.com/spotify/docker-clientを使用し、 https://github.com/fabric8io/fabric8/tree/master/components/kubernetes-api を使用しています。 Kubernetes 関連の機能。

このアプリケーションでは、ユーザーがデプロイした Web アーティファクトをユーザーが削除できるようにする機能を追加しました。

Iを外すと、

  1. 必要な数のポッド レプリカを生成するために使用する Kubernetes レプリケーション コントローラーを削除します。

  2. レプリカ Pod を個別に削除します (Java API の対応するメソッドでレプリケーション コントローラーが削除されても、Pod は自動的に削除されないため)。

  3. 作成された対応するサービスを削除します

  4. 削除されたポッドに対応する Docker コンテナを削除します

  5. 最後に、デプロイに使用された Docker イメージを削除します

次のコードは、実装された削除機能を示しています。

public boolean remove(String tenant, String appName) throws WebArtifactHandlerException {
        String componentName = generateKubernetesComponentName(tenant, appName);
        final int singleImageIndex = 0;
        try {
            if (replicationControllerHandler.getReplicationController(componentName) != null) {
                String dockerImage = replicationControllerHandler.getReplicationController(componentName).getSpec()
                        .getTemplate().getSpec().getContainers().get(singleImageIndex).getImage();
                List<String> containerIds = containerHandler.getRunningContainerIdsByImage(dockerImage);
                replicationControllerHandler.deleteReplicationController(componentName);
                podHandler.deleteReplicaPods(tenant, appName);
                serviceHandler.deleteService(componentName);
                Thread.sleep(OPERATION_DELAY_IN_MILLISECONDS);
                containerHandler.deleteContainers(containerIds);
                imageBuilder.removeImage(tenant, appName, getDockerImageVersion(dockerImage));
                return true;
            } else {
                return false;
            }
        } catch (Exception exception) {
            String message = String.format("Failed to remove web artifact[artifact]: %s",
                    generateKubernetesComponentName(tenant, appName));
            LOG.error(message, exception);
            throw new WebArtifactHandlerException(message, exception);
        }
    } 

Docker コンテナの削除機能の実装は次のとおりです。

public void deleteContainers(List<String> containerIds) throws WebArtifactHandlerException {
        try {
            for (String containerId : containerIds) {
                dockerClient.removeContainer(containerId);
                Thread.sleep(OPERATION_DELAY_IN_MILLISECONDS);
            }
        } catch (Exception exception) {
            String message = "Could not delete the Docker Containers.";
            LOG.error(message, exception);
            throw new WebArtifactHandlerException(message, exception);
        }
    }

上記の場合、目的の関数の実行は問題なく行われますが、特定のインスタンスで次の例外が発生する傾向があります。

Sep 11, 2015 3:57:28 PM org.apache.poc.webartifact.WebArtifactHandler remove
SEVERE: Failed to remove web artifact[artifact]: app-wso2-com
org.apache.poc.miscellaneous.exceptions.WebArtifactHandlerException: Could not delete the Docker Containers.
    at org.apache.poc.docker.JavaWebArtifactContainerHandler.deleteContainers(JavaWebArtifactContainerHandler.java:80)
    at org.apache.poc.webartifact.WebArtifactHandler.remove(WebArtifactHandler.java:206)
    at org.apache.poc.Executor.process(Executor.java:222)
    at org.apache.poc.Executor.main(Executor.java:46)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: com.spotify.docker.client.DockerRequestException: Request error: DELETE unix://localhost:80/v1.12/containers/af05916d2bddf73dcf8bf41c6ea7f5f3b859c90b97447a8248ffa7b5b3968691: 409
    at com.spotify.docker.client.DefaultDockerClient.propagate(DefaultDockerClient.java:1061)
    at com.spotify.docker.client.DefaultDockerClient.request(DefaultDockerClient.java:1021)
    at com.spotify.docker.client.DefaultDockerClient.removeContainer(DefaultDockerClient.java:544)
    at com.spotify.docker.client.DefaultDockerClient.removeContainer(DefaultDockerClient.java:535)
    at org.wso2.carbon6.poc.docker.JavaWebArtifactContainerHandler.deleteContainers(JavaWebArtifactContainerHandler.java:74)
    ... 8 more
Caused by: com.spotify.docker.client.shaded.javax.ws.rs.ClientErrorException: HTTP 409 Conflict
    at org.glassfish.jersey.client.JerseyInvocation.createExceptionForFamily(JerseyInvocation.java:991)
    at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:975)
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:795)
    at org.glassfish.jersey.client.JerseyInvocation.access$500(JerseyInvocation.java:91)
    at org.glassfish.jersey.client.JerseyInvocation$5.completed(JerseyInvocation.java:756)
    at org.glassfish.jersey.client.ClientRuntime.processResponse(ClientRuntime.java:189)
    at org.glassfish.jersey.client.ClientRuntime.access$300(ClientRuntime.java:74)
    at org.glassfish.jersey.client.ClientRuntime$1.run(ClientRuntime.java:171)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:320)
    at org.glassfish.jersey.client.ClientRuntime$2.run(ClientRuntime.java:201)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

これに関するヘルプを求めて多数のソースを検索しましたが、それでもすべてのインスタンスでそれを回避することはできませんでした。この機能を実行しました。

最初は、この問題が今よりも頻繁に発生する傾向がありましたが、各 Docker コンテナーの削除の最後に実行中のスレッドをスリープ状態にできるようにし、Docker コンテナーを削除する前に、この問題が発生するインスタンスの数を徐々に減らしました。

この問題の究極の解決策はスレッドをスリープ状態にすることですか、それともこの問題が発生する他の理由と、この例外を回避するのに役立つ解決策がありますか? どんな助けでも大歓迎です。

4

1 に答える 1

3

残念ながら、私は Java クライアント ライブラリに詳しくありません。

私の提案は、通常のコマンドライン クライアント (kubectl) を使用してみることです。これが機能する場合、問題は Java クライアント ライブラリまたはその使用法にあることがわかります。コマンド ライン クライアントを使用してもうまくいかない場合は、より多くの人が助けてくれます (Java クライアント ライブラリよりもコマンド ライン クライアントに慣れている人の方がはるかに多いため)。

つまり、 % kubectl delete pods ... # --cascade=true by default % kubectl delete services ...

手順 (4) と (5) が必要な理由が気になります。ステップ (4) は Pod を削除すると自動的に実行され、ステップ (5) はバックグラウンドで自動的に実行されます。

「kubectl delete」の 2 行が機能する場合、問題は Java クライアント ライブラリまたはその使用法にあります。出発点として、Java コードから deleteContainers() と removeImage() の呼び出しを削除し、それが役立つかどうかを確認することをお勧めします。それらの手順は不要だと思います。

于 2015-09-12T00:46:20.663 に答える