特定のステートフル セットに関するクラスターの内部状態を把握し、それに応じて動作する必要があるアプリケーションの展開に問題があります。したがって、私の deployment.yml ファイルに追加します。
spec:
serviceName: "my-service"
replicas: 3
どの kubernetes が 3 つのポッドを即座に作成するか (コンテナー内のアプリケーションが開始するまで待機しません)、これは私の場合は望ましくありません。したがって、最初のレプリカの場合のようなロジックがアプリケーションにあり、2 番目 (または最初以外) がステートフル セットで生成されたポッドの最後の IP を取得して接続する場合は、behavior1 を実行します。
以下は私のコードです
String containerRingLastNodeIP = null;
ApiClient client = null;
Configuration.setDefaultApiClient( client );
V1PodList list = null;
try
{
client = Config.defaultClient();
}
catch ( IOException e )
{
SystemLogger.logSystemErrorMessege( e );
}
CoreV1Api api = new CoreV1Api( client );
try
{
list = api
.listNamespacedPod( "mynamespace", null, null, null, null, null, null, null,
null, null );
}
catch ( ApiException e )
{
SystemLogger.logSystemErrorMessege( e );
}
if ( list == null )
{
SystemLogger.logSystemInfoMessege( "PODS list is empty" );
}
List<V1Pod> containersList = list.getItems().stream()
.filter( x -> x.getMetadata().getName().contains( CONTAINER_NAME_TAG ) ).sorted( ( o1, o2 ) -> {
int pod1Id = Integer.parseInt( o1.getMetadata().getName().split( "-" )[1] );
int pod2Id = Integer.parseInt( o2.getMetadata().getName().split( "-" )[1] );
return pod1Id > pod2Id ? 1 : ( pod1Id < pod2Id ? -1 : 0 );
} ).collect(
Collectors.toList() );
String[] containerArguments;
if ( containersList.size() == 1 )
{
//do logic 1
}
else
{
V1Pod recentlyInitializedContainer = containersList
.get( containersList.size() - 2 );//remove the existing pod from the list
containerRingLastNodeIP = recentlyInitializedContainer.getStatus().getPodIP();
//do logic 2
}
そのため、kubernetes はコードがポッドで実行されるまで待機せず、ポッドを開始するだけなので、ロジックが失敗し、期待どおりに動作しません。
現時点で唯一の方法は、レプリカを 1 にして手動でスケールアップすることですが、これは良くないと思います。同じ問題が発生するため、展開時間のスケーリングは役に立ちません。kubernetes を介してこれを行うというアイデアはありますか?