香橙派4和树莓派4B构建K8S集群实践之六:App服务部署

news2024/11/25 10:04:02

目录

1. 说明

1.1 关于PHP+Nginx体系的WebApp,这里将实践两种部署模式:

1.2 配置清单

2. PHP+Nginx体系的WebApp部署

2.1 单节点多容器模式A

2.1.1 准备工作

2.2.2 部署

2.2.3 访问效果

​编辑  

2.2 多节点单容器模式B

2.2.1 准备工作

 2.2 配置虚拟主机

3. Java Springboot 虚拟主机

4. 会话Session保持设置

5. 遇到的问题

6. 参考


1. 说明

- 根据之前的k8s基础,我打算设置两种不同的虚拟主机运行在这个K8s集群上面,一个是PHP+Nginx体系的WebApp,一个是Java SpringBoot体系的WebApp。

1.1 关于PHP+Nginx体系的WebApp,这里将实践两种部署模式:

  • 单节点多容器模式 A - 即跨容器的设计模式,目的是在单个主机上运行多个具有超亲密关系的容器(进程),因此容器管理系统需要将其作为一个原子单位进行统一调度。Kubernetes编排系统设计的Pod概念就是该设计模式的实现之一。
  • 多节点单容器协作模式 B - 将分布式应用(eg:nginx, php, mariadb...)的每个实例分布于多个节点,分别以单节点模式运行

1.2 配置清单

- wwwroot 是之前做pvc定义的文件目录,形如:/data0/nfs/iot-age-wwwroot-pvc-202ba85a-fd3f-4817-98ea-6764f9ec0d55

模式主机域名体系指向hosts ip 项目存放路径
Aphpmyadmin.k8s-t2.comPHP192.168.0.106/var/www/app
Bt1.k8s-t1.comPHP192.168.0.106wwwroot/t1
Bt2.k8s-t1.comPHP192.168.0.106wwwroot/t2

2. PHP+Nginx体系的WebApp部署

2.1 单节点多容器模式A

2.1.1 准备工作

以广为人知的phpmyadmin为示范app, 首先用buildkit工具打包成镜像,并上传到 hub.docker.com (这是我的镜像链接 https://hub.docker.com/repository/docker/bennybi/phpmyadmin/general) 。 

buildctl build \
    --frontend=dockerfile.v0 \
    --local context=. \
    --local dockerfile=. \
    --export-cache type=inline \
    --output type=image,name=docker.io/bennybi/phpmyadmin:v1,push=true

 Dockerfile

# This Dockerfile uses the latest version of the Bitnami PHP-FPM Docker image
FROM alpine:latest

# Copy app's source code to the /app directory
COPY . /app

# The application's directory will be the working directory
WORKDIR /app

2.2.2 部署

依据模式A的思想,模式A是用于快捷方便地部署单一应用,所以我把相关的设置都统一到 phpmyadmin.k8s-t2.com.yaml文件中定义, 其中规则:

  • 项目名或domain需替换 "." 为 "-" 切换为部署名, 如phpmyadmin.k8s-t2.com => phpmyadmin-k8s-t2-com
  • 容器中以刚才上传的镜像为initContainer,部署代码
  • nginx, php-fpm为容器服务,nginx调用local-php-fpm:9000 解释php运行时逻辑
  • 打包时,需在代码预先定义与数据库服务的连接,如:my-release-mariadb-galera.default,这里没做额外的configmap
# Service
apiVersion: v1
kind: Service
metadata:
  name: phpmyadmin-k8s-t2-com
  namespace: iot-age
spec:
  type: ClusterIP
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800
  ports:
  - name: nginx
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: phpmyadmin-k8s-t2-com

---
# deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: phpmyadmin-k8s-t2-com
  namespace: iot-age
spec:
  replicas: 2
  selector:
    matchLabels:
      app: phpmyadmin-k8s-t2-com
  template:
    metadata:
      labels:
        app: phpmyadmin-k8s-t2-com
    spec:
      hostAliases:
      - ip: "127.0.0.1"
        hostnames:
        - "local-php-fpm"
      # 私有docker 镜像仓库
      # imagePullSecrets:
      # - name: registrykey-qlcoud-1
      # 自定义设置POD的hosts
      initContainers:
      - name: app-php
        image: "bennybi/phpmyadmin:v1"
        imagePullPolicy: Always
        # 复制php程序文件到wwwroot volume
        command: ["sh", "-c", "cp -r /app /appdata"]
        volumeMounts:
        - mountPath: /appdata
          name: wwwroot
      containers:
      #php-fpm php运行环境
      - name: php-fpm
        image: "bennybi/php-fpm:v1"
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - mountPath: /var/www
          name: wwwroot
      #webserver
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        ports:
        - containerPort: 80
        volumeMounts:
        - name: wwwroot
          mountPath: /var/www
        - name: nginx-conf
          mountPath: /etc/nginx/conf.d/
      #做一个emptyDir类型,名为wwwroot的volume 用于多个容器共享同一个挂载
      volumes:
      - name: wwwroot
        emptyDir: {}
      - name: nginx-conf
        configMap:
          name: phpmyadmin-k8s-t2-com.nginx-conf
          
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: phpmyadmin-k8s-t2-com.nginx-conf
  namespace: iot-age
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: >
      {"apiVersion":"v1","data":{"default.conf":"server {\n    listen      
      80;\n    listen  [::]:80;\n    server_name  localhost;\n    \n    index
      index.php index.html;\n    error_log  /var/log/nginx/error.log;\n   
      access_log /var/log/nginx/access.log;\n    root /var/www/html;\n   
      location / {\n        try_files $uri $uri/ /index.php?$query_string;\n   
      }\n\n    #location / {\n    #    #root   /usr/share/nginx/html;\n    #   
      root   /var/www/html;\n    #    index  index.php index.html
      index.htm;\n    #}\n    \n    location ~ \\.php$ {\n        try_files $uri
      =404;\n        fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n       
      fastcgi_pass   local-php-fpm:9000;\n        fastcgi_index  index.php;\n       
      include        fastcgi_params;\n        fastcgi_param SCRIPT_FILENAME
      $document_root$fastcgi_script_name;\n        fastcgi_param PATH_INFO
      $fastcgi_path_info;\n    }\n\n    error_page   500 502 503 504 
      /50x.html;\n    location = /50x.html {\n        root  
      /usr/share/nginx/html;\n   
      }\n}\n"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"phpmyadmin-k8s-t2-com.nginx-conf","namespace":"iot-age"}}
data:
  default.conf: |
    server {
        listen       80;
        listen  [::]:80;
        server_name  localhost;
        
        index index.php index.html;
        error_log  /var/log/nginx/error.log;
        access_log /var/log/nginx/access.log;
        root /var/www/app;
        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        #location / {
        #    #root   /usr/share/nginx/html;
        #    root   /var/www/html;
        #    index  index.php index.html index.htm;
        #}
        
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass   local-php-fpm:9000;
            fastcgi_index  index.php;
            include        fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
    
---
# Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: phpmyadmin-k8s-t2-com
  namespace: iot-age
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/affinity: cookie
    nginx.ingress.kubernetes.io/session-cookie-name: stickounet
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
spec:
  rules:
    - host: phpmyadmin.k8s-t2.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: phpmyadmin-k8s-t2-com
              port:
                number: 80
  ingressClassName: nginx

2.2.3 访问效果

  

2.2 多节点单容器模式B

2.2.1 准备工作

先在本地准备好两个t1,t2文件夹,里面各放置一个index.php

<?
echo "T1 Site is {$_SERVER['HTTP_HOST']} <br>";
phpinfo();
<?
echo "T2 Site is {$_SERVER['HTTP_HOST']} <br>";
phpinfo();

 上传到设置表格描述的对应路径

 当前容器组截图

 2.2 配置虚拟主机

在KubeSphere后台,去 配置-》配置字典,在nginx-conf配置项中,点编辑设置

添加数据项,t1.k8s-t1.com.conf &  t2.k8s-t1.com.conf

server {
        listen       80;
        listen  [::]:80;
        server_name  t1.k8s-t1.com;
        
        index index.php index.html;
        error_log  /var/log/nginx/t1.error.log;
        access_log /var/log/nginx/t1.access.log;
        root /var/www/html/t1;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
          expires 30d;
          access_log off;
        }

        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }
        
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass   php:9000;
            fastcgi_index  index.php;
            include        fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }

 完成后,需重启nginx pods, 可分别访问这两个域名验证结果

3. Java Springboot 虚拟主机

... 待补充

4. 会话Session保持设置

这是当使用phpmyadmin时,遇到错误:

Failed to set session cookie. Maybe you are using HTTP instead of HTTPS to access phpMyAdmin. 

     我很快意识到这是由于访问请求被分配到不同的php pods上处理,而导致的session不同步引起的,解决办法:设置 ingress, nginx service, php service会话保持(即相同client ip的访问分配到相同pod, 有过期时间)

nginx.yaml

...
spec:
  type: ClusterIP
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800

php.yaml

...
spec:
  type: ClusterIP
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800

ingress-nginx.yaml

...
metadata:
  name: ia-web-service1
  namespace: iot-age
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/affinity: cookie
    nginx.ingress.kubernetes.io/session-cookie-name: stickounet
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"

5. 遇到的问题

-不能用软链方式访问项目目录,在找解决办法

6. 参考

- Kubernetes的Pod研究(3)--Pod设计模式和生命周期_wx6325de70699f3的技术博客_51CTO博客

- 聊聊如何在K8S中实现会话保持_k8s service 会话保持_linyb极客之路的博客-CSDN博客

- PHP项目采用多个Docker镜像的方式在Kubernets平台的部署 - 知乎 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/578928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

笔记 | FastAPI创建新项目

当使用FastAPI创建项目时&#xff0c;首先需要安装FastAPI和其依赖项。可以使用pip来安装它们。请确保已经安装了Python和pip。 创建项目文件夹并进入该文件夹&#xff1a; mkdir myproject cd myproject创建并激活一个新的Python虚拟环境&#xff08;可选&#xff0c;但强烈…

虚拟机扩容

文章目录 虚拟机扩容扩容背景软件版本操作步骤1、VM上修改磁盘信息2、在系统中挂载磁盘(1) 使用命令查看磁盘状态(2) 通过命令查看到新磁盘的分区(3) 然后对新加的磁盘进行分区操作(4)重启虚拟机(5) 再次用以下命令查看到磁盘当前情况(6) 查看卷组名(7) 初始化刚刚的分区(8) 将…

MongoDB入门

mongodb与sql术语对应关系 SQL术语/概念MongoDB术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域indexindex索引 对应关系图例

Microsoft Edge有哪些你不知道却超级好用的插件?(Microsoft Edge功能测评)

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:对Edge浏览器的简单测评,分享一些自己在使用好用的插件. 目录…

阿里系文生图(PAI+通义)

PAI-Diffusion模型来了&#xff01;阿里云机器学习团队带您徜徉中文艺术海洋 - 知乎作者&#xff1a;汪诚愚、段忠杰、朱祥茹、黄俊导读近年来&#xff0c;随着海量多模态数据在互联网的爆炸性增长和训练深度学习大模型的算力大幅提升&#xff0c;AI生成内容&#xff08;AI Gen…

Ae 效果详解:3D 摄像机跟踪器

Ae菜单&#xff1a;效果/透视/3D 摄像机跟踪器 Effects/Perspective/3D Camera Tracker 使用 3D 摄像机跟踪器 3D Camera Tracker效果可自动分析视频&#xff0c;以便提取摄像机运动和 3D 场景数据。然后&#xff0c;可以在 2D 素材的基础上正确合成 3D 元素。 提示&#xff1a…

基于DataX的海量时序数据迁移实战:从MySQL到TDengine3.x

背景 MySQL 数据库中&#xff0c;设备历史数据单表过亿&#xff0c;如何快速、低成本地迁移到 TDengine3.x 中&#xff1f; 从标题可以看出&#xff0c;我们使用的数据迁移/同步工具是 DataX &#xff0c;数据源&#xff08; Source &#xff09;为传统的关系型数据库 MySQL …

Yarn学习笔记

Apache Hadoop YARN &#xff08;Yet AnotherResource Negotiator&#xff0c;另一种资源协调者&#xff09;是一种新的 Hadoop 资源管理器&#xff0c;它是一个通用资源管理系统&#xff0c;可为上层应用提供统一的资源管理和调度&#xff0c;它的引入为集群在利用率、资源统一…

全面SOA化的电子电气架构是什么样?

交流群 | 进“传感器群/滑板底盘群/汽车基础软件群/域控制器群”请扫描文末二维码&#xff0c;添加九章小助手&#xff0c;务必备注交流群名称 真实姓名 公司 职位&#xff08;不备注无法通过好友验证&#xff09; 作者 | 张萌宇 在汽车产业向智能化转型的过程中&#xff0c…

《C++程序设计原理与实践》笔记 第18章 向量和数组

本章将介绍如何拷贝以及通过下标访问向量。为此&#xff0c;我们讨论一般的拷贝技术&#xff0c;并考虑向量与底层数组表示之间的关系。我们将展示数组与指针的关系及其使用引发的问题。我们还将讨论对于每种类型必须考虑的五种基本操作&#xff1a;构造、默认构造、拷贝构造、…

C++中queue的用法(超详细,入门必看)

博主简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的人。 博主主页&#xff1a;陈童学哦 所属专栏&#xff1a;CSTL 前言&#xff1a;Hello各位小伙伴们好&#xff01;欢迎来到本专栏CSTL的学习&#xff0c;本专栏旨在帮助大家了解…

轩辕:首个千亿级中文金融对话模型

背景 目前开源的大语言模型或多或少存在以下痛点&#xff1a; 缺少专门针对中文进行优化过的的大语言模型。 支持中文的开源模型的参数规模偏小&#xff0c;没有超过千亿。比如清华和智谱AI的ChatGLM-6B目前只开源了6B参数模型&#xff0c;盘古alpha也只开源了13B的模型。 支…

杨立昆:科学之路读书笔记1

杨立昆&#xff1a;科学之路读书笔记1 前言科学之路1读书缘由靠省钱&#xff0c;是混不出名堂的AI趣事话题交流 一起学AI系列博客&#xff1a;目录索引 前言 在贝尔实验室&#xff0c;靠节省开支&#xff0c;是无法混出名堂的。——《科学之路》 五一假期读的多&#xff0c;写的…

毫米波雷达点云 DBSCAN聚类算法

毫米雷达点云 DBSCAN聚类算法 聚类的目的聚类算法分类原型聚类层次聚类密度聚类 DBSCAN聚类算法原理相关定义算法流程以及伪代码DBSCAN算法优缺点DBSCAN参数选择聚类衡量指标 DBSCAN算法仿真DBSCAN代码DBSCAN算法对毫米波雷达点云数据进行聚类 聚类的目的 聚类的目的是将一组数…

认识http协议---3

hi,大家好,今天为大家带来http协议的相关知识 &#x1f347;1.http状态响应码 &#x1f347;2.构造http请求 1.直接在地址栏里输入一个URL 2.html的一些特殊标签,触发get请求 3.提交form表单,可以触发get请求和post请求 4.使用ajax &#x1f347;3.再次谈同步和异步 &#x1f3…

spark sql(四)物理计划解析

1、流程解析 在该系列第二篇文章中介绍了spark sql整体的解析流程&#xff0c;我们知道整体的sql解析分为未解析的逻辑计划&#xff08;Unresolved LogicalPlan&#xff09;、解析后的逻辑计划&#xff08;LogicalPlan&#xff09;、优化后的逻辑计划&#xff08;Optimized Lo…

HDFS学习笔记

HDFS1.0 1 什么是HDFS&#xff1f; HDFS的全称是&#xff1a;Hadoop DistributeFiles System&#xff0c;分布式文件系统。 在整个Hadoop技术体系中&#xff0c;HDFS提供了数据分布式存储的底层技术支持。 HDFS 由三个组件构成&#xff1a;NameNode&#xff08;NN&#xff…

排序算法:堆排序

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下栈和队列方面的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; 数据结构与算法专栏&#xff1a;数据结构与算法 个 人 …

算法|9.从暴力递归到动态规划2

9.算法|从暴力递归到动态规划2 1.数字字符串转英文字符串 题意&#xff1a;规定1和A对应、2和B对应、3和C对应…26和Z对应&#xff0c;那么一个数字字符串比如"111”就可以转化为:“AAA”、“KA"和"AK” 给定一个只有数字字符组成的字符串str&#xff0c;返回…

windows安装python开发环境

最近因工作需要&#xff0c;要学习一下python&#xff0c;所以先安装一下python的开发环境&#xff0c;比较简单 下载和安装Python 首先&#xff0c;在浏览器中打开Python的官方网站&#xff08;https://www.python.org/downloads/) 然后&#xff0c;从该网站下载与你的操…