1

我在部署我的应用程序时遇到了困难,我的应用程序需要了解关于特定 statefulset 的集群内部状态并采取相应的行为。所以在我的 deployment.yml 文件中,我添加

spec:
 serviceName: "my-service"
  replicas: 3

哪个 kubernetes 将立即创建 3 个 pod(它不会等到容器内的应用程序启动),这在我的情况下是不需要的。所以我在应用程序中有一个逻辑,比如它的第一个副本,如果它的第二个(或第一个以外的任何副本)获取 statefulset 中生成的 pod 的最后一个 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 不会等到我的代码在 pod 中运行并且它只是启动 pod,所以我的逻辑失败并且它无法按预期工作。

目前我看到的唯一方法是将副本 = 1 并手动扩展它,我认为这不好。随着同样问题的出现,部署时间的扩展也无济于事。任何想法通过 kubernetes 完成这项工作?

4

0 回答 0