香橙派4和树莓派4B构建K8S集群实践之四:BuildKit与LNMP

news2025/1/6 17:54:27

目录

1. 说明

2. 开始前的准备工作

2.1 docker 验证用户信息设置

 2.2 安装BuildKit

3. 安装步骤

3.1 申请一个pvc存储区 (wwwroot-pvc.yaml)

3.2 Nginx

3.3 php-fpm

3.3.1 构建并推送镜像

4. 遇到的问题

5. 相关命令

6. 参考


1. 说明

k8s带来的灵活性,使我们在部署上面有了很多花样选择,这里我希望做到以下方案:

Plan: 

- namespace为iot-age, nginx 与 php分别部署到不同的pods, 它们共用相同的pvc存储(即wwwroot目录相同,应用部署在里面), php pods 访问相同的数据库。

- 使用buildkit作为image构建工具,通过指定镜像部署定制化的php pods。

PlanB: namespace为ia2, nginx与php及其应用联合到一个deployment.yaml部署,有自己对应的存储目录, pods 共用相同的数据库。

2. 开始前的准备工作

2.1 docker 验证用户信息设置

因为将使用BuildKit来访问docker仓库(buildkit使用~/.docker/config.json), 需要验证用户信息,先行进行设置,以免push时出现验证错误:

# 生成base64编码的auth值, 其中user, pw为hub.docker.com的账密

echo -n "{user}:{pw}" | base64

vi ~/.docker/config.json
# example:
{
  "auths": {
          "https://index.docker.io/v1/": {
               "auth": "{auth}"
          }
  }
}

 2.2 安装BuildKit

法一:在指定主机上安装使用

# amd64用这个
wget https://github.com/moby/buildkit/releases/download/v0.9.0/buildkit-v0.9.0.linux-amd64.tar.gz
tar xvf buildkit-v0.9.0.linux-amd64.tar.gz -C /usr/local/bin/

# arm64用这个
wget https://github.com/moby/buildkit/releases/download/v0.9.0/buildkit-v0.9.0.linux-arm64.tar.gz
tar xvf buildkit-v0.9.0.linux-arm64.tar.gz -C /usr/local/bin/

# 创建服务配置
cat >/etc/systemd/system/buildkitd.service <<EOF
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit
After=containerd.service

[Service]
Type=notify
ExecStart=/usr/local/bin/buildkitd  --oci-worker=false --containerd-worker=true 

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload && systemctl restart buildkitd 
systemctl enable buildkitd
systemctl status buildkitd

法2: 创建 buildkitd和buildkit-cli pods,并在buildkit-cli里调用服务构建,需要说明的是: 我尚未能成功构建并推送上去仓库,可参考这篇文章Building Docker Images with BuildKit | Kubernetes Course Labs

# 安装buildkit server
kubectl apply -f https://kubernetes.courselabs.co/labs/buildkit/specs/buildkitd/buildkitd.yaml
kubectl logs -l app=buildkitd
# 删除buildkit
kubectl delete deploy,svc,pod -l kubernetes.courselabs.co=buildkit

kubectl create secret docker-registry registry-creds --docker-server=docker.io --docker-username={user} --docker-password={pw}
kubectl create configmap build-config --from-literal=REGISTRY=docker.io  --from-literal=REPOSITORY=bennybi

kubectl apply -f https://kubernetes.courselabs.co/labs/buildkit/specs/buildkit-cli/buildkit-cli.yaml

# 进入buildkit cli pod
kubectl exec -it buildkit-cli -- sh

# 在buildkit-cli pod内调用
buildctl --addr tcp://buildkitd:1234 build --frontend=dockerfile.v0 --local context=. --local dockerfile=. --output type=image,name=${REGISTRY}/${REPOSITORY}/simple,push=true

3. 安装步骤

3.1 申请一个pvc存储区 (wwwroot-pvc.yaml)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wwwroot
  namespace: iot-age
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2G

3.2 Nginx

文件清单: nginx.yaml, nginx-configmap.yaml

iot-age中所有的nginx pods将使用统一的配置,ConfigMap (nginx-configmap.yaml) 

apiVersion: v1
kind: ConfigMap
metadata:
  name: 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/html;
        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;
        }
    }

 kubectl apply -f nginx-configmap.yaml

nginx.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx
  namespace: iot-age
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 2
  #volumeClaimTemplates:
  #  - kind: PersistentVolumeClaim
  #    apiVersion: v1
  #    metadata:
  #      name: wwwroot
  #    spec:
  #      accessModes:
  #        - ReadWriteOnce
  #      resources:
  #        requests:
  #          storage: 2Gi
  #      volumeMode: Filesystem
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        volumeMounts:
        - name: wwwroot
          mountPath: /var/www/html
        - name: nginx-conf
          mountPath: /etc/nginx/conf.d/
      volumes:
      - name: wwwroot
        persistentVolumeClaim:
          claimName: wwwroot
      - name: nginx-conf
        configMap:
         name: nginx-conf
status: {}

---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: iot-age
spec:
  type: NodePort
  ports:
  - name: nginx
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30010
  selector:
    app: nginx

 kubectl apply -f nginx.yaml

3.3 php-fpm

文件清单:  Dockerfile, php.yaml

Dockerfile, 该文件参考了php/Dockerfile at master · khs1994-docker/php · GitHub

# syntax=docker/dockerfile:labs
ARG PHP_VERSION=8.2.5

FROM --platform=$TARGETPLATFORM php:${PHP_VERSION}-fpm-alpine3.17 as php

LABEL maintainer="khs1994-docker/lnmp <khs1994@khs1994.com>"

ARG PHP_EXTENSION_EXTRA

ARG PECL_EXTENSION_EXTRA

ARG APK_EXTRA

ARG APK_DEV_EXTRA

ENV TZ=Asia/Shanghai \
    APP_ENV=development

ENV PHP_EXTENSION \
      bcmath \
      bz2 \
      calendar \
      enchant \
      exif \
      gd \
      gettext \
      gmp \
      imap \
      intl \
      mysqli \
      pcntl \
      pdo_pgsql \
      pdo_mysql \
      pgsql \
      sockets \
      sysvmsg \
      sysvsem \
      sysvshm \
      # tidy \
      # xsl \
      zip \
      shmop \
      ffi \
      ${PHP_EXTENSION_EXTRA:-}

ENV PECL_EXTENSION \
      # mongodb \
      # https://github.com/mongodb/mongo-php-driver/archive/master.tar.gz \
      # igbinary \
      https://github.com/igbinary/igbinary/archive/master.tar.gz \
      # redis \
      https://github.com/phpredis/phpredis/archive/develop.tar.gz \
      memcached \
# 安装测试版的扩展,可以在扩展名后加 -beta
      # yaml \
      # https://github.com/php/pecl-file_formats-yaml/archive/php7.tar.gz \
      https://github.com/kjdev/php-ext-zstd/archive/0.11.0.tar.gz \
      ${PECL_EXTENSION_EXTRA:-}

ARG ALPINE_URL=dl-cdn.alpinelinux.org

RUN sed -i "s/dl-cdn.alpinelinux.org/${ALPINE_URL}/g" /etc/apk/repositories \
      && set -xe \
      \
      # && apk add --no-cache patch \
      # && cd / \
      # && { \
      #   echo "--- a/usr/local/lib/php/build/php.m4"; \
      #    } | tee 1.diff \
      # && patch -p1 < 1.diff \
      # && apk del --no-network patch \
      # && rm -rf 1.diff \
      \
# 不要删除
      && PHP_FPM_RUN_DEPS=" \
                         bash \
                         tzdata \
                         libmemcached-libs \
                         libpq \
                         libzip \
                         zlib \
                         libpng \
                         freetype \
                         libjpeg-turbo \
                         libxpm \
                         libwebp \
                         libbz2 \
                         libexif \
                         gmp \
                         enchant2 \
                         c-client \
                         icu-libs \
                         zstd-libs \
                         linux-headers \
                         libavif \
                         ${APK_EXTRA:-} \
                         " \
                         # tidyhtml-libs \
                         # libxslt \
                         # yaml \
# *-dev 编译之后删除
      && PHP_FPM_BUILD_DEPS=" \
                         openssl-dev \
                         libmemcached-dev \
                         cyrus-sasl-dev \
                         postgresql-dev \
                         libzip-dev \
                         zlib-dev \
                         libpng-dev \
                         freetype-dev \
                         libjpeg-turbo-dev \
                         libxpm-dev \
                         libwebp-dev \
                         libexif-dev \
                         gmp-dev \
                         bzip2-dev \
                         enchant2-dev \
                         imap-dev \
                         gettext-dev \
                         libwebp-dev \
                         icu-dev \
                         zstd-dev \
                         libavif-dev \
                         ${APK_DEV_EXTRA:-} \
                         " \
                         # tidyhtml-dev \
                         # libxslt-dev \
                         # yaml-dev \
        && apk add --no-cache --virtual .php-fpm-run-deps $PHP_FPM_RUN_DEPS \
        && apk add --no-cache --virtual .php-fpm-build-deps $PHP_FPM_BUILD_DEPS \
        && apk add --no-cache --virtual .phpize-deps $PHPIZE_DEPS \
        && curl -fsSL -o /usr/local/bin/pickle \
           https://github.com/khs1994-php/pickle/releases/download/nightly/pickle-debug.phar \
        && chmod +x /usr/local/bin/pickle \
# 安装内置扩展
        && docker-php-source extract \
        && docker-php-ext-configure zip \
                                    --with-zip \
        && docker-php-ext-install zip \
        && strip --strip-all $(php-config --extension-dir)/zip.so \
        # && docker-php-ext-configure gd \
        && echo " \
                                        --disable-gd-jis-conv \
                                        --with-freetype \
                                        --with-jpeg \
                                        --with-webp \
                                        --with-xpm \
                                        --with-avif" > /tmp/gd.configure.options \
        # && docker-php-ext-install $PHP_EXTENSION \
        && pickle install $PHP_EXTENSION -n --defaults --strip \
        && docker-php-source delete \
# 安装 PECL 扩展
        && echo "--enable-redis-igbinary --enable-redis-zstd" > /tmp/redis.configure.options \
        && echo "--enable-memcached-igbinary" > /tmp/memcached.configure.options \
        && echo "--with-libzstd" > /tmp/zstd.configure.options \
        && pickle install $PECL_EXTENSION -n --defaults \
           --strip --cleanup \
# 默认不启用的扩展
        && pickle install \
# https://github.com/tideways/php-xhprof-extension.git
             https://github.com/tideways/php-xhprof-extension/archive/master.tar.gz \
             -n --defaults --strip --cleanup --no-write \
        && pickle install opcache \
        # && docker-php-ext-enable opcache \
        && apk del --no-network .phpize-deps .php-fpm-build-deps \
        && rm -rf /tmp/* \
# 创建日志文件夹
        && mkdir -p /var/log/php-fpm \
        && ln -sf /dev/stdout /var/log/php-fpm/access.log \
        && ln -sf /dev/stderr /var/log/php-fpm/error.log \
        && chmod -R 777 /var/log/php-fpm \
        && rm -rf /usr/local/lib/php/.registry/.channel.pecl.php.net/* \
        && php -m \
        && ls -la $(php-config --extension-dir) \
        && php -d error_reporting=22527 -d display_errors=1 -r 'var_dump(iconv("UTF-8", "UTF-8//IGNORE", "This is the Euro symbol '\''€'\''."));' \
# smoke test
        && php --version

WORKDIR /app

ARG VCS_REF="unknow"

LABEL org.opencontainers.image.revision=$VCS_REF \
      org.opencontainers.image.source="https://github.com/khs1994-docker/php"

3.3.1 构建并推送镜像

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

php.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: php
  namespace: iot-age
spec:
  selector:
    matchLabels:
      app: php
      tier: backend
  replicas: 2
  template:
    metadata:
      labels:
        app: php
        tier: backend
    spec:
      containers:
      - name: php
        #image: php:8.2-fpm
        image: bennybi/php-fpm:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9000
        volumeMounts:
        - name: wwwroot
          mountPath: /var/www/html/
 
      volumes:
      - name: wwwroot
        persistentVolumeClaim:
          claimName: wwwroot
 
---
apiVersion: v1
kind: Service
metadata:
  name: php
  namespace: iot-age
spec:
  ports:
  - name: php
    port: 9000
    protocol: TCP
    targetPort: 9000
  selector:
    app: php

kubectl apply -f php.yaml 

# 或许还要

kubectl delete -f nginx.yaml 

kubectl apply -f nginx.yaml 

效果:访问  http://192.168.0.106:30010/

4. 遇到的问题

buildctl build 并 push上去时,出现 "authorization status: 401: authorization failed"错误

解决办法:确认 ~/.docker/config.json已正确设置auth信息 

5. 相关命令

# 查看本地就绪镜像
ctr -n buildkit images list 或 ctr -n buildkit i ls

# 检查证书过期时间
kubeadm certs check-expiration

6. 参考

GitHub - moby/buildkit: concurrent, cache-efficient, and Dockerfile-agnostic builder toolkit

Building Docker Images with BuildKit | Kubernetes Course Labs

Deploy a PHP Application on Kubernetes Cluster with Ubuntu 18.04

K8s---Pod搭建LNMP_k8s搭建lnmp_我不满意的博客-CSDN博客

k8s之StatefulSet详解_最美dee时光的博客-CSDN博客

https://www.cnblogs.com/jinanxiaolaohu/p/17111257.html

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

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

相关文章

Linux系统之安装PDF阅读器

Linux系统之安装PDF阅读器 一、PDF介绍1. PDF简介2. PDF特点3. evince介绍 二、本次实践环境介绍1. 本地环境规划2. 本次实践介绍 三、本地环境检查1. 检查操作系统版本2. 查看系统内核版本 四、安装前准备工作1. 配置yum仓库2. 检查本地yum仓库状态3. 查看evince安装包 五、安…

怎样做好一场线上研讨会?

怎样做好一场线上研讨会&#xff1f; 1-策划和准备。在开始前&#xff0c;需要仔细策划和准备。确定研讨会的主题、目标、议程和参与者&#xff0c;并为参与者提供足够的信息和资源&#xff0c;以确保他们能够充分准备并参与讨论。 2-选择合适的在线平台。选择一个适合您需求…

Ubuntu搭建VPN服务,PPTD和OpenVPN

本文提供了两种vpn方式&#xff0c;pptd移动端支持不够&#xff0c;OpenVPN跨平台能力更前&#xff0c;且安全性更好。 但pptd也不是一无是处&#xff0c;在使用midjuriney网站时&#xff0c;openvpn搭建的网络出现了无法将机器人加入服务器的情况&#xff0c;更换pptd后操作无…

基于Maven创建多模块的Spring Boot项目

使用 Spring Boot的初始化器等创建Spring Boot项目时,需要在pom.xml指定该项目的父项目是 spring-boot-starter-parent。 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><versio…

OSPF综合实验(第二部分)

目录 配置OSPF动态路由协议 重发布 减少路由条目&#xff1a;​ 特殊区域&#xff1a; 收敛配置 认证 NAT地址转换 空接口 配置OSPF动态路由协议 AR1&#xff1a; [r1]ospf 1 router-id 1.1.1.1 [r1-ospf-1]area 1 [r1-ospf-1-area-0.0.0.1]network 172.16.32.0 0.0.0.…

DeepLab V3+

Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation 分割图像的语义编码器-解码器和带孔可分离卷积的技术 摘要 对于语义分割任务&#xff0c;深度神经网络通常使用空间金字塔池化模块或编码器-解码器结构。前者通过以多种速率和多种有效视…

手把手教你安装Redis

在上一篇《Redis简介》中介绍了Redis的一特性和使用场景&#xff0c;下面我们就来动手安装一下Redis 主要分为Windows安装、Linux下安装和Docker下安装 Windows下安装Redis 很不幸&#xff0c;Redis官方不支持windows版本&#xff0c;以下是官方原话 Redis is not officiall…

【P19】JMeter CSS/JQuery提取器(CSS Selector Extractor)

文章目录 一、准备工作二、测试计划设计 一、准备工作 百度&#xff1a; https://www.baidu.com/ 进入网页后&#xff0c;右键检查或按F12&#xff0c;打开调试工具 使用CSS/JQuery提取器&#xff0c;获取六个百度热搜文本 二、测试计划设计 &#xff08;1&#xff09;、测…

供水管线 码蹄集

题目来源&#xff1a;码蹄集 题目描述&#xff1a; 解决思路&#xff1a; 首先&#xff0c;题目要求我们去掉一些管道&#xff0c;使得总的管道管理费用最小。在去掉部分管道的情况下&#xff0c;城市之间不再形成一个回路&#xff0c;即城市之间构成了一棵树。因此&#xff…

元宇宙医疗虚拟人的功能,创造哪些新体验

虚拟数字人的出现对于精准医疗及人类健康的发展将带来不可估量的作用。通过三维可视化、3D打印、大数据及人工智能等多种数字化手段&#xff0c;在医学研究方面取得新的进展。 居家/健康&#xff1a;智能虚拟管家、家庭虚拟医生、家庭虚拟陪护员 一、虚拟数字人的医学知识普及优…

ChatGPT中文指令(Prompt)角色预设大全!让你的AI更懂你!

ChatGPT的回答总是不令人满意&#xff0c;那可能是你对AI下错了指令/提示词&#xff08;Prompt&#xff09;&#xff0c;想要ChatGPT更懂你&#xff0c;回答更精准&#xff0c;就要给它下对指令。 在国外有大佬们已经整理出一些标准的问话模板&#xff0c;直接拿来使用后&#…

在Python环境中安装配置GDAL,并演示使用GDAL读取shapefile文件

GDAL是应用广泛的空间数据处理库&#xff0c;可以处理几何、栅格数据&#xff0c;Python是一门简单易学的编程语言&#xff0c;常用来编写数据处理工具、脚本。本文讲解如何在Python环境中安装、配置、使用GDAL。本文示例中使用的GDAL版本为3.4.3 一、下载GDAL的whl包 可以通过…

ComPDFKit PDF SDK for Windows crack

ComPDFKit PDF SDK for Windows crack 增加了对新文本编辑功能的支持&#xff0c;如添加其他字体、设置粗体/斜体、复制文本样式和修改文本透明度。 增加了对新级别文档加密的支持&#xff0c;包括AES-128和AES-256。 ComPDFKit PDF SDK允许开发人员在Windows(iOS和Android平台…

C高级-day(4)-(shell数组、shell中的算数、shell中的分支语句.)

一、编写一个名为myfirstshell.sh的脚本&#xff0c;它包括以下内容。 1、包含一段注释&#xff0c;列出您的姓名、脚本的名称和编写这个脚本的目的 2、和当前用户说“hello 用户名” 3、显示您的机器名 hostname 4、显示上一级目录中的所有文件的列表 5、显示变量PATH和H…

C/C++中程序数据的分类与内存分布,C++内存管理方式之new / delete 操作符与malloc / free的区别

TIPS const修饰数据类型并不会影响它在内存当中某个区域的存储位置&#xff0c;比方说原先是在栈区上面的&#xff0c;然后用const修饰了一下&#xff0c;并不就是说你现在已经变到静态区里面去了&#xff0c;你还是在栈上面指针与指针之间的等号赋值也需要考虑到权限的放大与…

利用Python程序生成字符画 让男大学生们洗脑的挖呀挖呀挖

源码地址 原教程在这里 演示效果&#xff1a;&#xff08;有点虚&#xff09; 利用Python程序生成字符画 让男大学生们洗脑的挖呀挖呀挖 使用教程&#xff08;源码在文章最后&#xff09; 打开pyhton编译器安装opencv和Pillow库把要进行字符串化的视频命名为input.mp4&#…

nginx: 配置https证书,wss证书

作用&#xff1a;SSL证书卸载 1、制作证书 openssl genrsa -des3 -out server.key 2048 openssl req -new -key server.key -out server.csr openssl rsa -in server.key -out server.key openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt …

windows 通过bat一键Android手机截图

首先资源需要5积分链接如下&#xff1a; https://download.csdn.net/download/weixin_38287114/87774870?spm1001.2014.3001.5501 使用范围&#xff1a; 有一台电脑是window系统&#xff0c;电脑安装配置了adb 有一台手机&#xff0c;打开了usb调试 你想截图的软件没有usb…

ArrayList 和 LinkedList 之间应该怎么选择?

Joshua Bloch&#xff1a;我写了 LinkedList&#xff0c;但我自己都不用&#xff01; 对&#xff0c;Joshua Bloch 就是 LinkedList 的作者&#xff01; 如果你真信了作者的话&#xff0c;那就真的大错特错了&#xff0c;LinkedList 虽然用的没有 ArrayList 多&#xff0c;但使…

高性能存储SIG月度动态:EROFS支持直接索引容器镜像tar包,io_uring将支持并优化NVMe直通

高性能存储 SIG&#xff08;Special Interest Group&#xff09;目标&#xff1a;存储领域的发展历程&#xff0c;本质上是存储介质与软件栈相互促进发展的过程。高性能存储 SIG 致力于存储栈性能挖掘&#xff0c;当前主要聚焦内核 io_uring 技术优化异步 IO 性能&#xff0c;使…