PHP项目迁移K8s之OSS存储卷

这篇具有很好参考价值的文章主要介绍了PHP项目迁移K8s之OSS存储卷。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

        最近一个老项目(PHP)需要迁移至阿里云K8s上,之前项目上各种资源都存在服务器上多个目录下,本文就针对其中资源迁移部署讲解。

一、选择OSS存储卷原因

出于多种原因选择挂载OSS存储卷:

  1. 项目后期开发功能设计上传,需要上传OSS服务(之前都是上传到ECS服务上)。
  2. 若挂载NAS存储卷,项目平时需要更换资源,OSS通过客户端上传替换更为方便。
  3. 项目静态资源量很大,且后期还不断增加,而OSS静态存储卷是阿里云对象存储OSS中的一种存储类型,用于存储静态数据,包括图片、视频、js、html、css等等。OSS静态存储卷具有海量、安全、低成本、高可靠等特性,支持数据读写和在线修改,适用于Web网站图片存储、动静资源分离等业务场景。
  4. 项目业务资源写少读多,OSS存储卷更适合,如果您的业务是将文件写入存储的场景,推荐使用NAS存储卷服务。
  5. OSS支持同时被多个Pod挂载。

二、通过kubectl命令行的方式使用OSS静态存储卷

1.创建Secret

  • 创建Secret(文件名: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
  •  执行以下命令创建保密字典
kubectl create -f oss-secret.yaml

2.使用Secret创建静态卷PV

  • 创建静态卷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: "/"
  • 使用命令创建静态卷PV
kubectl create -f pv-oss.yaml

 参数解析:

name PV的名称。
labels 配置PV的标签。
storage OSS的可使用量。
accessModes 配置访问模式。
persistentVolumeReclaimPolicy PV回收策略。
driver 定义驱动类型。取值为ossplugin.csi.alibabacloud.com,表示使用OSS CSI插件。
nodePublishSecretRef 定义挂载PV时通过Secret对象来获取AccessKey信息。
volumeHandle 配置PV的名称。
bucket 需要挂载的OSS Bucket。
url 挂载OSS的接入域名。
  • 挂载节点和Bucket相同地域时,请使用私网地址。
  • 挂载节点和Bucket不同地域时,请使用公网地址。
  • 禁止使用VPC网络。

不同域名访问格式如下:

  • 内网访问域名格式:oss-{{regionName}}-internal.aliyuncs.com
  • 外网访问域名格式:oss-{{regionName}}.aliyuncs.com
otherOpts 挂载OSS时支持输入定制化参数,格式为:-o *** -o ***
path 表示挂载时相对Bucket根文件的目录结构,默认为/(v1.14.8.32-c77e277b-aliyun及之后版本支持)。

3.创建静态卷PVC

  • 创建PVC(文件名: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 保持一致
参数 说明
name PVC的名称。
accessModes 配置访问模式。
storage 声明应用使用量,不能大于存储卷的总量。
alicloud-pvname 通过标签关联PV,与PV标签保持一致。

  • 使用命令创建PVC
kubectl create -f pvc-oss.yaml

三、创建应用

1.以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
参数 说明
mountPath OSS在容器中挂载的位置。

claimName

PVC的名称,用于绑定PVC

四、问题

1.OSS存储挂载权限问题

OSS挂载默认使用Linux的root权限进行挂载,此时目录和文件权限是400,由于权限问题,挂载之后无法向里面写入数据,如果需要修改挂载配置,可以在OSS静态卷PV中增加otherOpts字段的配置,添加配置的格式例如otherOpts: "-o max_stat_cache_size=0 -o allow_other -o mp_umask=133",具体配置权限说明如下。

  • -o max_stat_cache_size=0:设置最大状态缓存大小为0,表示不限制状态缓存的大小,可以提高目录列表显示性能。
  • -o allow_other:允许其他用户访问被www-data用户拥有的文件。
  • -o mp_umask=133:设置文件创建时的umask为133,这意味着新创建的文件将只有可读可写可执行的权限,可以保证文件的安全性。
  • 修改挂载掩码权限

    • 若指定挂载目录的权限为644,在otherOpts字段中增加配置:-o mp_umask=133

    • 若指定挂载目录里文件的权限为644,在otherOpts字段中增加配置:-o umask=133

  • 指定挂载目录里文件的角色权限

    • GroupID权限为指定权限,在otherOpts字段中增加配置:-o gid=XXX,其中,XXX为您在/etc/password中记录的角色组ID。

    • UserID权限为指定权限,在otherOpts字段中增加配置:-o uid=XXX,其中,XXX为您在/etc/password中记录的角色ID。

1.php-fpm执行文件和目录问题

由于项目是一个PHP项目,项目执行用户和用户组是www-data:www-data(镜像php-fpm默认配置),dockerfile打包到镜像中中默认是root:root,此时项目由于权限问题无法运行。可以通过dockerfile打包时执行文件用户和用户组,下面我展示php-fpm打包yaml文件,关注最后

FROM php:7.2.34-fpm-alpine

LABEL MAINTAINER="xxx xxxn@xxx.xxx"

# 参数
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

五、迁移工具

由于判断的资源文件存在ECS上,在迁移前文件不断产生,如果手动复制文件就显示很麻烦,这里给大家推荐一个功能,可以轻松完成ECS资源同步OSS。

工具"ossutil",Object和Bucket的命令行管理工具。文章来源地址https://www.toymoban.com/news/detail-539670.html

  • 提供方便、简洁、丰富的Object和Bucket管理命令,操作性能好。
  • 支持文件并发上传、断点续传。
  • 支持文件目录(文件夹)的上传下载。

到了这里,关于PHP项目迁移K8s之OSS存储卷的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kubernetes/k8s的存储卷/数据卷

    k8s的存储卷/数据卷 容器内的目录和宿主机的目录挂载 容器在系统上的生命周期是短暂的,delete,k8s用控制创建的pod,delete相当于重启,容器的状态也会回复到初始状态 一旦回到初始状态,所有的后天编辑的文件都会消失 容器和节点之间创建一个可以持久化保存容器内文件

    2024年01月24日
    浏览(39)
  • 【Kubernetes】k8s使用minio作为对象存储

    k8s version:v1.20.15 minio version :v4.4.16 (1)安装kubectl-minio插件 自选minio-operaterd的版本下载包 minio-operater plugin 访问地址:http://ip:9090 1、sc-minio.yaml 创建 2、 创建所需的永久卷 序号 路径 容量 (G) 说明 所在节点 1 /data/1 5 租户使用 3个节点各1个 2 /data/log1 5 租户使用 3个节点各1个

    2024年04月09日
    浏览(49)
  • Kubernetes(k8s)实战:Kubernetes(k8s)部署Springboot项目

    wordpress是用于快速搭建博客系统。 该yaml文件创建一个mysql,并且生成一个service,service对外暴露的端口是3306 我们发现,搭建成功了,用浏览器访问192.168.56.101:30493,发现访问成功了! 在集群中,pod之间可以通过service 的name进行访问,不仅仅是ip,这就意味着,service中不仅帮

    2024年02月12日
    浏览(95)
  • Kubernetes基础(十八)-k8s存储对象Persistent Volume

    在容器化应用中,Pod的生命周期是短暂的,当Pod终止时,其中的数据通常也会被销毁。为了解决这个问题,Kubernetes引入了Persistent Volume(PV)的概念。PV是集群中的一块持久化存储,它独立于Pod存在,可以被多个Pod共享,并且在Pod终止后仍然保留数据。 PV允许开发者将数据存储

    2024年02月20日
    浏览(36)
  • Kubernetes基础(二十三)-k8s持久化存储详解

    1.1 介绍 在容器中的磁盘文件是短暂的,当容器崩溃时,Kubelet会重新启动容器,但容器运行时产生的数据文件都将会丢失,之后容器会以最干净的状态启动。另外,当一个Pod运行多个容器时,各个容器可能需要共享一些文件,诸如此类的需求都可以使用Volume解决。Pod只需要通

    2024年03月17日
    浏览(45)
  • Kubernetes基础(二十)-k8s存储对象Storage Classes

    在Kubernetes中,Storage Classes是用于定义不同存储配置的资源。它们允许开发者抽象存储的物理细节,使其更易于管理和使用。通过Storage Classes,可以定义存储的类型、性能、卷大小等参数,使得应用程序能够根据需求选择合适的存储。 Storage Classes工作的基本原理是通过定义标

    2024年02月19日
    浏览(42)
  • 集成xxljob项目如何迁移到K8S

    大家好,今天我们将基于XXL-Job,探讨任务调度迁移到云端的相关话题。 XXL-Job是一款功能强大、易用可靠的国产分布式任务调度平台,是目前国内使用比较广泛的分布式任务调度平台之一。它的主要特点包括: 支持分布式、多线程任务调度; 具有完整的管理后台,可以实现

    2024年01月18日
    浏览(134)
  • Kubernetes基础(十九)-k8s存储对象Persistent Volume Claim

    在容器编排中,Pod的生命周期是短暂的,当Pod终止时,其中的数据通常也会被销毁。为了解决这个问题,Kubernetes引入了Persistent Volume(PV)和Persistent Volume Claim(PVC)的概念。 PVC是对PV的一种声明,它定义了Pod对存储资源的需求。Pod通过PVC来请求PV,而PV则提供了实际的存储资

    2024年02月20日
    浏览(35)
  • 【K8S】docker和K8S(kubernetes)理解?docker是什么?K8S架构、Master节点 Node节点 K8S架构图

    一、docker的问世         在LXC(Linux container)Linux容器虚拟技术出现之前,业界网红是虚拟机。虚拟机技术的代表,是VMWare和OpenStack。 虚拟机是什么?         虚拟机其实就是 在你的操作系统里面,装一个软件,然后通过这个软件,再模拟一台甚至多台“子电脑”出来。

    2024年03月26日
    浏览(66)
  • Kubernetes(K8S)使用PV和PVC做存储安装mysql

    首先你需要一个k8s环境,可以参考我写的文章:https://blog.csdn.net/m0_51510236/article/details/130842122 我们可以简单看一下官网的描述:https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/#introduction 持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包