El proyecto PHP migra el volumen de almacenamiento OSS de K8

prefacio

        Recientemente, es necesario migrar un proyecto antiguo (PHP) a Alibaba Cloud K8. Varios recursos del proyecto anterior se almacenaron en varios directorios en el servidor. Este artículo explicará la migración e implementación de recursos.

1. Razones para elegir volúmenes de almacenamiento OSS

Hay muchas razones para optar por montar un volumen de almacenamiento OSS:

  1. En la carga del diseño de la función de desarrollo posterior al proyecto, es necesario cargar el servicio OSS (antes se cargó en el servicio ECS).
  2. Si se monta un volumen de almacenamiento NAS, el proyecto generalmente necesita reemplazar recursos y es más conveniente que OSS lo cargue y reemplace a través del cliente.
  3. El proyecto tiene una gran cantidad de recursos estáticos, que seguirán aumentando en el futuro. El volumen de almacenamiento estático de OSS es un tipo de almacenamiento en Alibaba Cloud Object Storage OSS y se utiliza para almacenar datos estáticos, incluidas imágenes, videos, js, html, css,etc. Los volúmenes de almacenamiento estático de OSS son masivos, seguros, de bajo costo y altamente confiables. Admiten la lectura, escritura y modificación en línea de datos. Son adecuados para escenarios comerciales como el almacenamiento de imágenes de sitios web y la separación de recursos dinámicos y estáticos.
  4. Para recursos comerciales de proyectos con menos escritura y más lectura, los volúmenes de almacenamiento OSS son más adecuados. Si su negocio implica escribir archivos en almacenamiento, se recomienda utilizar los servicios de volumen de almacenamiento NAS.
  5. OSS admite el montaje de varios Pods al mismo tiempo.

2. Utilice el volumen de almacenamiento estático de OSS a través de la línea de comando kubectl

1.Crear secreto

  • Crear secreto (nombre de archivo: oss-secret.yaml)
apiVersion: v1
kind: Secret
metadata:
  name: oss-secret # 可自定义 secret name
  namespace: <your namespace>
data:
  akId: <your AccessKey ID>
  akSecret: <your AccessKey Secret>
type: Opaque
  •  Ejecute el siguiente comando para crear un diccionario secreto
kubectl create -f oss-secret.yaml

2. Utilice Secret para crear un PV de volumen estático

  • Crear un volumen estático PV (pv-oss.yaml)
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-oss # 可自定义 pv name
  labels:
    alicloud-pvname: pv-oss
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: ossplugin.csi.alibabacloud.com
    volumeHandle: pv-oss # 需要和 PV 名字一致。
    nodePublishSecretRef:
      name: <your secret name> # 创建 Secret 中定义的名字。
      namespace: <your namespace>
    volumeAttributes:
      bucket: <your bucket name> # 需要挂载的 OSS Bucket
      url: "oss-cn-hangzhou.aliyuncs.com"
      otherOpts: '-o max_stat_cache_size=0 -o allow_other -o mp_umask=022 -o umask=022'
      path: "/"
  • Cree un volumen estático PV usando el comando
kubectl create -f pv-oss.yaml

 Análisis de parámetros:

nombre El nombre del PV.
etiquetas Configurar la etiqueta del PV.
almacenamiento La cantidad utilizable de OSS.
modos de acceso Configurar el modo de acceso.
política de recuperación de volumen persistente Estrategia de reciclaje fotovoltaico.
conductor Defina el tipo de controlador. El valor es ossplugin.csi.alibabacloud.com, lo que indica que se utiliza el complemento OSS CSI.
nodoPublishSecretRef Al definir un PV a montar, la información de AccessKey se obtiene a través del objeto Secret.
volumenMango Configure el nombre del PV.
balde El cubo OSS que necesita ser montado.
URL Monte el nombre de dominio de acceso OSS.
  • Al montar el nodo en la misma región que el Bucket, utilice la dirección de red privada.
  • Al montar el nodo y el depósito en diferentes regiones, utilice la dirección de red pública.
  • Está prohibido el uso de redes VPC.

Los formatos de acceso para los diferentes nombres de dominio son los siguientes:

  • Formato del nombre de dominio de acceso a intranet: oss-{ {regionName}}-internal.aliyuncs.com.
  • Formato de nombre de dominio para acceso a red externa: oss-{ {regionName}}.aliyuncs.com.
otrosopts Al montar OSS, puede ingresar parámetros personalizados en el formato: -o *** -o ***.
camino Indica la estructura del directorio relativa al archivo raíz del depósito al montar. El valor predeterminado es / (compatible con v1.14.8.32-c77e277b-aliyun y versiones posteriores).

3. Crea un volumen estático de PVC.

  • Crear PVC (nombre de archivo: oss-secret.yaml)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-oss # 自定义
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 20Gi
  selector:
    matchLabels:
      alicloud-pvname: pv-oss # 需要 pv 中 name 保持一致
parámetro ilustrar
nombre El nombre del PVC.
modos de acceso Configurar el modo de acceso.
almacenamiento Declare el uso de la aplicación, que no puede ser mayor que la cantidad total del volumen de almacenamiento.
alicloud-pvname Asocie el PV a través de la etiqueta y sea coherente con la etiqueta del PV.

  • Crear PVC usando el comando
kubectl create -f pvc-oss.yaml

3. Crea una aplicación

1. Tome el montaje del servicio Nginx como ejemplo.

1apiVersion: apps/v1
kind: Deployment
metadata:
  name: static
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
          - name: pvc-oss
            mountPath: "/data"
        livenessProbe:
          exec:
            command:
            - sh
            - -c
            - cd /data
          initialDelaySeconds: 30
          periodSeconds: 30
      volumes:
        - name: pvc-oss
          persistentVolumeClaim:
            claimName: pvc-oss
parámetro ilustrar
mountPath La ubicación donde se monta OSS en el contenedor.

claimName

El nombre del PVC, utilizado para unir el PVC.

4. Preguntas

1. Problema con el permiso de montaje del almacenamiento OSS

El montaje de OSS utiliza permisos de raíz de Linux de forma predeterminada. En este momento, los permisos de directorio y archivo son 400. Debido a problemas de permisos, no se pueden escribir datos en él después del montaje. Si necesita modificar la configuración de montaje, puede hacerlo en el Volumen estático OSS PV. Agregue la configuración del campo otherOpts y agregue el formato de la configuración. Por ejemplo otherOpts: "-o max_stat_cache_size=0 -o allow_other -o mp_umask=133", los permisos de configuración específicos se describen a continuación.

  • -o max_stat_cache_size=0: establece el tamaño máximo de la caché de estado en 0, lo que significa que el tamaño de la caché de estado no está limitado, lo que puede mejorar el rendimiento de la visualización de la lista de directorios.
  • -o enable_other: permite que otros usuarios accedan a archivos propiedad del usuario www-data.
  • -o mp_umask = 133: establece la umask cuando se crea el archivo en 133, lo que significa que el archivo recién creado solo tendrá permisos de lectura, escritura y ejecutable, lo que puede garantizar la seguridad del archivo.
  • Modificar los permisos de la máscara de montaje :

    • Si el permiso del directorio de montaje especificado es 644, agregue la configuración en el campo otherOpts: -o mp_umask=133.

    • Si el permiso de los archivos en el directorio de montaje especificado es 644, agregue la configuración en el campo otherOpts: -o umask=133.

  • Especifique permisos de función para archivos en el directorio montado :

    • El permiso GroupID es el permiso especificado. Agregue la configuración en el campo otherOpts: -o gid=XXX, donde XXX es /etc/passwordel ID del grupo de funciones en el que registró.

    • El permiso de ID de usuario es el permiso especificado. Agregue la configuración en el campo otherOpts: -o uid=XXX, donde XXX es /etc/passwordel ID de rol que registró.

1.Problemas de directorio y archivo de ejecución de php-fpm

Dado que el proyecto es un proyecto PHP, el usuario y el grupo de usuarios de ejecución del proyecto son www-data:www-data (la configuración predeterminada del espejo php-fpm) y la configuración predeterminada del dockerfile empaquetado en el espejo es root:root. En este momento, el proyecto no puede ejecutarse debido a problemas de permisos. Puede ejecutar archivos de usuarios y grupos de usuarios a través del empaquetado dockerfile. A continuación muestro archivos yaml empaquetados con php-fpm. Preste atención al final.

FROM php:7.2.34-fpm-alpine

LABEL MAINTAINER="xxx [email protected]"

# 参数
ENV TZ "Asia/Shanghai"
ENV ETC_DIR "/usr/local/etc"
ENV PHP_INI_DIR "/usr/local/etc/php"

# 配置 apk 阿里云镜像源
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories

# 调整时区
RUN apk add tzdata && cp "/usr/share/zoneinfo/$TZ" /etc/localtime && echo "$TZ" > /etc/timezone

# install depends libraries
RUN apk --update add --no-cache --virtual .build-deps autoconf g++ libtool make curl-dev gettext-dev linux-headers

# 安装 Redis 扩展
RUN echo "---------- Install redis ----------" \
#    && mkdir redis \
#    && tar -xf redis-5.2.2.tgz -C redis --strip-components=1 \
#    && cd redis && phpize && ./configure && make -j$(nproc) && make install
#    && docker-php-ext-enable redis
    && pecl install redis \
    && docker-php-ext-enable redis

RUN echo "---------- Install zip ----------" \
    && apk add libzip libzip-dev \
    && docker-php-ext-install zip

RUN echo "---------- Install gettext ----------" \
    && apk add gettext-dev \
    && docker-php-ext-install gettext

RUN echo "---------- Install pdo_mysql ----------" \
    && docker-php-ext-install pdo_mysql

RUN echo "---------- Install gd ----------" \
    && apk add \
        freetype \
        freetype-dev \
        libpng \
        libpng-dev \
        libjpeg-turbo \
        libjpeg-turbo-dev \
        libwebp-dev \
    && docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-png-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-webp-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    && apk del \
       freetype-dev \
       libpng-dev \
       libjpeg-turbo-dev

RUN echo "---------- Install bcmath ----------" \
	&& docker-php-ext-install bcmath

# 覆盖 php.ini 文件
COPY deploy/docker/php/php.ini $PHP_INI_DIR/conf.d/

# php 镜像的 www-data user uid & gid are 82, change them to 1000 (primary user)
RUN apk add shadow && usermod -u 1000 www-data && groupmod -g 1000 www-data

# 指定目录
WORKDIR /www

# COPY 项目 /www 目录,指定用户:用户组
COPY --chown=www-data:www-data . /www

5. Herramientas de migración

Dado que los archivos de recursos determinados existen en ECS, los archivos se generan continuamente antes de la migración. Si copia los archivos manualmente, será muy problemático. Aquí le recomendamos una función para sincronizar fácilmente los recursos de ECS con OSS.

Herramienta " ossutil ", herramienta de gestión de línea de comandos para Object y Bucket.

  • Proporciona comandos de gestión de depósitos y objetos prácticos, concisos y completos con un buen rendimiento operativo.
  • Admite la carga simultánea de archivos y la carga reanudada en puntos de interrupción.
  • Admite la carga y descarga de directorios de archivos (carpetas).

Supongo que te gusta

Origin blog.csdn.net/qq_34272964/article/details/131294840
Recomendado
Clasificación