前言
? ? ? ? 最近一個(gè)老項(xiàng)目(PHP)需要遷移至阿里云K8s上,之前項(xiàng)目上各種資源都存在服務(wù)器上多個(gè)目錄下,本文就針對(duì)其中資源遷移部署講解。
一、選擇OSS存儲(chǔ)卷原因
出于多種原因選擇掛載OSS存儲(chǔ)卷:
- 項(xiàng)目后期開(kāi)發(fā)功能設(shè)計(jì)上傳,需要上傳OSS服務(wù)(之前都是上傳到ECS服務(wù)上)。
- 若掛載NAS存儲(chǔ)卷,項(xiàng)目平時(shí)需要更換資源,OSS通過(guò)客戶端上傳替換更為方便。
- 項(xiàng)目靜態(tài)資源量很大,且后期還不斷增加,而OSS靜態(tài)存儲(chǔ)卷是阿里云對(duì)象存儲(chǔ)OSS中的一種存儲(chǔ)類型,用于存儲(chǔ)靜態(tài)數(shù)據(jù),包括圖片、視頻、js、html、css等等。OSS靜態(tài)存儲(chǔ)卷具有海量、安全、低成本、高可靠等特性,支持?jǐn)?shù)據(jù)讀寫(xiě)和在線修改,適用于Web網(wǎng)站圖片存儲(chǔ)、動(dòng)靜資源分離等業(yè)務(wù)場(chǎng)景。
- 項(xiàng)目業(yè)務(wù)資源寫(xiě)少讀多,OSS存儲(chǔ)卷更適合,如果您的業(yè)務(wù)是將文件寫(xiě)入存儲(chǔ)的場(chǎng)景,推薦使用NAS存儲(chǔ)卷服務(wù)。
- OSS支持同時(shí)被多個(gè)Pod掛載。
二、通過(guò)kubectl命令行的方式使用OSS靜態(tài)存儲(chǔ)卷
1.創(chuàng)建Secret
- 創(chuàng)建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
- ?執(zhí)行以下命令創(chuàng)建保密字典
kubectl create -f oss-secret.yaml
2.使用Secret創(chuàng)建靜態(tài)卷PV
- 創(chuàng)建靜態(tài)卷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> # 創(chuàng)建 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: "/"
- 使用命令創(chuàng)建靜態(tài)卷PV
kubectl create -f pv-oss.yaml
?參數(shù)解析:
name | PV的名稱。 |
labels | 配置PV的標(biāo)簽。 |
storage | OSS的可使用量。 |
accessModes | 配置訪問(wèn)模式。 |
persistentVolumeReclaimPolicy | PV回收策略。 |
driver | 定義驅(qū)動(dòng)類型。取值為ossplugin.csi.alibabacloud.com,表示使用OSS CSI插件。 |
nodePublishSecretRef | 定義掛載PV時(shí)通過(guò)Secret對(duì)象來(lái)獲取AccessKey信息。 |
volumeHandle | 配置PV的名稱。 |
bucket | 需要掛載的OSS Bucket。 |
url | 掛載OSS的接入域名。
不同域名訪問(wèn)格式如下:
|
otherOpts | 掛載OSS時(shí)支持輸入定制化參數(shù),格式為:-o *** -o *** 。 |
path | 表示掛載時(shí)相對(duì)Bucket根文件的目錄結(jié)構(gòu),默認(rèn)為/(v1.14.8.32-c77e277b-aliyun及之后版本支持)。 |
3.創(chuàng)建靜態(tài)卷PVC
- 創(chuàng)建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 保持一致
參數(shù) | 說(shuō)明 |
---|---|
name | PVC的名稱。 |
accessModes | 配置訪問(wèn)模式。 |
storage | 聲明應(yīng)用使用量,不能大于存儲(chǔ)卷的總量。 |
alicloud-pvname | 通過(guò)標(biāo)簽關(guān)聯(lián)PV,與PV標(biāo)簽保持一致。 |
- 使用命令創(chuàng)建PVC
kubectl create -f pvc-oss.yaml
三、創(chuàng)建應(yīng)用
1.以Nginx服務(wù)掛載為例
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
參數(shù) | 說(shuō)明 |
---|---|
mountPath |
OSS在容器中掛載的位置。 |
|
PVC的名稱,用于綁定PVC |
四、問(wèn)題
1.OSS存儲(chǔ)掛載權(quán)限問(wèn)題
OSS掛載默認(rèn)使用Linux的root權(quán)限進(jìn)行掛載,此時(shí)目錄和文件權(quán)限是400,由于權(quán)限問(wèn)題,掛載之后無(wú)法向里面寫(xiě)入數(shù)據(jù),如果需要修改掛載配置,可以在OSS靜態(tài)卷PV中增加otherOpts字段的配置,添加配置的格式例如otherOpts: "-o max_stat_cache_size=0 -o allow_other -o mp_umask=133"
,具體配置權(quán)限說(shuō)明如下。
- -o max_stat_cache_size=0:設(shè)置最大狀態(tài)緩存大小為0,表示不限制狀態(tài)緩存的大小,可以提高目錄列表顯示性能。
- -o allow_other:允許其他用戶訪問(wèn)被www-data用戶擁有的文件。
- -o mp_umask=133:設(shè)置文件創(chuàng)建時(shí)的umask為133,這意味著新創(chuàng)建的文件將只有可讀可寫(xiě)可執(zhí)行的權(quán)限,可以保證文件的安全性。
-
修改掛載掩碼權(quán)限:
-
若指定掛載目錄的權(quán)限為644,在otherOpts字段中增加配置:
-o mp_umask=133
。 -
若指定掛載目錄里文件的權(quán)限為644,在otherOpts字段中增加配置:
-o umask=133
。
-
-
指定掛載目錄里文件的角色權(quán)限:
-
GroupID權(quán)限為指定權(quán)限,在otherOpts字段中增加配置:
-o gid=XXX
,其中,XXX為您在/etc/password
中記錄的角色組ID。 -
UserID權(quán)限為指定權(quán)限,在otherOpts字段中增加配置:
-o uid=XXX
,其中,XXX為您在/etc/password
中記錄的角色I(xiàn)D。
-
1.php-fpm執(zhí)行文件和目錄問(wèn)題
由于項(xiàng)目是一個(gè)PHP項(xiàng)目,項(xiàng)目執(zhí)行用戶和用戶組是www-data:www-data(鏡像php-fpm默認(rèn)配置),dockerfile打包到鏡像中中默認(rèn)是root:root,此時(shí)項(xiàng)目由于權(quán)限問(wèn)題無(wú)法運(yùn)行??梢酝ㄟ^(guò)dockerfile打包時(shí)執(zhí)行文件用戶和用戶組,下面我展示php-fpm打包yaml文件,關(guān)注最后
FROM php:7.2.34-fpm-alpine
LABEL MAINTAINER="xxx xxxn@xxx.xxx"
# 參數(shù)
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
# 調(diào)整時(shí)區(qū)
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 擴(kuò)展
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 項(xiàng)目 /www 目錄,指定用戶:用戶組
COPY --chown=www-data:www-data . /www
五、遷移工具
由于判斷的資源文件存在ECS上,在遷移前文件不斷產(chǎn)生,如果手動(dòng)復(fù)制文件就顯示很麻煩,這里給大家推薦一個(gè)功能,可以輕松完成ECS資源同步OSS。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-539670.html
工具"ossutil",Object和Bucket的命令行管理工具。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-539670.html
- 提供方便、簡(jiǎn)潔、豐富的Object和Bucket管理命令,操作性能好。
- 支持文件并發(fā)上傳、斷點(diǎn)續(xù)傳。
- 支持文件目錄(文件夾)的上傳下載。
到了這里,關(guān)于PHP項(xiàng)目遷移K8s之OSS存儲(chǔ)卷的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!