Php和h5等静态文件的服务容器化部署(上)

一、背景

接下来占用两篇文章的篇幅来讨论下,像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应用程序的部署并无多少差异,且第二种部署方案相对更优。

在这里插入图片描述

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

#!/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

#!/bin/bash

/usr/bin/supervisord -c /etc/supervisord.conf &
/usr/sbin/crond &

3、cron.sh

由于php程序没有引进分布式任务调度框架,比如xxl-job,所以它还使用的是自己实现cron表达式的任务自动触发。

#!/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,见上图所示。

五、未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天草二十六_简村人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值