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:
- 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).
- 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.
- 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.
- 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.
- 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.
Los formatos de acceso para los diferentes nombres de dominio son los siguientes:
|
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. |
|
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/password
el 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/password
el 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).