Projeto PHP migra volume de armazenamento OSS do K8s

Prefácio

        Recentemente, um projeto antigo (PHP) precisou ser migrado para o Alibaba Cloud K8s. Vários recursos do projeto anterior foram armazenados em vários diretórios no servidor. Este artigo explicará a migração e implantação de recursos.

1. Razões para escolher volumes de armazenamento OSS

Há muitos motivos para escolher montar um volume de armazenamento OSS:

  1. Para fazer upload do design funcional para posterior desenvolvimento do projeto, é necessário carregá-lo no serviço OSS (anteriormente era carregado no serviço ECS).
  2. Se um volume de armazenamento NAS for montado, o projeto geralmente precisará substituir recursos, e é mais conveniente carregá-los e substituí-los por meio do cliente OSS.
  3. O projeto possui uma grande quantidade de recursos estáticos, que continuarão a aumentar no futuro.Os volumes de armazenamento estático OSS são um tipo de armazenamento no Alibaba Cloud Object Storage OSS e são usados ​​para armazenar dados estáticos, incluindo imagens, vídeos, js, html, css, etc Os volumes de armazenamento estático OSS são enormes, seguros, de baixo custo e altamente confiáveis. Eles suportam leitura, gravação e modificação on-line de dados. Eles são adequados para cenários de negócios, como armazenamento de imagens de sites da Web e separação de recursos dinâmicos e estáticos.
  4. Para recursos de negócios do projeto com menos gravação e mais leitura, os volumes de armazenamento OSS são mais adequados.Se o seu negócio envolve gravar arquivos no armazenamento, é recomendável usar serviços de volume de armazenamento NAS.
  5. O OSS suporta a montagem de vários pods ao mesmo tempo.

2. Use a linha de comando kubectl para usar volumes de armazenamento estático OSS

1.Criar segredo

  • Criar segredo (nome do arquivo: 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
  •  Execute o seguinte comando para criar um dicionário confidencial
kubectl create -f oss-secret.yaml

2. Use Secret para criar um PV de volume estático

  • Crie um PV de volume estático (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: "/"
  • Crie um volume estático PV usando o comando
kubectl create -f pv-oss.yaml

 Análise de parâmetros:

nome O nome do PV.
rótulos Configure o rótulo do PV.
armazenar A quantidade utilizável de OSS.
modos de acesso Configure o modo de acesso.
persistenteVolumeReclaimPolicy Estratégia de reciclagem fotovoltaica.
motorista Defina o tipo de driver. O valor é ossplugin.csi.alibabacloud.com, indicando que o plug-in OSS CSI é usado.
nodePublishSecretRef As informações do AccessKey são obtidas através do objeto Secret ao definir um PV.
identificador de volume Configure o nome do PV.
balde O balde OSS que precisa ser montado.
url Acesse o nome de domínio para montar o OSS.
  • Ao montar o nó na mesma região do Bucket, use o endereço da rede privada.
  • Ao montar nós e buckets em regiões diferentes, use o endereço de rede pública.
  • O uso de redes VPC é proibido.

Os formatos de acesso para diferentes nomes de domínio são os seguintes:

  • Formato do nome de domínio de acesso à intranet: oss-{ {regionName}}-internal.aliyuncs.com.
  • Formato de nome de domínio para acesso à rede externa: oss-{ {regionName}}.aliyuncs.com.
outras opções Ao montar o OSS, você pode inserir parâmetros personalizados no formato: -o *** -o ***.
caminho Indica a estrutura de diretório relativa ao arquivo raiz do Bucket durante a montagem. O padrão é / (suportado por v1.14.8.32-c77e277b-aliyun e versões posteriores).

3. Crie um volume estático de PVC

  • Crie PVC (nome do arquivo: 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
nome O nome do PVC.
modos de acesso Configure o modo de acesso.
armazenar Declare o uso do aplicativo, que não pode ser maior que o valor total do volume de armazenamento.
nome alicloud-pv O PV está associado ao tag, o que é consistente com o tag PV.

  • Crie PVC usando o comando
kubectl create -f pvc-oss.yaml

3. Crie um aplicativo

1. Tome como exemplo a montagem do serviço Nginx

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 O local onde o OSS está montado no contêiner.

claimName

O nome do PVC, usado para ligar o PVC

4. Perguntas

1. Problema de permissão de montagem de armazenamento OSS

Por padrão, a montagem do OSS usa as permissões raiz do Linux. Neste momento, as permissões de diretório e arquivo são 400. Devido a problemas de permissão, os dados não podem ser gravados nele após a montagem. Se precisar modificar a configuração de montagem, você pode fazer portanto, no volume estático OSS PV. Adicione a configuração do campo otherOpts e adicione o formato da configuração. Por exemplo otherOpts: "-o max_stat_cache_size=0 -o allow_other -o mp_umask=133", as permissões de configuração específicas são descritas a seguir.

  • -o max_stat_cache_size=0: Defina o tamanho máximo do cache de status como 0, o que significa que o tamanho do cache de status não é limitado, o que pode melhorar o desempenho da exibição da lista de diretórios.
  • -o permitir_outro: permite que outros usuários acessem arquivos de propriedade do usuário www-data.
  • -o mp_umask = 133: Defina o umask quando o arquivo for criado como 133, o que significa que o arquivo recém-criado terá apenas permissões de leitura, gravação e executável, o que pode garantir a segurança do arquivo.
  • Modifique a permissão da máscara de montagem :

    • Se a permissão do diretório de montagem especificado for 644, adicione a configuração no campo otherOpts: -o mp_umask=133.

    • Se a permissão dos arquivos no diretório de montagem especificado for 644, adicione a configuração no campo otherOpts: -o umask=133.

  • Especifique permissões de função para arquivos no diretório montado :

    • A permissão GroupID é a permissão especificada. Adicione a configuração no campo otherOpts: -o gid=XXX, onde XXX é /etc/passwordo ID do grupo de funções no qual você registrou.

    • A permissão UserID é a permissão especificada. Adicione a configuração no campo otherOpts: -o uid=XXX, onde XXX é /etc/passwordo ID da função que você registrou.

Problemas de arquivo e diretório de execução 1.php-fpm

Como o projeto é um projeto PHP, o usuário e grupo de usuários de execução do projeto são www-data:www-data (a configuração padrão do espelho php-fpm).A configuração padrão do dockerfile empacotado no espelho é root:root. Neste momento, o projeto não pode ser executado devido a problemas de permissão. Você pode executar arquivos de usuários e grupos de usuários através do empacotamento do dockerfile. Abaixo mostro os arquivos yaml do empacotamento php-fpm. Preste atenção no 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. Ferramentas de migração

Como os arquivos de recursos determinados existem no ECS, os arquivos são gerados continuamente antes da migração. Se você copiar os arquivos manualmente, será muito problemático. Aqui está uma função recomendada para você sincronizar facilmente os recursos do ECS com o OSS.

Ferramenta " ossutil ", ferramenta de gerenciamento de linha de comando para Objeto e Bucket.

  • Fornece comandos de gerenciamento de objetos e buckets convenientes, concisos e ricos com bom desempenho operacional.
  • Suporta upload simultâneo de arquivos e upload retomado em pontos de interrupção.
  • Suporta upload e download de diretórios de arquivos (pastas).

Acho que você gosta

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