Создать приложение React k8s

Это будет короткая статья о том, как запустить приложение Create React на k8s.

Создать React-приложение



Если вы не знакомы, это удивительный инструмент, позволяющий создавать и разрабатывать прогрессивные веб-приложения, не зная, как что-то работает. Давайте будем честными, никто не знает, как работает Webpack, и когда вы думаете, что знаете, через 5 минут появляется новый плагин или лучший способ его использования.

Если вы использовали его раньше, он немного изменился за последние месяцы. Я, наконец, удалил все свои PWA, чтобы использовать его, что было непросто, но теперь все просто работает.

Вы можете использовать npx, если хотите, но я, кажется, использую create-react-app так часто, что быстрее установить его локально. Просто запустите create-react-app my-pwa и все готово.

k8s для всего

Около года назад я принял k8s для всего. Я думаю, что это удивительный инструмент. Я хотел запустить его локально, чтобы лучше имитировать мой кластер k8s.

Вот ссылка на локальный запуск k8s и helm



Я написал это сам и с тех пор не проверял microk8s, но шаги все еще работают для меня.

Я предполагаю, что вы либо настроили вышеуказанное, либо имеете что-то подобное. Я уверен, что вы сможете заполнить пробелы по мере продвижения следующих шагов. Важная часть заключается в том, что у вас есть локальный реестр и том, настроенный в вашем кластере на локальную файловую систему, для меня объем равен /home/$USER/Projects:/projects, но вы, вероятно, можете заполнить пробелы для вашей локальной настройки.

Запустите локальную разработку

НЕ ЗАБУДЬТЕ обновить package.json на homepage, например, значение равно /my-pwa.

Обычно вы бы запускали npm start, а затем пашете. Это до тех пор, пока вы не упретесь в стену на CORS. У меня есть много микросервисов, которые все работают на k8s, так что это проблема для меня почти сразу. Итак, давайте запустим приложение в k8s локально, тогда вам больше никогда не придется беспокоиться о CORS.

Предположение: все эти микросервисы работают в одном домене. Вот это http://localhost:8080

Оказывается, это очень легко сделать. Просто запустите kubectl apply my-pwa.local.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-pwa-local
  labels:
    app: my-pwa-local
spec:
  selector:
    matchLabels:
      app: my-pwa-local
  template:
    metadata:
      labels:
        app: my-pwa-local
    spec:
      containers:
        - name: my-pwa-local
          image: node:latest
          imagePullPolicy: IfNotPresent
          workingDir: /usr/src/app
          command:
            - "/bin/sh"
            - "-c"
          args:
            - "npm i && CI=true npm start"
          ports:
            - name: http
              containerPort: 3000
          volumeMounts:
            - mountPath: /usr/src/app
              name: my-pwa-local
      volumes:
        - name: my-pwa-local
          hostPath:
            path: /projects/my-pwa
            type: Directory
---
apiVersion: v1
kind: Service
metadata:
  name: my-pwa-local-service
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: http
  selector:
    app: my-pwa-local
  type: NodePort
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-pwa-local-ingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 50g
    nginx.ingress.kubernetes.io/proxy-buffering: "off"
    nginx.ingress.kubernetes.io/proxy-request-buffering: "off"
spec:
  rules:
    - http:
      paths:
        - path: /my-pwa
          backend:
            serviceName: my-pwa-local-service
            servicePort: 80
        - path: /sockjs-node
          backend:
          serviceName: my-pwa-local-service
          servicePort: 80

Теперь вы можете перейти на http://localhost:8080/my-pwa-local, и ваше приложение для разработки будет запущено с горячей перезагрузкой.

Это так приятно, когда это просто работает.

Альтернатива

Я предвосхищаю некоторые комментарии. Вы можете настроить NGINX в качестве прокси на вашем локальном компьютере. Это совершенно прекрасное решение. Затем вы можете запустить npm start, и все будет работать нормально. Раньше я делал это с помощью docker-compose, и это было довольно хорошо.

Однако k3s поставляется с входом, который делает это за вас. Все локальные решения k8s, которые я нашел, также поставляются с входом, так что вам не нужно делать что-то подобное самостоятельно.

Другая причина, по которой вы это сделаете, заключается в том, что вы можете протестировать свое производственное приложение локально в среде, подобной той, в которой вы будете развертывать, которую локальный NGINX может не предложить.

Разверните производственное приложение на k8s

Развернуть PWA невероятно просто.

  1. Выполнить npm run build
  2. Создайте Dockerfile в /home/$USER/Projects/my-pwa
FROM nginx:1.17.3-alpine
WORKDIR /usr/share/nginx/html
COPY build /usr/share/nginx/html/docs

3. Создайте и разверните в своем реестре

docker build -t my-pwa /home/$USER/Projects/my-pwa
docker tag my-pwa:latest registry.local:5000/my-pwa
docker push registry.local:5000/my-pwa

4. запустить kubectl apply my-pwa.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-pwa
labels:
  app: my-pwa
spec:
  selector
    matchLabels:
      app: my-pwa
  template:
    metadata:
      labels:
        app: my-pwa
    spec:
      containers:
      - name: my-pwa
        image: registry.local:5000/my-pwa
        imagePullPolicy: Always
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: my-pwa-service
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: my-pwa
  type: NodePort
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-pwa-ingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 50g
    nginx.ingress.kubernetes.io/proxy-buffering: "off"
    nginx.ingress.kubernetes.io/proxy-request-buffering: "off"
spec:
  rules:
    - http:
      paths:
        - path: /my-pwa
          backend:
            serviceName: my-pwa-service
            servicePort: 80

Теперь перейдите по адресу http://localhost:8080/my-pwa, и ваше производственное приложение будет работать в рабочей среде, что значительно упрощает отладку и тестирование, чем развертывание в реальной среде.

Вот собственно и все, проще не бывает.