Рубрики
Uncategorized

Масштабирование правильно укладочное приложение, как WordPress с двигателем Kubernetes и Cloud SQL в Google Cloud

В сети много примеров, которые показывают вам, как вы можете запустить WordPress в Kubernetes. Основная проблема с этими примерами есть только один POD, работающий со WordPress, и вы не можете на самом деле не масштабировать. Помечено облаком, дежоптом, куберовщиком, WordPress.

В сети много примеров, которые показывают вам, как вы можете запустить WordPress в Kubernetes. Основная проблема с этими примерами: только один POD работает с WordPress, и вы не можете его не масштабировать.

Поэтому я столкнулся с вопросом, что мне нужна очень масштабируемая настройка для WordPress, а вот то, что я придумал.

Почему так трудно масштабировать головные приложения?

Эти приложения записывают на диск напрямую и большую часть времени вы не можете его предотвратить. Это часто имеет место в PHP-приложениях, которые используют некоторую систему плагинов. Таким образом, файлы не могут быть сохранены в каком-то ведре, но должны быть в файловой системе приложения.

Теперь вы говорите что-то вроде Но есть плагин без гражданства, как https://de.wordpress.org/plugins/wp-Statureness/ который пишет до облачных ведер. Да, это правда, но он не хранит плагины там или файлы, что некоторые плагины могут напрямую писать в папке (грустно, что это происходит, но верно)

Что делать?

Нам нужна пара вещей, мы хотим масштабируемой базы данных, нам нужна какая-то общая файловая база для нашего приложения и самого приложения.

Ради укорочения мы просто будем использовать предварительно определенную документ Docker WordPress, хотя вы всегда должны попытаться создать дополнения к этим докереннымфам, которые соответствует вашим потребностям. Используйте их в качестве базы, но продлите их в ваши потребности.

Поэтому нам нужен общий диск, и здесь мы столкнулись с нашей первой проблемой. Нам нужен объем чтения для чтения в наших кластере Kubernetes, и начинаются проблемы. Облако провайдеры не имеют этого. Если вы проверяете Документация Kubernetes Вы увидите ни GCEPERSISTANTDAIK, ни Azudishisk, ни awselaicleblockstore, поддерживают то, что нам нужно. Есть варианты, такие как облачный FileStore в Google Cloud или Azure File, но они дороги и большой для нашего дела (Нам не нужно 1ТБ, чтобы хранить свое слово WordPress, спасибо)

NFS к спасению

Но когда мы смотрим в список, мы видим Спасителя: NFS к спасению. Давайте создадим единственный вариант, у нас есть хранилище для чтения, подключенные к нашим NFS. Поэтому нам нужен класс хранения, идеально поделившись между регионами:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
 name: regionalpd-storageclass
provisioner: kubernetes.io/gce-pd
parameters:
 type: pd-standard
 replication-type: regional-pd
 zones: europe-west3-b, europe-west3-c

И нам нужно создать требование тома

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
    name: nfs
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  storageClassName: ""
  volumeName: nfs

Теперь давайте создадим наши NFS

apiVersion: v1
kind: Service
metadata:
 name: nfs-server
spec:
 clusterIP: 10.3.240.20
 ports:
   - name: nfs
     port: 2049
   - name: mountd
     port: 20048
   - name: rpcbind
     port: 111
 selector:
   role: nfs-server

Теперь мы добавляем саму NFS. Хорошая вещь здесь, мы можем использовать предопределенную услугу

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: nfs-server
spec:
 replicas: 1
 selector:
   matchLabels:
     role: nfs-server
 template:
   metadata:
     labels:
       role: nfs-server
   spec:
     containers:
       - name: nfs-server
         image: gcr.io/google_containers/volume-nfs:0.8
         ports:
           - name: nfs
             containerPort: 2049
           - name: mountd
             containerPort: 20048
           - name: rpcbind
             containerPort: 111
         securityContext:
           privileged: true
         volumeMounts:
           - mountPath: /exports
             name: nfs
     volumes:
       - name: nfs
         gcePersistentDisk:
           pdName: nfs
           fsType: ext4

Cloudsql так безопасен так много красоты

Хорошо, так что у нас есть работает NFS для наших статических данных. Так что следующий большой шаг подключатся облако SQL. Итак, скажем, у вас уже есть настроить облако SQL MySQL. Как вы подключаете свои стручки к нему?

Мы используем SQL Proxy для него, которая приходит в качестве SideCar для нашего контейнера. Хорошая вещь в этом есть, наш MySQL не выставлен, и мы можем использовать localhost. Удивительно не так ли?

Сначала вы должны активировать Облако SQL Admin API

И вам нужно создать Сервисная учетная запись которые имеют фактический доступ к облачному SQL.

Здесь мы создаем новую роль, которая имеет права на облачные SQL> Cloud SQL-клиент

Загрузите созданный закрытый ключ. Этот нам нужно получить доступ к экземпляру SQL.

Теперь создайте пользователь базы данных, если вы еще этого не сделали

gcloud sql users create [DBUSER] --host=% --instance=[INSTANCE_NAME] --password=[PASSWORD]

И нам нужно имя экземпляра, легко:

gcloud sql instances describe [INSTANCE_NAME]

Или в WebInterface вы находите его здесь: теперь мы сохраняем учетные данные на наших экземпляров Kubernetes:

kubectl create secret generic cloudsql-instance-credentials \
    --from-file=credentials.json=[PROXY_KEY_FILE_PATH]
kubectl create secret generic cloudsql-db-credentials \
    --from-literal=username=[DBUSER] --from-literal=password=[PASSWORD]

Поэтому мы готовы настроить ваше WordPress, не так ли?

Давайте создадим услугу в качестве первого шага:

apiVersion: v1
kind: Service
metadata:
 name: wlp-service
 labels:
   app: wlp-service
spec:
 type: LoadBalancer
 sessionAffinity: ClientIP
 ports:
   - port: 443
     targetPort: 443
     name: https
   - port: 80
     targetPort: 80
     name: http
 selector:
   app: wordpress

Хорошо, теперь у нас есть сервис и работает только без вести, — это сам Pod. Давайте разделимся немного немного, чтобы я мог объяснить

apiVersion: apps/v1
kind: Deployment
metadata:
 name: wordpress
 labels:
   app: wordpress
spec:
 replicas: 2
 strategy:
   type: RollingUpdate
 selector:
   matchLabels:
     app: wordpress
 template:
   metadata:
     labels:
       app: wordpress
   spec:
     containers:
       - name: wordpress
         image: wordpress:7.3-apache
         imagePullPolicy: Always
         env:
           - name: DB_USER
             valueFrom:
               secretKeyRef:
                 name: "cloudsql-db-credentials"
                 key: username
           - name: DB_PASSWORD
             valueFrom:
               secretKeyRef:
                 name: "cloudsql-db-credentials"
                 key: password
         ports:
           - containerPort: 80
             name: wordpress
           - containerPort: 443
             name: ssl

Это было бы достаточно для запуска WordPress, но без базы данных или постоянного NFS. Один за другим давайте добавим облако SQL Proxy:

       - name: cloudsql-proxy
         image: gcr.io/cloudsql-docker/gce-proxy:1.11
         command: ["/cloud_sql_proxy",
                   "-instances=[YOUR INSTANCESTRING THAT WE LOOKED UP]=tcp:3306",
                   "-credential_file=/secrets/cloudsql/credentials.json"]
         securityContext:
           runAsUser: 2  # non-root user
           allowPrivilegeEscalation: false
         volumeMounts:
           - name: cloudsql-instance-credentials
             mountPath: /secrets/cloudsql
             readOnly: true
     volumes:
       - name: cloudsql-instance-credentials
         secret:
           secretName: cloudsql-instance-credentials

Cool теперь мы можем получить доступ к нашему облаку SQL с localhost:) Он в основном добавляет второй контейнер в ваш POD, который прокси все, что выходит на 3306 в нашему экземпляру Cloud SQL, не подвергая трафик в публичную сеть.

И теперь мы хотим установить наш каталог WP-Content в NFS

volumeMounts:
           - name: my-pvc-nfs
             mountPath: "/var/www/html/wp-content"
volumes:
        - name:  my-pvc-nfs
        nfs:
            server: 10.3.240.20
            path: "/"

Теперь вы начну говорили, но Марио, почему взломать, вы ставите фиксированным IP для NFS. Есть причина. Это единственный случай, который я знаю, где внутренний DNS не работает должным образом.

И это теперь мы можем масштабировать наши стручки, создавая и HPA

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
 name: wordpress
 namespace: default
spec:
 maxReplicas: 10
 metrics:
   - resource:
       name: cpu
       targetAverageUtilization: 50
     type: Resource
 minReplicas: 3
 scaleTargetRef:
   apiVersion: extensions/v1beta1
   kind: Deployment
   name: wordpress

Все наши файлы WP-контента переходят на NFS и передаются между экземплярами. Да, вы исправляете NFS теперь наша единая точка сбоя, но NFS — это более стабильна, чем только одна машина. Если вы используете кеширование, как Redis или увеличить кеш FPM, вы можете еще больше сократить время загрузки.

Круто не так ли?

Вы заинтересованы в Basic Kubernetes/Cloud Trowths? Просто дай мне знать

Оригинал: «https://dev.to/mfahlandt/scaling-properly-a-stateful-app-like-wordpress-with-kubernetes-engine-and-cloud-sql-in-google-cloud-27jh»