Последовательное создание контейнеров в Куберне StatefulSet - PullRequest
0 голосов
/ 09 января 2019

У меня проблемы с развертыванием моего приложения, которому необходимо знать внутреннее состояние кластера относительно определенного набора состояний и вести себя соответственно. Поэтому в моем файле deploy.yml я добавляю

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

Какие kubernetes создадут 3 модуля сразу (не будет ждать, пока приложение внутри контейнера), что в моем случае нежелательно. Таким образом, у меня есть логика в приложении, например, если это первая реплика, сделайте поведение1, если его вторая (или любая другая, кроме первой) подхватывает последний ip порожденного модуля в наборе состояний и затем подключается к нему.

Ниже мой код

    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?

...