广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >K8s部署PHP项目
  • 168
分享到

K8s部署PHP项目

kuberneteslaravelphp 2023-09-02 06:09:33 168人浏览 独家记忆
摘要

前言         前端时间PHP项目部署升级需要 ,需要把Laravel开发的项目部署k8s上,下面以laravel项目为例,讲解采用yaml文件方式部署项目。 一、部署步骤 1.创建Dockerfile文件 Dockerfile是

前言

        前端时间PHP项目部署升级需要 ,需要把Laravel开发的项目部署k8s上,下面以laravel项目为例,讲解采用yaml文件方式部署项目。

一、部署步骤

1.创建Dockerfile文件

Dockerfile是一个用来构建镜像的文本文件,在容器运行时,需要把项目文件和项目运行所必须的组件安装其中。

# 基础镜像FROM php:7.4-fpm # 时区ARG TZ=Asia/Shanghai # 更换容器时区RUN cp "/usr/share/zoneinfo/$TZ" /etc/localtime && echo "$TZ" > /etc/timezone # 替换成阿里apt-get源RUN sed -i "s@Http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list && rm -rf /var/lib/apt/lists/* && cat /etc/apt/sources.list # 调试扩展# vim net-tools rsyslog procps # 安装扩展RUN apt-get update \  && apt-get install -y libzip-dev zip libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev librdkafka-dev libpng-dev cron supervisor \  && rm -rf /var/lib/apt/lists/* \  && docker-php-ext-configure gd \  && docker-php-ext-install -j$(nproc) gd Mysqli pdo_mysql zip opcache bcmath iconv # 安装kafka扩展COPY deploy/docker/php/ext/rdkafka-5.0.0.tgz /tmp/RUN pecl install /tmp/rdkafka-5.0.0.tgz && docker-php-ext-enable rdkafka # 安装Redis扩展COPY deploy/docker/php/ext/redis-5.3.4.tgz /tmp/RUN pecl install /tmp/redis-5.3.4.tgz && docker-php-ext-enable redis # 创建supervisor日志目录、项目目录RUN mkdir -p /var/log/supervisor && mkdir -p /www # supervisor配置文件COPY deploy/docker/supervisor/conf.d /etc/supervisor/conf.d # 替换php配置文件COPY ./deploy/docker/php/conf.d/opcache.ini /usr/local/etc/php/COPY ./deploy/docker/php/conf.d/phpcustom.ini /usr/local/etc/php/ # CPOY定时任务COPY deploy/docker/cron/root /var/spool/cron/crontabsRUN chmod 600 /var/spool/cron/crontabs/root # 安装composerRUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \    && ln -s $(composer config --global home) /root/composer \    && composer config -g repo.packaGISt composer https://packagist.phpcomposer.com # COPY项目到/www目录COPY . /www # 进入/www目录WORKDIR /www # 删除多余文件RUN rm -rf $(find /www/backend/ -maxdepth 1 ! -name "backend" ! -name "dist") && rm -rf /tmp/* # /www下文件授权用户组和用户权限;composer安装需要包(如果项目composer存在,可不执行)RUN chown -R www-data:www-data /www/storage \    && composer install \        --optimize-autoloader \        --ignore-platfORM-reqs \        --prefer-dist \        --no-interaction \        --no-dev # 执行entrypointCOPY deploy/docker/entrypoint.sh /usr/local/bin/entrypointRUN chmod +x /usr/local/bin/entrypoint ENTRYPOINT ["/usr/local/bin/entrypoint"]

2. 创建命名空间【namespace.yaml】

kubernetes使用命名空间的概念帮助解决集群中在管理对象时的复杂性问题。命名空间允许将对象分组到一起,便于将它们作为一个单元进行筛选和控制;简单理解可以实现项目彼此隔离。

  • 创建Namespace

        kubectl create -f namespace.yaml

  • 查看所有Namespace

         kubectl get namespaces

apiVersion: v1 #版本号kind: Namespace #配置类型metadata: #元数据  name: php-service #该 Namespace 的名称

3. 创建App Env Config【app-env-config.yaml】(laravel .env 配置)

  • 创建App Env Config

          kubectl create -f app-env-config.yaml

  • 查看该命名空间所有Config

          kubectl get --namespace=php-service configmaps

  • 查看该Config

          kubectl get --namespace=php-service configmaps app-env-config

  • 查看该Conifg Yaml

          kubectl get --namespace=php-service configmaps app-env-config -o yaml

apiVersion: v1  #版本号kind: ConfigMap #配置类型metadata: #元数据  name: app-env-config #该 ConfigMap 的名称  namespace: php-service  #该 ConfigMap 所在命名空间data: #该 ConfigMap 数据  # App Config  APP_DEBUG: 'true'  APP_ENV: test  APP_KEY: xxx   # DB Config  DB_DATABASE: xxx  DB_HOST: xx.xx.xx.xx  DB_PASSWord: xxx  DB_USERNAME: xxx   # Jwt Config  JWT_KEY: XXX  JWT_SECRET: XXX  JWT_TOKEN_EXPIRE_TIME: '86400'    # Redis Config  REDIS_DATABASE: '0'  REDIS_HOST: xx.xx.xx.xx  REDIS_PASSWORD: xxx  REDIS_PORT: '6380'  REDIS_PREFIX: xxx

4. 创建Nginx Config【nginx-config.yaml】

  • 创建Nginx Config

           kubectl create -f nginx-config.yaml

  • 查看该创建Config

          kubectl get --namespace=php-service configmaps

  • 查看该Conifg Yaml

          kubectl get --namespace=php-service configmaps nginx-config -o yaml

apiVersion: v1  #版本号kind: ConfigMap #配置类型metadata: #元数据  name: nginx-config  #该 ConfigMap 的名称  namespace: php-service #该 ConfigMap 所在命名空间data: #数据  nginx_conf: |-    user  www-data;    worker_processes  1;     error_log  /var/log/nginx/error.log warn;    pid        /var/run/nginx.pid;     events {        worker_connections  1024;    }     http {        include       /etc/nginx/mime.types;        default_type  application/octet-stream;         log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                          '$status $body_bytes_sent "$http_referer" '                          '"$http_user_agent" "$http_x_forwarded_for"';         access_log  /var/log/nginx/access.log  main;         sendfile        on;        #tcp_nopush     on;         keepalive_timeout  65;         #gzip  on;         server {            listen       80;            server_name  _;            root         /var/www/html/public;            index     index.php;             #charset koi8-r;            #access_log  /var/log/nginx/log/host.access.log  main;             #error_page  404              /404.html;             # redirect server error pages to the static page /50x.html            #            error_page   500 502 503 504  /50x.html;            location = /50x.html {                root   /usr/share/nginx/html;            }             location / {              try_files $uri $uri/ /index.php?$query_string;            }             # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000             location ~ \.php$ {                include fastcgi_params;                fastcgi_param REQUEST_METHOD $request_method;                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;                fastcgi_pass 127.0.0.1:9000;            }             location /backend/  {                index  index.html;                alias  /var/www/html/backend/dist/;            }             location /statics/{                alias /var/www/html/backend/dist/statics/;            }             # deny access to .htaccess files, if Apache's document root            # concurs with nginx's one            #            #location ~ /\.ht {            #    deny  all;            #}        }     }

5. 创建Nginx Service【nginx-service.yaml】

  • 创建Nginx Service

           kubectl create -f nginx-service.yaml

  • 查看该Service

           kubectl get --namespace=php-service service -o wide

  • 查看该Service Yaml

           kubectl get --namespace=php-service service nginx-service -o yaml

apiVersion: v1  #版本号kind: Service #配置类型metadata: #元数据  name: nginx-service #该Service 的名称  namespace: php-service #该 Service 所在命名空间  labels: #标签    app: nginx  #为该 Service 设置 key 为 app,value 为 nginx 的标签spec: #关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问  selector: #标签选择器    app: kayaka   #选择包含标签 app:kayaka 的Pod  type: nodePort  #Serive的类型,ClusterIP/NodePort/LoaderBalancer  ports:    - name: http  #端口的名字      protocol: TCP #协议类型 TCP/UDP      port: 80 #集群内的其他容器组可通过 80 端口访问 Service      #port: 30080 #通过任意节点的 32600 端口访问 Service,不固定自动设置      targetPort: 80 #将请求转发到匹配 Pod 的 80 端口

6. 创建App Deployment【app-deployment.yaml】(主要采用 POD-容器组(php-fpm和nginx)的方式)

  • 创建App Deployment

          kubectl apply -f app-deployment.yaml

  • 查看该命名空间所有Deployment

          kubectl get --namespace=php-service deployments -o wide

  • 查看该Deployment

          kubectl get --namespace=php-service deployments kayaka -o wide

  • 查看该Deployment Yaml

          kubectl get --namespace=php-service deployments kayaka -o yaml   

apiVersion: apps/v1  #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本kind: Deployment  #配置类型,这里使用的是 Deploymentmetadata: #元数据,即 Deployment 的一些基本属性和信息  name: kayaka  #该Deployment 的名称  namespace: php-service  #Pod所属的命名空间  labels: #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组    app: kayaka #为该Deployment设置key为app,value为nginx的标签spec: #该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用  selector: #标签选择器,与上面的标签共同作用,目前不需要理解    matchLabels: #选择包含标签app:kayaka的资源      app: kayaka  replicas: 2 #使用该Deployment创建几个应用程序实例  strategy: #更新策略    type: RollingUpdate #Recreate 重新创建  RollingUpdate 滚动升级  template: #选择或创建的Pod的模板    metadata: #Pod的元数据      labels: #Pod的标签,上面的selector即选择包含标签app:kayaka的Pod        app: kayaka    spec: #期望Pod实现的功能(即在pod中部署)      containers: #生成container,与docker中的container是同一种        - name: kayaka #container的名称          image: harbor.dobest.com/tfctest/kayaka:1.0.0 #镜像地址          imagePullPolicy: Always #镜像拉取策略 Always 总是拉去、IfNotPresent 优先使用本地、Never 仅使用本地          ports: #容器端口            - containerPort: 9000          #env:          #- name: REDIS_HOST          #value: redis-service          envFrom: #ENV 配置来源(无法热更新)            - configMapRef:                name: app-env-config          volumeMounts: #挂载到容器内部的存储卷配置            - name: nginx-www #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名              mountPath: /var/www/html #存储卷在容器内mount的绝对路径              readOnly: false #是否为只读模式          lifecycle: #container 的生命周期            postStart: #容器开始启动执行事件              exec:                command: [ "/bin/sh","-c","cp -r /www/* /var/www/html && chown -R www-data:www-data /var/www/html/storage" ]        - name: nginx          image: nginx:1.7.9          ports:            - containerPort: 80          volumeMounts:            - mountPath: /var/www/html              name: nginx-www            - mountPath: /etc/nginx/nginx.conf              subPath: nginx.conf              name: nginx-config      volumes: #该pod上定义共享存储卷列表        - name: nginx-www #共享存储卷名称 (volumes类型有很多种)          emptyDir: { } #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值        - name: nginx-config  #共享存储卷名称(volumes类型有很多种)          configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部            name: nginx-config            items:              - key: nginx_conf                path: nginx.conf

7. 创建Ingress【ingress.yaml】路由

  • 创建Ingress

          kubectl apply -f ingress.yaml

  • 查看该命名空间所有Ingress

          kubectl get --namespace=php-service ingress -o wide

  • 查看该Ingress

          kubectl get --namespace=php-service ingress ingress

  • 查看该Ingress Yaml

          kubectl get --namespace=php-service ingress ingress -o yaml   

apiVersion: extensions/v1beta1  #版本号kind: Ingress #配置类型metadata: #元数据  name: ingress #该 Ingress 的名称  namespace: php-service  #该 Ingress 所在命名空间  labels: #标签    app: ingressspec: #该 Ingress 的描述  rules: # 规则    - host: test-kyk.sanguosha.com # 域名      http:        paths: # 路径          - backend:              serviceName: nginx-service #服务名称              servicePort: 80 #服务端口            path: /

注意事项

  • 更新 ConfigMap 
    • 使用该 ConfigMap 挂载的 Env 不会同步更新
    • 使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新
    • ENV 是在容器启动的时候注入的,启动之后 kubernetes 就不会再改变环境变量的值,且同一个 namespace 中的 pod 的环境变量是不断累加的,为了更新容器中使用 ConfigMap 挂载的配置,可以通过滚动更新 pod 的方式来强制重新挂载 ConfigMap
  • 定时任务问题
    • 当Pod个数大于1时,每个Pod中容器都存在定时任务,为了避免定时任务冲突,可以使用Redis分布式,使定时任务在其中一个Pod中执行。
  • 项目日志问题
    • laravel日志默认写入文件,日志写入pod中,我们也可创建存储类,但查看日志又存在问题,所以建议写入kafka中,再去消费处理日志。

来源地址:https://blog.csdn.net/qq_34272964/article/details/128322139

--结束END--

本文标题: K8s部署PHP项目

本文链接: https://www.lsjlt.com/news/390005.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • K8s部署PHP项目
    前言         前端时间PHP项目部署升级需要 ,需要把Laravel开发的项目部署K8s上,下面以laravel项目为例,讲解采用yaml文件方式部署项目。 一、部署步骤 1.创建Dockerfile文件 Dockerfile是...
    99+
    2023-09-02
    kubernetes laravel php
  • php项目k8s部署
    好的,首先,Kubernetes (k8s) 是一个容器编排工具,用于管理和部署容器化应用。如果你想将 PHP 项目部署到 k8s 集群,你需要执行以下步骤: 将你的 PHP 项目打包成 Docker 镜像。这可以通过在你的 PHP 项...
    99+
    2023-09-23
    kubernetes php docker 容器 云原生
  • k8s怎么部署php项目
    要在Kubernetes上部署PHP项目,可以按照以下步骤进行操作: 创建一个包含项目代码的Docker镜像。可以使用Docker...
    99+
    2023-10-27
    k8s php
  • k8s如何部署java项目
    这篇文章给大家分享的是有关k8s如何部署java项目的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下载jar的包[root@master test]# wget https://dl...
    99+
    2023-06-22
  • k8s集群部署springboot项目
    一、前言 本篇,我们将基于k8s集群,模拟一个比较接近实际业务的使用场景,使用k8s集群部署一个springboot的项目,我们的需求是: 部署SpringBoot项目到阿里云服务器 ; 基于容器打包,推送私有镜像仓库 ; 采用K8S集群...
    99+
    2023-09-06
    k8s集群部署java应用 k8s部署springboot k8s部署java应用 k8s部署微服务项目 k8s部署微服务
  • Jenkins+harbor+gitlab+k8s 部署maven项目
    maven项目部署流程图如下:   环境介绍操作系统ip角色版本ubuntu-16.04.4-server-amd64192.168.10.122Jenkins+harborJenkins 2.176.2,ha...
    99+
    2023-01-31
    项目 harbor Jenkins
  • k8s部署java项目的实现
    下载jar的包 [root@master test]# wget https://dl.halo.run/release/halo-1.4.16.jar [root@master...
    99+
    2022-11-12
  • 怎么使用docker部署k8s项目
    要使用Docker部署Kubernetes项目,可以按照以下步骤进行操作:1. 安装Docker和Kubernetes:首先,确保已...
    99+
    2023-10-11
    docker k8s
  • k8s怎么实现自动部署go项目
    要实现自动部署Go项目,可以使用Kubernetes(K8s)提供的以下功能: 编写Dockerfile:首先,需要编写一个Do...
    99+
    2023-10-27
    k8s go
  • 手动部署java项目到k8s中的实现
    目录前言1. 生成Demo项目2. 配置Docker环境3. 配置k8s3.1 编写deploy.yaml文件3.2 启动调度4. 验证4.1 查看pod4.2 访问系统5. k8s...
    99+
    2022-11-13
    java部署到k8s
  • springboot项目部署到k8s上的方法步骤
    目录springboot部署到k8s步骤创建secret创建secret创建deployment的yaml文件创建deployment创建service, nodePortsprin...
    99+
    2023-05-19
    springboot部署到k8s
  • (十)服务器K8S集群部署SpringBoot项目实战
    1.准备springboot项目 可以在 https://start.spring.io/网站准备一个项目,这里作为k8s的学习所以springboot项目中准备一个简单的访问接口即可。 2.服务器环境准备 安装Jdk 更新系统软件包: ...
    99+
    2023-08-30
    spring boot 服务器 kubernetes
  • docker如何部署php项目
    要部署一个PHP项目,您可以按照以下步骤使用Docker进行部署:1. 创建一个Dockerfile:在项目根目录下创建一个名为Do...
    99+
    2023-09-20
    docker php
  • centos7怎么部署php项目
    本文操作环境:centos7系统、PHP7.1版、DELL G3电脑centos7怎么部署php项目CentOS 7部署PHP项目的方法:目录一、安装nginx(自动)二、安装mysql三、修改mysql登录密码四、安装PHP及扩展五、配置...
    99+
    2016-02-08
    php centos7
  • 怎么将前端gitlab项目自动化部署到k8s上
    这篇文章主要介绍“怎么将前端gitlab项目自动化部署到k8s上”,在日常操作中,相信很多人在怎么将前端gitlab项目自动化部署到k8s上问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么将前端gitlab...
    99+
    2023-07-05
  • tomcat下如何部署php项目
    这篇文章主要介绍“tomcat下如何部署php项目”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“tomcat下如何部署php项目”文章能帮助大家解决问题。tomcat下部署php项目的方法:1、将p...
    99+
    2023-07-04
  • 怎样远程部署php项目
    今天就跟大家聊聊有关怎样远程部署php项目,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑怎么远程部署php项目?...
    99+
    2023-06-29
  • 怎么远程部署php项目
    本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑怎么远程部署php项目?将PHP项目部署到服务器项目包括一堆php文件,需要连接mysql流程租服务器 -> 配置环境 -> 测试php和数据库环境 ->...
    99+
    2017-02-25
    php 服务器
  • nginx下怎么部署php项目
    本文操作环境:linux5.9.8系统、nginx1.9版、Dell G3电脑。nginx下怎么部署php项目?nginx服务器上部署php项目 nginx本身不能处理PHP页面,它只是个web服务器,当接收到请求后,如果是P...
    99+
    2021-08-22
    nginx php
  • tomcat下怎么部署php项目
    本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。tomcat下怎么部署php项目?tomcat 下部署 php由于需要测试一个PHP的环境。故记录此处。环境OS:win8.1 up1 64bittomcat :8....
    99+
    2022-11-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作