GithubHelp home page GithubHelp logo

devkub-13-02's Introduction

Домашнее задание к занятию "13.2 разделы и монтирование"

Приложение запущено и работает, но время от времени появляется необходимость передавать между бекендами данные. А сам бекенд генерирует статику для фронта. Нужно оптимизировать это. Для настройки NFS сервера можно воспользоваться следующей инструкцией (производить под пользователем на сервере, у которого есть доступ до kubectl):

В конце установки будет выдан пример создания PVC для этого сервера.

Решение

После установки nfs-server

kubectl get pods -o wide
NAME                                  READY   STATUS    RESTARTS   AGE    IP             NODE    NOMINATED NODE   READINESS GATES
nfs-server-nfs-server-provisioner-0   1/1     Running   0          12m    10.233.94.63   node0   <none>           <none>

Задание 1: подключить для тестового конфига общую папку

Описание задачи В stage окружении часто возникает необходимость отдавать статику бекенда сразу фронтом. Проще всего сделать это через общую папку. Требования: * в поде подключена общая папка между контейнерами (например, /static); * после записи чего-либо в контейнере с беком файлы можно получить из контейнера с фронтом.

Решение

  1. Создаем манифест для deployment (stage) - два контейнера front и back в одном поде. Указываем и монтируем volume (stage-volume).
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: stage
  name: stage
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: stage
  template:
    metadata:
      labels:
        app: stage
    spec:
      containers:
        - name: front
          image: nginx
          volumeMounts:
            - mountPath: "/static"
              name: stage-volume
          resources:
            limits:
              cpu: 200m
              memory: 256Mi
            requests:
              cpu: 100m
              memory: 128Mi
        - name: back
          image: busybox
          command: ["sleep", "3600"]
          volumeMounts:
            - mountPath: "/static"
              name: stage-volume
          resources:
            limits:
              cpu: 200m
              memory: 256Mi
            requests:
              cpu: 100m
              memory: 128Mi
      volumes:
        - name: stage-volume
          emptyDir: {}
  1. Применяем и проверяем:
kubectl apply -f ./task-1/
deployment.apps/stage created

kubectl get pods -o wide
NAME                                  READY   STATUS    RESTARTS   AGE    IP             NODE    NOMINATED NODE   READINESS GATES
nfs-server-nfs-server-provisioner-0   1/1     Running   0          12m    10.233.94.63   node0   <none>           <none>
stage-6d6495f8f4-wj5xn                2/2     Running   0          100s   10.233.90.50   node1   <none>           <none>
  1. Создадим файл из контейнера back и проверим результат:
kubectl exec stage-6d6495f8f4-wj5xn -c back -- sh -c "echo 'test-string' > /static/test-file.txt"

kubectl exec stage-6d6495f8f4-wj5xn -c back -- ls -la /static
total 12
drwxrwxrwx    2 root     root          4096 Apr 30 19:34 .
drwxr-xr-x    1 root     root          4096 Apr 30 19:23 ..
-rw-r--r--    1 root     root            12 Apr 30 19:34 test-file.txt

kubectl exec stage-6d6495f8f4-wj5xn -c back -- cat /static/test-file.txt
test-string
  1. Проверяем файлы в контейнере front
kubectl exec stage-6d6495f8f4-wj5xn -c front -- ls -la /static
total 12
drwxrwxrwx 2 root root 4096 Apr 30 19:34 .
drwxr-xr-x 1 root root 4096 Apr 30 19:23 ..
-rw-r--r-- 1 root root   12 Apr 30 19:34 test-file.txt

kubectl exec stage-6d6495f8f4-wj5xn -c front -- cat /static/test-file.txt
test-string
  1. Изменим файл из контейнера front
kubectl exec stage-6d6495f8f4-wj5xn -c front -- sh -c "echo 'test-string from front' > /static/test-file.txt"

kubectl exec stage-6d6495f8f4-wj5xn -c front -- cat /static/test-file.txt
test-string from front
  1. Проверяем из контейнера back
kubectl exec stage-6d6495f8f4-wj5xn -c back -- cat /static/test-file.txt
test-string from front
  1. Если удалить под, deployment создаст новый но volume будет пустой.

Задание 2: подключить общую папку для прода

Описание задачи Поработав на stage, доработки нужно отправить на прод. В продуктиве у нас контейнеры крутятся в разных подах, поэтому потребуется PV и связь через PVC. Сам PV должен быть связан с NFS сервером. Требования: * все бекенды подключаются к одному PV в режиме ReadWriteMany; * фронтенды тоже подключаются к этому же PV с таким же режимом; * файлы, созданные бекендом, должны быть доступны фронту.

Решение

Предварительно установил на worker ноды nfs-common

sudo apt install nfs-common
  1. Подготовим манифесты для front и back (deployment). Монтируем том через persistentVolumeClaim (указываем имя pvc)

front

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: front-1
  name: front-1
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: front-1
  template:
    metadata:
      labels:
        app: front-1
    spec:
      containers:
        - name: front-1
          image: nginx
          volumeMounts:
            - mountPath: "/static"
              name: prod-volume
          resources:
            limits:
              cpu: 200m
              memory: 256Mi
            requests:
              cpu: 100m
              memory: 128Mi
      volumes:
        - name: prod-volume
          persistentVolumeClaim:
            claimName: pvc

back

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: back-1
  name: back-1
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: back-1
  template:
    metadata:
      labels:
        app: back-1
    spec:
      containers:
        - name: back
          image: busybox
          command: ["sleep", "3600"]
          volumeMounts:
            - mountPath: "/static"
              name: prod-volume
          resources:
            limits:
              cpu: 200m
              memory: 256Mi
            requests:
              cpu: 100m
              memory: 128Mi
      volumes:
        - name: prod-volume
          persistentVolumeClaim:
            claimName: pvc
  1. Подготовим манифест для PersistentVolumeClaim c указанием типа ReadWriteMany. Указываем storageClassName созданный автоматически при установке NFS Provisioner service. Пример был отражен после установки.
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc
spec:
  storageClassName: "nfs"
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Mi
  1. Применяем:
kubectl apply -f task-2/
deployment.apps/back-1 created
deployment.apps/front-1 created
persistentvolumeclaim/pvc created
  1. Проверяем
kubectl get pods
NAME                                  READY   STATUS    RESTARTS   AGE
back-1-6c98667d5d-lvmnb               1/1     Running   0          12m
front-1-58cf876c85-v7fj2              1/1     Running   0          12m
nfs-server-nfs-server-provisioner-0   1/1     Running   0          54m
stage-6d6495f8f4-rqkjf                2/2     Running   0          25m
  1. Создаем файл из пода с back
kubectl exec back-1-6c98667d5d-lvmnb -- sh -c "echo 'test-string' > /static/test-file.txt"

kubectl exec back-1-6c98667d5d-lvmnb -- ls /static
test-file.txt
  1. Проверяем файл из пода с front
kubectl exec front-1-58cf876c85-v7fj2 -- ls /static
test-file.txt

kubectl exec front-1-58cf876c85-v7fj2 -- cat /static/test-file.txt
test-string
  1. Удалим поды front и back и проверим доступность файла после того как deployments их пересоздадут
kubectl delete pod front-1-58cf876c85-v7fj2 back-1-6c98667d5d-lvmnb 
pod "front-1-58cf876c85-v7fj2" deleted
pod "back-1-6c98667d5d-lvmnb" deleted

# получаем имена пересозданных подов
kubectl get pods
NAME                                  READY   STATUS    RESTARTS   AGE
back-1-6c98667d5d-bwshv               1/1     Running   0          101s
front-1-58cf876c85-dkb46              1/1     Running   0          101s
nfs-server-nfs-server-provisioner-0   1/1     Running   0          64m
stage-6d6495f8f4-rqkjf                2/2     Running   0          34m

# проверяем доступность файла
kubectl exec back-1-6c98667d5d-bwshv -- ls /static
test-file.txt

kubectl exec front-1-58cf876c85-dkb46  -- ls /static
test-file.txt

devkub-13-02's People

Contributors

rdegtyarev avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.