业务上云--从Container+BuildKitd打镜像到在Kubernetes上部署LNMP

news2024/11/18 7:49:36

 一、背景

在基于kubeasz部署kubernetes高可用集群-CSDN博客文章部署的kubernetes集群上部署LNMP

1.1、Kubernetes环境
 1.2、Harbor环境

【docker基础】使用Harbor搭建私有仓库-docker-compose使用示例--第二周作业_harbor docker-compose-CSDN博客

Harbor环境升级:

  1. 上面文章中提到的harbor,在harbor.yml中域名的位置可以配置成IP地址,这样两台Harbor使用IP实现互相复制、互相备份;
  2. 前端haproxy+keepalived反向代理两台Harbor机器,实现harbor高可用
  3. 在阿里云上申请域名解析到keepalived的VIP上,并申请免费ssl证书;
  4. 将ssl证书文件放到harbor所在的机器上,在harbor.yml文件中配置ssl证书;
1.3、安装配置buildkitd

参考文章:https://www.cnblogs.com/punchlinux/p/16575328.html

buildkitd(服务端),目前支持runc和containerd作为镜像构建环境,默认是runc,可以更换containerd。

buildctl(客户端),负责解析Dockerfile文件、并向服务端buildkitd发出构建请求。

GitHub地址:https://github.com/moby/buildkit/releases

二、构建nginx、php-fpm镜像

2.1、构建nginx镜像
2.1.1、准备nginx镜像需要的文件

2.1.2、编写nginx镜像的Dockerfile
FROM harbor.jnlikai.cc/library/centos:8.4      #基础镜像可以提前下载并上传到自己的harbor上
MAINTAINER "JNLIKAI"
RUN rm -fr /etc/yum.repos.d/*                  #添加需要的repo文件
ADD Centos-8.repo /etc/yum.repos.d/
ADD epel.repo /etc/yum.repos.d/
RUN yum install -y vim wget tree make lrzsz zlib zlib-devel gcc-c++ automake pcre pcre-devel libtool openssl openssl-devel iproute net-tools iotop   #安装nginx需要的包
ADD nginx-1.26.0.tar.gz /usr/local/src/                       #将nginx源码包添加到镜像的指定目录
RUN cd /usr/local/src/nginx-1.26.0 && ./configure --prefix=/apps/nginx --with-http_sub_module && make && make install && ln -sv /apps/nginx/sbin/nginx /usr/sbin/nginx && rm -fr /usr/local/src/nginx-1.26.0.tar.gz                     #源码安装nginx
RUN useradd nginx -u 2024                                     #创建nginx用户
ADD nginx.conf /apps/nginx/conf/nginx.conf                    #将修改好的配置文件打到镜像
RUN mkdir -p /data/nginx/html                                 #创建数据目录
EXPOSE 80 443                                                 #暴露端口
CMD ["/apps/nginx/sbin/nginx","-c","/apps/nginx/conf/nginx.conf","-g","daemon off;"]     #运行nginx进程
2.1.3、使用nerdctl+buildkitd打镜像

检查buildkitd服务是否正常运行:

使用nerdctl构建nginx镜像,并上传harbor

2.2、构建php镜像
2.2.1、准备php需要的文件

2.2.2、编写php的Dockerfile
FROM harbor.jnlikai.cc/library/centos:8.4
MAINTAINER "JNLIKAI"
RUN useradd nginx -u 2024                            #创建运行php的用户nginx
RUN rm -fr /etc/yum.repos.d/*
ADD Centos-8.repo /etc/yum.repos.d/Centos-8.repo
ADD epel.repo /etc/yum.repos.d/epel.repo
ADD RPM-GPG-KEY-EPEL-8 /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
RUN yum -y install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-8.rpm
RUN yum -y install php83-php-fpm php83-php-mysql         #yum安装php相关包

ADD www.conf /etc/opt/remi/php83/php-fpm.d/www.conf      #将修改后的配置文件打到镜像里
ADD run_php.sh /usr/local/bin/run_php.sh                 #运行php的脚本
RUN chmod +x /usr/local/bin/run_php.sh
EXPOSE 9000
CMD ["/usr/local/bin/run_php.sh"]                        #运行脚本
www.conf是php的配置文件,修改的内容:
user = nginx
group = nginx
listen = 127.0.0.1:9000
listen.owner = nginx
listen.group = nginx
run_php.sh脚本内容

2.2.3、构建php镜像,并上传harbor

三、使用deployment部署wordpress

3.1、编写deployment的yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: wordpress-deployment
  name: wordpress-deployment
  namespace: myserver
spec:
  replicas: 3
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
      - name: wordpress-nginx
        image: harbor.jnlikai.cc/library/nginx:v1.26.0        #使用自己构建的nginx镜像
        imagePullPolicy: Always
        ports:
        - containerPort: 80
          protocol: TCP
          name: http
        - containerPort: 443
          protocol: TCP
          name: https
        volumeMounts:
        - name: wordpress                                    #挂载数据目录
          mountPath: /data/www/html
          readOnly: false
        - name: nginx-configmap                              #使用configmap挂载配置文件
          mountPath: /apps/nginx/conf/nginx.conf
          subPath: nginx.conf

      - name: wordpress-php
        image: harbor.jnlikai.cc/library/php-fpm:8.3.7       #使用自己构建的php镜像
        imagePullPolicy: Always
        ports:
        - name: http
          protocol: TCP
          containerPort: 9000
        volumeMounts:
        - name: wordpress                                   #挂载数据目录
          mountPath: /data/www/html
          readOnly: false
      volumes:
      - name: wordpress                                     #定义数据卷的后台存储(也可以使用pvc)
        nfs:
          server: 10.49.33.147
          path: /data/wordpress
      - name: nginx-configmap                               #引用configmap里的定义的配置文件
        configMap:
          name: nginx
          items:
          - key: nginx.conf
            path: nginx.conf
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: wordpress
  name: wordpress-service
  namespace: myserver
spec:
  type: NodePort                                          #定义nodeport类型的service
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30080
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
    nodePort: 31443
  selector:
    app: wordpress
数据卷写的数nfs提供,需要在nfs-server上创建目录/data/wordpress,并将该目录的属主数组改成2024(nginx的UID)

3.2、编写配置文件的configmap

在部署调试或业务变更时,需要经常修改nginx的配置文件,所以经nginx的配置文件写到configmap里,这样通过修改configmap就可以达到修改配置文件的目的,不用重新打镜像;

[root@k8s-master1 wordpress]# cat nginx-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx
  namespace: myserver
  labels:
    app: nginx
data:
  nginx.conf: |
        user  nginx;
        worker_processes  1;
        events {
            worker_connections  1024;
        }
        http {
            include       mime.types;
            default_type  application/octet-stream;
            sendfile        on;
            keepalive_timeout  65;
            server {
                listen       80;
                server_name  localhost;
                location / {
                    root   /data/www/html;
                    index  index.php index.html index.htm;
                }
                error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                    root   html;
                }
                location ~ \.php$ {
                    root           /data/www/html;
                    fastcgi_pass   127.0.0.1:9000;
                    fastcgi_index  index.php;
                    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
                    include        fastcgi_params;
                }
            }
        }
3.3、创建configmap,部署wordpress-deployment

四、访问WordPress页面,完成安装

4.1、使用节点的30080端口即可访问wordpress站点,默认是安装页面

        

4.2、创建数据库

数据库使用基于StatefulSet控制器在Kubernetes上部署MySQL一主多从-CSDN博客文章部署的数据库集群

4.2.1、首先登陆mysql-0容器,创建wordpress数据库

4.2.2、创建用户,并授权

4.2.3、在安装页面上填写数据库信息

Database Host的位置填写mysql-0的FQDN

4.2.4、完成安装

五、其他补充

5.1、WordPress的数据目录

wordpress的数据目录在wordpress/wp-content/uploads,这个目录下按时间保存站点的附件文件,可以该目录设置持久化存储(PV/PVC),备份附件可以备份该目录

5.2、服务暴露

可以使用ingress、openelb等将服务暴露出去

5.3、对站点进行压测

测试稳定性、或者结合HPA测试自动伸缩

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

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

相关文章

算法练习day8

反转字符串 代码随想录 0344.反转字符串 344. 反转字符串 - 力扣(LeetCode) (用时:0.05小时) 思路 这道题很简单也很经典。 字符串的反转方法有很多,我这里是用for循环通过数组长度和下标计算来交换。…

Git使用(2):远程仓库

一、创建远程仓库 登录码云Gitee - 基于 Git 的代码托管和研发协作平台。 点击右上角,新建仓库。 创建完成,复制仓库地址接下来要使用。 二、将idea项目推送到码云 首先创建本地仓库VCS -> Create Git Repository。然后选择Manage Remotes&#xff0…

pyqt QComboBox下拉列表框控件

pyqt QComboBox下拉列表框控件 QComboBox效果代码 QComboBox QComboBox 是 PyQt(中的一个控件,它允许用户从下拉列表中选择一个选项。这个控件在需要用户从预定义选项中进行选择时非常有用。 效果 代码 import sys from PyQt5.QtWidgets import QAppl…

谈谈 Spring 的过滤器和拦截器

前言 我们在进行 Web 应用开发时,时常需要对请求进行拦截或处理,故 Spring 为我们提供了过滤器和拦截器来应对这种情况。那么两者之间有什么不同呢?本文将详细讲解两者的区别和对应的使用场景。 (本文的代码实现首先是基于 Sprin…

暗区突围TWITCH掉宝关联帐号不了 无法关联帐号 关联不上

Twitch,作为全球知名的游戏直播平台,常常携手热门游戏如《暗区突围》举办互动活动,为玩家带来独特的参与体验。在这个过程中,“绑定关联”成为了连接直播观众与游戏世界的桥梁。简单来说,Twitch绑定关联《暗区突围》指…

【架构-17】通信系统架构设计理论

通信系统网络架构 1. 局域网网络架构 拓扑结构:星型、总线型、环型、树型。 网络架构:单核心架构(结构简单,地理范围受限)、双核心架构(网络拓扑结构可靠,投资较单核高)、环型架构…

四天学会JS高阶(学好vue的关键)——作用域解构箭头函数(理论+实战)(第一天)

一、作用域 提到作用域(作用域又分为局部作用域和全局作用域),就要想到变量。因为作用域规定了变量能够被访问的范围(也就是作用域是为变量而服务的),为了避免全局变量污染这一情况,所以需要使…

ollama离线部署llama3(window系统)

首先介绍下ollama是什么?Ollama是一个开源的大型语言模型服务工具,旨在为用户提供本地化的运行环境,满足个性化的需求。具体来说,Ollama是一个功能强大的开源框架,可以简化在Docker容器中部署和管理大型语言模型&a…

leetcode算法笔记-算法复杂度

对于时间复杂度,主要包括三种情况: 渐进紧确界: O渐进上界: 渐进下界: 加法原则:不同的时间复杂度相加取阶数最高的 乘法原则:不同的时间复杂度相乘,结果为时间复杂度的乘积 阶乘…

计算机vcruntime140.dll找不到如何修复,分享5种靠谱的修复教程

当您在运行某个应用程序或游戏时遇到提示“找不到vcruntime140.dll”,这通常意味着系统中缺少了Visual C Redistributable for Visual Studio 2015或更高版本的一个重要组件。这个错误通常发生在运行某些程序时,系统无法找到所需的动态链接库文件。小编将…

SwiftUI中的常用图形(Shapes)

概述 在SwiftUI中,常用的图形(Shape)主要有: Circle:圆形 Ellipse:椭圆形 Capsule:胶囊形 Rectangle:矩形 RoundedRectangle:圆角矩形 上面的这些图形都继承了Shape协议…

ssl证书免费申请指南

同学们可以私信我加入学习群! 正文开始 前言一、购买证书二、创建证书三、 验证证书等待出现如下页面,说明申请成功: ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6b6c1dd11d4c467687318552da7cdbb2.png) 总结 前言 今天为大…

28、查看Qt源码

一、方法1 在安装Qt时,需要勾选“Sources” 在Qt的安装目录Qt5.12.10\5.12.10\Src中可以找到Qt的源码 二、方法2 访问如下网址(需要翻墙) https://codebrowser.dev/ 在搜索框中输入要查找的信息,如:QMainWindow&…

C++自定义日期类的精彩之旅(详解)

在学习了C的6个默认成员函数后,我们现在动手实现一个完整的日期类,来加强对这6个默认成员函数的认识。 这是日期类中所包含的成员函数和成员变量: 构造函数 // 函数:获取某年某月的天数 inline int GetMonthDay(int yea…

嵌入式学习-M4的基本定时器

基本介绍 框图分析 时钟选择 计数器结构 开启重装载值寄存器的影子寄存器的工作时序图 未开启重装载值寄存器的影子寄存器的工作时序图 更新事件以及中断 相关寄存器 相关库函数

原子学习笔记7——FrameBuffer 应用编程

Frame 是帧的意思,buffer 是缓冲的意思,所以 Framebuffer 就是帧缓冲,这意味着 Framebuffer 就是一块内存,里面保存着一帧图像。 应用程序通过对 LCD 设备节点/dev/fb0(假设 LCD 对应的设备节点是/dev/fb0)…

Optional用法

说明:Optional和Stream一样,是Java8引入的特性,本文介绍Optional的几个实际用法。Steam流使用,参考下面这篇文章: Stream流使用 使用 1.保证值存在 // 1.保证值存在,pageNumber,pageSizeInte…

Zab之光:照亮分布式系统数据一致性迷宫的智慧火把

关注微信公众号 “程序员小胖” 每日技术干货,第一时间送达! 引言 在构建大型分布式系统时,数据一致性是我们必须面对的挑战之一。随着业务的增长和系统规模的扩大,如何保证在多个节点间复制的数据保持一致,成为了一…

iOS--底层学习--GCD的简单认识

iOS--底层学习--GCD的简单认识 前言什么是GCDGCD的优点GCD中的任务和队列任务队列 GCD的使用队列的创建和获取任务的创建队列嵌套任务和队列中的一些要点 GCD线程间的通信从后台线程切换到主线程通过队列传递数据使用Dispatch Group进行线程间协调 GCD的方法dispatch_barrier_a…

其它高阶数据结构①_并查集(概念+代码+两道OJ)

目录 1. 并查集的概念 2. 并查集的实现 3. 并查集的应用 3.1 力扣LCR 116. 省份数量 解析代码1 解析代码2 3.2 力扣990. 等式方程的可满足性 解析代码 本篇完。 写在前面: 此高阶数据结构系列,虽然放在⑤数据结构与算法专栏,但还是作…