Kubernetes在一个pod中使用nginx和php及代码三个容器配合搭建PHP生产环境

常用的PHP生产环境包括:Nginx + PHP-FPM + MySQL,即多年以前流行的LNMP环境。在Kubernetes中部署,为了方便管理,提升效率,这几个通常分开为多个不同的container,在同一个pod中运行。

数据库比较重要,实践中一般使用单独的数据库服务(如RDS),而不是自己搭建,因此这里就不详细说了。而运行所需的代码,包括可能的临时目录,又构成一个container,因此总共有3个

  1. nginx, 使用官方镜像nginx即可,这里使用nginx:1.18,锁版本号是一个好习惯。需要修改的便是conf文件,我们通过挂载configmap的方式导入
  2. php, 因为需要安装PHP扩展,一般以官方镜像为基础构建自己的镜像,这里举例使用php:5.6-fpm
  3. web代码,自行构建,这里假设代码路径为/var/www/html

default.conf

server {
    listen 80 default_server;

    root /var/www/html;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
        try_files $uri $uri/ /index.php$uri;
    }

    location ~ \.php/?.*$ {
        fastcgi_pass localhost:9000; # 这里需要和php容器开放的端口一致
        fastcgi_index index.php;
        fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO  $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myphp
  labels:
    app: myphp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myphp
  template:
    metadata:
      labels:
        app: myphp
    spec:
      volumes:
        - name: nginx
          configMap:
            name: nginx-config
            items:
              - key: config
                path: site.conf
        # 如果需要自定义PHP的ini和conf
        # - name: ini
        #   configMap:
        #     name: php-ini
        # - name: conf
        #   configMap:
        #     name: php-conf
        - name: code
          emptyDir: {}
      containers:
        - name: nginx
          image: nginx:1.18
          ports:
            - containerPort: 80
          volumeMounts:
            - name: nginx
              mountPath: /etc/nginx/conf.d
            - name: code
              mountPath: /var/www/html
        - name: php
          image: php:5.6-fpm
          ports:
            - containerPort: 9000
          volumeMounts:
            # 如果需要自定义PHP的ini和conf
            # - name: ini
            #   mountPath: /usr/local/etc/php.ini
            #   subPath: php.ini
            # - name: conf
            #   mountPath: /usr/local/etc/php-fpm.d/www.conf
            #   subPath: www.conf
            - name: code
              mountPath: /var/www/html
      initContainers:
        - name: code
          image: mycode # 这里是自行制作的代码镜像
          imagePullPolicy: Always
          volumeMounts:
            - name: code
              mountPath: /app

其中,mycode镜像需要在启动的时候把代码复制到/app目录下,例如:

FROM busybox
ADD . /code
CMD cp -r /code/* /app

文章原始链接:https://sijie.wang/posts/kubernetes-php-nginx/

本站文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请保留原始链接