k8s实战之手动部署PHP项目和Java项目

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 对k8s刚入门的朋友而言,光搭建k8s集群是不够的,我们需要更多的理论加实战,才能更好的掌握k8s的好处,当我们成功部署一个k8s集群之后,我们需要在实际项目中进行应用,本文简单的介绍了当前比较主流的PHP项目和Java项目的部署。

传统部署与K8S部署区别


通常使用传统的部署的时候,我们一个web项目,网站的搭建,往往使用的如下的一种整体架构,可能有的公司在某一环节使用的东西是不一样,但是大体的框架流程是都是差不多的


640.png


使用K8S部署,便于弹性伸缩,节约资源,发布周期快,整体框架如下:


640.png


准备环境


192.168.73.138  k8s-Master

192.168.73.139  k8s-node01

192.168.73.140  k8s-node02

192.168.73.136  Harbor镜像仓库


1 php项目部署流程


当我们把项目迁移到K8S平台上时,首先我们需要了解的是整个部署的流程,按照这个流程部署,才能避免出现问题,也方便大家理解


640.png


github项目地址https://github.com/zhangdongdong7/php-demo.git


1.1 制作镜像


使用Dockerfile制作镜像,把应用程序、运行环境、文件系统一起打包成一个镜像,然后推送到Harbor镜像仓库中


首先在k8s的master节点进行操作


    [root@k8s-master ]# git clone https://github.com/zhangdongdong7/php-demo.git[root@k8s-master ]# cd php-demo[root@k8s-master php-demo]# lsdeployment.yaml  ingress.yaml  mysql.yaml  namespace.yaml  README.md  service.yaml  wordpress


    使用wordpress创建一个博客网站,打开wordpress,编写Dockerfile构建镜像,然后推送到一个harbor镜像仓库中,可以看前面章节,harbor镜像的搭建,这里是使用的harbor镜像仓库地址为192.168.73.136,数据库mysql安装也是在192.168.73.136主机上


      #修改数据库连接地址[root@k8s-master php-demo]cd wordpress[root@k8s-master wordpress]# vim wp-config.php...// ** MySQL 设置 - 具体信息来自您正在使用的主机 ** ///** WordPress数据库的名称 */define('DB_NAME', 'wp');
      /** MySQL数据库用户名 */define('DB_USER', 'root');
      /** MySQL数据库密码 */define('DB_PASSWORD', '123456');
      /** MySQL主机 */define('DB_HOST', '192.168.73.136:3306');
      /** 创建数据表时默认的文字编码 */define('DB_CHARSET', 'utf8mb4');
      /** 数据库整理类型。如不确定请勿更改 */define('DB_COLLATE', '');
      ...


        #编写Dockerfile构建镜像[root@k8s-master wordpress]# vim Dockerfile FROM registry.cn-hangzhou.aliyuncs.com/sunsharing/nginx-php:latestMAINTAINER www.ctnrs.comADD . /usr/local/nginx/html[root@k8s-master wordpress]docker login 192.168.73.136[root@k8s-master wordpress]docker build -t 192.168.73.136/test/php-demo:latest . [root@k8s-master wordpress]docker push 192.168.73.136/test/php-demo:latest


        1.2 创建控制器管理pod


        回到php-demo目录编写yaml,首先部署一个test的命令空间


          [root@k8s-master wordpress]# cd ../[root@k8s-master php-demo]# vim namespace.yaml apiVersion: v1kind: Namespacemetadata:  name: test[root@k8s-master php-demo]# kubectl apply -f  namespace.yaml


          创建harbor私有仓库认证


          [root@k8s-master php-demo]# kubectl create secret docker-registry registry-pull-secret —docker-username=admin —docker-password=Harbor12345 —docker-email=123@qq.com —docker-server=192.168.73.136 -n test


          编写deployment.yaml控制器,这里需要把image进行修改成刚才推送到Harbor镜像仓库中的地址


            [root@k8s-master php-demo]# vim deployment.yaml apiVersion: apps/v1beta1kind: Deploymentmetadata:  name: php-demo  namespace: testspec:  replicas: 2  selector:    matchLabels:      project: www      app: php-demo  template:    metadata:      labels:        project: www        app: php-demo    spec:      imagePullSecrets:      - name: registry-pull-secret      containers:      - name: nginx        image: 192.168.73.136/test/php-demo:v3        imagePullPolicy: Always        ports:        - containerPort: 80          name: web          protocol: TCP        resources:          requests:            cpu: 0.5            memory: 256Mi          limits:            cpu: 1            memory: 1Gi        resources:          requests:            cpu: 0.5            memory: 256Mi          limits:            cpu: 1            memory: 1Gi        livenessProbe:          httpGet:            path: /status.php            port: 80


            1.3 pod数据持久化


            这里演示的是一个静态的web网站,基本不需要做持久化,直接把代码打包到了镜像中


            1.4 暴露应用


            创建一个service来暴露应用,直接使用的了ingress控制器的方式暴露应用了


              [root@k8s-master php-demo]# vim service.yamlapiVersion: v1kind: Servicemetadata:  name: php-demo  namespace: testspec:  selector:    project: www    app: php-demo  ports:  - name: web    port: 80    targetPort: 80[root@k8s-master php-demo]# kubectl apply -f service.yaml[root@k8s-master php-demo]# kubectl get pods,svc -n test -o wideNAME                                    READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATESpod/php-demo-66d9c64968-4r4vn           1/1     Running   0          24h   10.244.1.73   k8s-node01   <none>           <none>pod/php-demo-66d9c64968-8zw9s           1/1     Running   0          24h   10.244.2.43   k8s-node02   <none>           <none>
              NAME                       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE   SELECTORservice/php-demo           NodePort    10.1.136.96   <none>        80:32625/TCP   23h   app=php-demo,project=www[root@k8s-master php-demo]#


              1.5 创建ingress对外发布应用


              编写yaml,首先创建ingress控制器,创建ingress,最后可以查看pod,svc,ingress的状态,全部都正常可以开始下一步,如果有异常可以使用kubectl describe命令查看日志进行排错


                [root@k8s-master java-demo]# kubectl apply -f mandatory.yaml[root@k8s-master php-demo]# vim ingress.yaml apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: php-demo  namespace: testspec:  rules:    - host: php.ctnrs.com      http:        paths:        - path: /          backend:            serviceName: php-demo            servicePort: 80[root@k8s-master php-demo]# kubectl apply -f ingress.yaml [root@k8s-master php-demo]# kubectl get pod,svc,ingress -n test -o wideNAME                                    READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATESpod/php-demo-66d9c64968-4r4vn           1/1     Running   0          24h   10.244.1.73   k8s-node01   <none>           <none>pod/php-demo-66d9c64968-8zw9s           1/1     Running   0          24h   10.244.2.43   k8s-node02   <none>           <none>
                NAME                       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE   SELECTORservice/php-demo           NodePort    10.1.136.96   <none>        80:32625/TCP   24h   app=php-demo,project=wwwNAME                                  HOSTS            ADDRESS   PORTS   AGEingress.extensions/php-demo           php.ctnrs.com              80      24h


                可以在集群之外找一个虚机创建数据库,我是在harbor镜像仓库安装


                  docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7docker exec -it mysql:5.7 bashmysql -uroot -p$MYSQL_ROOT_PASSWORDcreate database wp;


                  2.6 绑定本机hosts,访问域名验证


                  windows系统,hosts文件地址:C:\Windows\System32\drivers\etc,Mac系统sudo vi /private/etc/hosts 编辑hosts文件,在底部加入域名和ip,用于解析,这个ip地址为node节点ip地址


                  加入如下命令,然后保存


                    192.168.73.139 php.ctnrs.com


                    在浏览器中,输入php.ctnrs.com,会跳转到初始化设置界面,设置对应的账号,然后安装,登录,然后就可以编辑文章发布了,一个简单的WordPress的php网站搭建完成


                    640.png


                    640.jpg

                    2 Java项目部署流程


                    部署流程如下,跟php的网址一样


                    640.png


                    github项目地址https://github.com/zhangdongdong7/java-demo.git


                    2.1 制作镜像


                    使用Dockerfile制作镜像,把应用程序、运行环境、文件系统一起打包成一个镜像,然后推送到Harbor镜像仓库中


                    • 首先在k8s的master节点进行操作


                    [root@k8s-master ]# git clone https://github.com/zhangdongdong7/java-demo.git[root@k8s-master java-demo]# cd java-demo[root@k8s-master java-demo]# lsdeployment.yaml  ingress.yaml    mysql.yaml      README.md     tomcat-java-demo-master.zip deploy.yml       mandatory.yaml  namespace.yaml  service.yaml[root@k8s-master java-demo]# unzip tomcat-java-demo-master.zip[root@k8s-master java-demo]# cd tomcat-java-demo-master/


                    • 安装环境


                    [root@k8s-master tomcat-java-demo-master]# yum install java-1.8.0-openjdk maven -y


                    • 编译构建
                      如果maven构建慢的话,默认是官方源,可以换阿里云的源vim /etc/maven/settings.xml,大概在(159-164行),更换为如下代码


                    [root@k8s-master tomcat-java-demo-master]# vim /etc/maven/settings.xml        ...    <mirror>      <id>central</id>      <mirrorOf>central</mirrorOf>      <name>aliyun maven</name>      <url>https://maven.aliyun.com/repository/public</url>    </mirror>    ...[root@k8s-master tomcat-java-demo-master]# mvn clean package -Dmaven.test.skip=true......[root@k8s-master tomcat-java-demo-master]# lsdb  Dockerfile  LICENSE  pom.xml  README.md  src  target


                    • Dockerfile已经打包好了,ls可以查看目录中已经存在,可以查看一下


                      [root@k8s-master tomcat-java-demo-master]# cat Dockerfile FROM lizhenliang/tomcat LABEL maintainer www.ctnrs.comRUN rm -rf /usr/local/tomcat/webapps/ADD target/.war /usr/local/tomcat/webapps/ROOT.war


                      • 在tomcat目录下构建镜像


                        [root@k8s-master tomcat-java-demo-master]# docker login 192.168.73.136Authenticating with existing credentials…WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded[root@k8s-master tomcat-java-demo-master]docker build -t 192.168.73.136/test/java-demo:latest .[root@k8s-master tomcat-java-demo-master]docker push 192.168.73.136/test/java-demo:latest


                        • 回到上一层java-demo目录中


                          [root@k8s-master tomcat-java-demo-master]# cd ../[root@k8s-master java-demo]# lsdb               deploy.yml    mandatory.yaml  namespace.yaml  service.yaml             tomcat-java-demo-master.zipdeployment.yaml  ingress.yaml  mysql.yaml      README.md       tomcat-java-demo-master[root@k8s-master java-demo]#


                          • 创建一个test的命名空间


                            [root@k8s-master java-demo]# cat namespace.yaml apiVersion: v1kind: Namespacemetadata:  name: test namespace.yaml[root@k8s-master java-demo]# kubectl apply -f namespace.yaml


                            • 创建一个harbor仓库的拉取镜像认证,,如果搭建php网站的时候创建过认证,这一步可以不用再创建,跳过


                            [root@k8s-master java-demo]# kubectl create secret docker-registry registry-pull-secret —docker-username=admin —docker-password=Harbor12345 —docker-email=123@qq.com —docker-server=192.168.73.136 -n test


                            2.2 创建控制器管理pod


                            • 编写deployment.yaml,创建pods,这里需要把image进行修改成刚才推送到Harbor镜像仓库中的地址


                              [root@k8s-master java-demo]# vim deployment.yaml apiVersion: apps/v1beta1kind: Deploymentmetadata:  name: tomcat-java-demo  namespace: testspec:  replicas: 2  selector:    matchLabels:      project: www      app: java-demo  template:    metadata:      labels:        project: www        app: java-demo    spec:      imagePullSecrets:      - name: registry-pull-secret      containers:      - name: tomcat        image: 192.168.73.136/test/java-demo:latest        imagePullPolicy: Always        ports:        - containerPort: 8080          name: web          protocol: TCP        resources:          requests:            cpu: 0.25            memory: 1Gi          limits:            cpu: 1            memory: 2Gi        livenessProbe:          httpGet:            path: /            port: 8080          initialDelaySeconds: 60          timeoutSeconds: 20        readinessProbe:          httpGet:            path: /            port: 8080          initialDelaySeconds: 60[root@k8s-master java-demo]# kubectl adpply -f deployment.yaml


                              2.3 pod数据持久化


                              这里演示的是一个静态的web网站,基本不需要做持久化,直接把代码打包到了镜像中


                              2.4 暴露应用


                              创建一个service来暴露应用,直接使用的了ingress控制器的方式暴露应用了


                                [root@k8s-master java-demo]# cat service.yamlapiVersion: v1kind: Servicemetadata:  name: tomcat-java-demo  namespace: testspec:  selector:    project: www    app: java-demo  ports:  - name: web    port: 80    targetPort: 8080[root@k8s-master java-demo]# kubectl apply -f service.yaml


                                2.5 创建ingress对外发布应用


                                编写yaml,因为刚才php项目创建过ingress控制器,因此可以不用创建,直接创建

                                ingress,最后可以查看pod,svc,ingress的状态,全部都正常可以开始下一步,如果有异常可以使用kubectl describe命令查看日志进行排错


                                  [root@k8s-master java-demo]# cat ingress.yaml apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: tomcat-java-demo   namespace: testspec:  rules:    - host: java.ctnrs.com      http:        paths:        - path: /          backend:            serviceName: tomcat-java-demo             servicePort: 80[root@k8s-master java-demo]# kubectl apply -f ingress.yaml[root@k8s-master java-demo]# kubectl get pod,svc,ingress -n test -o wideNAME                                    READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATESpod/php-demo-66d9c64968-4r4vn           1/1     Running   0          24h   10.244.1.73   k8s-node01   <none>           <none>pod/php-demo-66d9c64968-8zw9s           1/1     Running   0          24h   10.244.2.43   k8s-node02   <none>           <none>pod/tomcat-java-demo-5f4f64dd4b-tcmtv   1/1     Running   0          24h   10.244.2.42   k8s-node02   <none>           <none>pod/tomcat-java-demo-5f4f64dd4b-vvx5x   1/1     Running   0          24h   10.244.1.72   k8s-node01   <none>           <none>
                                  NAME                       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE   SELECTORservice/php-demo           NodePort    10.1.136.96   <none>        80:32625/TCP   24h   app=php-demo,project=wwwservice/tomcat-java-demo   ClusterIP   10.1.198.15   <none>        80/TCP         24h   app=java-demo,project=www
                                  NAME                                  HOSTS            ADDRESS   PORTS   AGEingress.extensions/php-demo           php.ctnrs.com              80      24hingress.extensions/tomcat-java-demo   java.ctnrs.com             80      24h[root@k8s-master java-demo]#


                                  2.6 绑定本机hosts,访问域名验证


                                  windows系统,hosts文件地址:C:\Windows\System32\drivers\etc,Mac系统sudo vi /private/etc/hosts 编辑hosts文件,在底部加入域名和ip,用于解析,这里的ip是node的ip地址


                                  加入如下命令,然后保存


                                  192.168.73.139 java.ctnrs.com


                                  在浏览器中输入java.ctnrs.com访问


                                  640.jpg


                                  相关实践学习
                                  深入解析Docker容器化技术
                                  Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
                                  相关文章
                                  |
                                  6月前
                                  |
                                  安全 Java 开发者
                                  告别NullPointerException:Java Optional实战指南
                                  告别NullPointerException:Java Optional实战指南
                                  329 119
                                  |
                                  7月前
                                  |
                                  存储 前端开发 Java
                                  【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
                                  本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
                                  784 0
                                  |
                                  7月前
                                  |
                                  Java 开发者
                                  Java并发编程:CountDownLatch实战解析
                                  Java并发编程:CountDownLatch实战解析
                                  558 100
                                  |
                                  7月前
                                  |
                                  IDE 安全 Java
                                  Lombok 在企业级 Java 项目中的隐性成本:便利背后的取舍之道
                                  Lombok虽能简化Java代码,但其“魔法”特性易破坏封装、影响可维护性,隐藏调试难题,且与JPA等框架存在兼容风险。企业级项目应优先考虑IDE生成、Java Records或MapStruct等更透明、稳健的替代方案,平衡开发效率与系统长期稳定性。
                                  447 115
                                  |
                                  7月前
                                  |
                                  人工智能 Java API
                                  Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
                                  随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
                                  2535 8
                                  |
                                  7月前
                                  |
                                  人工智能 Java API
                                  Java与大模型集成实战:构建智能Java应用的新范式
                                  随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
                                  1101 12
                                  |
                                  6月前
                                  |
                                  存储 人工智能 算法
                                  从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
                                  在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
                                  |
                                  6月前
                                  |
                                  机器学习/深度学习 人工智能 监控
                                  Java与AI模型部署:构建企业级模型服务与生命周期管理平台
                                  随着企业AI模型数量的快速增长,模型部署与生命周期管理成为确保AI应用稳定运行的关键。本文深入探讨如何使用Java生态构建一个企业级的模型服务平台,实现模型的版本控制、A/B测试、灰度发布、监控与回滚。通过集成Spring Boot、Kubernetes、MLflow和监控工具,我们将展示如何构建一个高可用、可扩展的模型服务架构,为大规模AI应用提供坚实的运维基础。
                                  441 0
                                  |
                                  7月前
                                  |
                                  存储 小程序 Java
                                  热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
                                  小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
                                  |
                                  7月前
                                  |
                                  关系型数据库 MySQL PHP
                                  PHP和Mysql前后端交互效果实现
                                  本文介绍了使用PHP连接MySQL数据库的基本函数及其实现案例。内容涵盖数据库连接、选择数据库、执行查询、获取结果等常用操作,并通过用户登录和修改密码的功能实例,展示了PHP与MySQL的交互过程及代码实现。
                                  420 0
                                  PHP和Mysql前后端交互效果实现

                                  推荐镜像

                                  更多