Беспорядочное и медленное поведение с приложением create-react-app и Skaffold kubernetes

У меня Скаффолд хорошо работает с локальным сервером разработки и развертываниями баз данных. Я пытаюсь приступить к работе с create-react-app интерфейсом, но поведение очень медленное и неустойчивое.

Проблемы

Основные проблемы следующие:

  1. После запуска skaffold dev --port-forward --tail требуется более пяти минут, чтобы он наконец начал раскручиваться. Запуск всего docker build занимает менее 30 секунд.
  2. Когда он наконец начинает раскручиваться, он просто сидит на Starting the development server... еще две минуты.
  3. Затем, в девяти случаях из десяти, через несколько минут я получаю следующие ошибки (их три, потому что это количество реплик):  введите описание изображения здесь

    Один раз из десяти он действительно попадет в Compiled Successfully! You can now view in the browser. Но он никогда не запускается в Chrome.

  4. Изменения JS в приложении create-react-app никогда не отражаются в новом браузере. Вы должны остановиться и снова запустить Скаффолда. Скаффолд действительно говорит Syncing 1 files for <image>... Watching for changes..., но ничего не меняется даже после обновления.

Что я пробовал

  1. Я действительно упростил то, что пытаюсь сделать, чтобы было легче разобраться в этом, поэтому я использую только приложение OOTB create-react-app. Несмотря на это, поведение одинаково.
  2. minikube delete и minikube start несколько раз (делали это, потому что даже развертывание сервера начало работать хаотично после попытки create-react-app)

Код и шаги по воспроизведению

Я использую macOS Mojave (10.14.6), использую Docker для Mac, Kubernetes (v1.16.0), minikube (v1.4.0), Skaffold (v0.39.0) и create-react-app. Мне придется пропустить процесс установки для всего этого, так как он довольно длительный, поэтому следующие шаги предполагают, что у вас это уже установлено.

  1. Создайте каталог проекта:

    mkdir project

  2. Создайте каталог манифеста Kubernetes и перейдите в него:

    mkdir k8s && cd k8s

  3. Сделайте client-deployment.yaml и добавьте следующее:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: client-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          component: web
      template:
        metadata:
          labels:
            component: web
        spec:
          containers:
            - name: client
              image: testapp/client
              ports:
                - containerPort: 3000
    
  4. Сделайте client-cluster-ip-service.yaml и добавьте следующее:

    apiVersion: v1
    kind: Service
    metadata:
      name: client-cluster-ip-service
    spec:
      type: ClusterIP
      selector:
        component: web
      ports:
        - port: 3000
          targetPort: 3000
    
  5. Вернитесь к родителю:

    cd ..

  6. Создайте skaffold.yaml и добавьте следующее:

    apiVersion: skaffold/v1beta15
    kind: Config
    build:
      local:
        push: false
      artifacts:
        - image: testapp/client
          context: web
          docker:
            dockerfile: Dockerfile.dev
          sync:
            manual:
              - src: "**/*.js"
                dest: .
              - src: "**/*.html"
                dest: .
              - src: "**/*.css"
                dest: .
    deploy:
      kubectl:
        manifests:
          - k8s/client-deployment.yaml
          - k8s/client-cluster-ip-service.yaml
    portForward:
      - resourceType: service
        resourceName: client-cluster-ip-service
        port: 3000
        localPort: 3000
    
  7. Начать новый create-react-app проект:

    npx create-react-app test-app

  8. Перейдите в каталог:

    cd test-app

  9. Создайте Dockerfile.dev и добавьте следующее:

    FROM node:alpine
    
    WORKDIR '/app'
    EXPOSE 3000
    CMD ["npm", "run", "start"]
    
    COPY package* ./
    RUN npm install
    COPY . .
    
  10. Создайте .dockerignore файл и добавьте следующее:

    node_modules
    *.swp
    
  11. Вернитесь в родительский каталог:

    cd ..

  12. Убедитесь, что minikube запущен:

    minikube start

  13. Запустите skaffold.yaml:

    skaffold dev --port-forward --tail

Вот что вызывает у меня проблемы.


person cjones    schedule 14.10.2019    source источник


Ответы (1)


Ok. Игнорировать. Начал с одной реплики и все заработало нормально. Два работали нормально. Три работали, если skaffold уже был запущен, но не из свежего skaffold dev --port-forward --tail.

skaffold ssh, а затем сделал top. Заканчивалась оперативная память ... ну было при использовании 86%. Увеличил его с 2 ГБ по умолчанию до 8 ГБ, и теперь он работает нормально.

Сначала удалил виртуальную машину с minikube delete, а затем создал новую с minikube start --memory='8g'. Теперь все хорошо.

person cjones    schedule 15.10.2019