一、背景
接下来占用两篇文章的篇幅来讨论下,像php和h5等静态文件的容器化部署,有哪些部署方式。
- 每个docker容器部署一个nginx + 静态文件,形成一个单独的服务。
- 像ECS那样,nginx对应多个目录,一个目录对应一个服务,每个服务开放一个监听端口。
本文重点围绕着如何部署php程序展开,h5和它类似,就不再赘述。
为了便于理解,我们先会整理两种方案的部署架构,下篇将总结我们在部署过程中遇到的难点。
二、部署架构
1、一个deployment对应一个服务
你需要为每个服务编写一个Dockerfile,把php静态文件拷贝到镜像里。(注意:如果你的静态文件比较大,镜像也会随着增加)
然后制作docker image镜像,推送到仓库。
最后在k8s容器里拉取该镜像。
这种方式和java应用程序的模式一模一样。
但是,php应用程序需要nginx作反向代理,也就是说,在每个Pod里实际运行的是一个nginx容器。
因为这里有slb作负载均衡,故每个服务对外暴露tcp的端口不一。(注意:如果你的Php服务加上h5服务数量比较多,不仅仅是耗slb,更大的原因是前文提到的slb限额配置问题)
2、一个deployment对应多个服务
该部署方案的好处是,可以大大减少k8s的资源消耗,无论你有多少个服务,都只是增加了volume的存储空间。
我们通过不同的目录区分不同的服务,deployment里部署一个nginx容器外加一个fpm容器,读取volume上的静态文件。
三、deployment.yaml
对于第一种部署方案,由于它和java应用程序的部署并无多少差异,且第二种部署方案相对更优。
bash
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-php-super
name: nginx-php-super
namespace: php
spec:
progressDeadlineSeconds: 600
replicas: 4
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx-php-super
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: nginx-php-super
spec:
containers:
# nginx容器
- image: >-
xxx/my-nginx:1.9
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/nginx/nginx.conf
name: volume-1697503641553
subPath: nginx.conf
- mountPath: /etc/nginx/conf.d
name: volume-1697503672567
- mountPath: /fileCache
name: volume-1697509397651
- mountPath: /opt
name: volume-1697512499570
subPath: opt
- command:
- /bin/bash
- /opt/php/start.sh
env:
- name: PATH
value: >-
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/texlive/2019/bin/x86_64-linux/:/root/bin
# php fpm 容器
image: >-
xxx/php-laxfpm:latest
imagePullPolicy: Always
lifecycle:
postStart:
exec:
command:
- /bin/bash
- /opt/php/start_env.sh
name: php-fpm
ports:
- containerPort: 9000
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/opt/remi/php72/php-fpm.conf
name: volume-1697503773889
subPath: php-fpm.conf
- mountPath: /opt/php/cron.sh
name: volume-1697503805652
subPath: cron.sh
- mountPath: /opt/php/start.sh
name: volume-1697503848246
subPath: start.sh
- mountPath: /opt/php/start_env.sh
name: volume-1697503876850
subPath: start_env.sh
- mountPath: /etc/opt/remi/php72/php.ini
name: volume-1697503935073
subPath: php.ini
- mountPath: /fileCache
name: volume-1697509397651
- mountPath: /opt/php
name: volume-1697512499570
subPath: opt/php
- mountPath: /opt/web
name: volume-1697512499570
subPath: opt/web
- mountPath: /opt/h5
name: volume-1697512499570
subPath: opt/h5
- mountPath: /usr/local/texlive
name: volume-1697512499570
subPath: texlive
- mountPath: /etc/supervisord.d
name: volume-1697778917732
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- configMap:
defaultMode: 420
name: nginx.conf
name: volume-1697503641553
- configMap:
defaultMode: 420
name: nginx-php
name: volume-1697503672567
- name: volume-1697509397651
persistentVolumeClaim:
claimName: phpfilecache
- name: volume-1697512499570
persistentVolumeClaim:
claimName: php-fpm
- configMap:
defaultMode: 420
name: php-fpm-config
name: volume-1697503773889
- configMap:
defaultMode: 420
name: scripts
name: volume-1697503805652
- configMap:
defaultMode: 420
name: scripts
name: volume-1697503848246
- configMap:
defaultMode: 420
name: scripts
name: volume-1697503876850
- configMap:
defaultMode: 420
name: php.ini
name: volume-1697503935073
- configMap:
defaultMode: 420
name: supervisord1.d
name: volume-1697778917732
1、start.sh
bash
#!/bin/bash
export PATH=$PATH:/usr/local/texlive/2019/bin/x86_64-linux/
usermod -u 997 apache && groupmod -g 994 apache
chown 997.994 -R /opt/remi/php72
chown 997.994 -R /var/opt/remi/php72
/opt/remi/php72/root/usr/sbin/php-fpm -F -R
2、start_env.sh
bash
#!/bin/bash
/usr/bin/supervisord -c /etc/supervisord.conf &
/usr/sbin/crond &
3、cron.sh
由于php程序没有引进分布式任务调度框架,比如xxl-job,所以它还使用的是自己实现cron表达式的任务自动触发。
bash
#!/bin/bash
cron(){
times="$1"
[ $[times%5] -eq 0 ] && /usr/bin/php72 /opt/php/xxx-service/app/bootstrap_cli.php Paper getAnswer
/usr/bin/php72 /opt/php/xxx-service/public/tp/think.php topic toWord
}
times=1
while :
do
cron $times &
let times++
sleep 60
done
四、service服务
不同的服务,暴露各自的tcp端口给slb,见上图所示。