k8s-容器化部署论坛和商城服务(小白的“升级打怪”成长之路)

Linux Swap 子系统:架构、内存管理与虚拟化 Swap Linux Swap机制通过将不活跃内存页移至磁盘或压缩内存,扩展系统有效内存容量,缓解内存压力。传统架构中,逻辑Swap槽与物理存储绑定,导致资源浪费,尤其在使用Zswap等压缩技术时。为此,Vswap与Xswap提出虚拟化方案:前者以XArray实现灵活映射,支持多后端迁移;后者采用稀疏映射,简化管理但容量固定。二者在架构设计、资源记账与动态扩展上各有权衡,反映了内核开发中对性能、可维护性与灵活性的深层考量。 阅读详情

目录

一、配置文件编写

1、数据持久化

2、mysql主从复制

3、php解析环境

4、nginx服务

5、redis主从复制

6、tomcat服务

7、操作命令

8、在每个node节点操作上

9、更改服务文件加入redis缓存和实现访问动静分离

在存储主机上查看

10、更改商城应用文件

二、实现域名访问

1、配置ingress规则

2、在wondows主机上更改hosts文件

3、网站访问


操作前准备:安装好k8s集群、安装好ingress服务

设计思路:

1、通过ingress规则实现自定义域名访问nginx,经php解析,访问到redis再到mysql

2、通过ingress规则实现自定义域名访问tomcat,访问到mysql

注意:

1、拉取镜像网络不好容器拉去失败,建议在网络好(有wifi)的地方操作

2、在windos主机上编写hosts文件时,要把hosts文件拉到桌面改,改完再拉回来,不然很可能电脑不会重新读取文件导致失败


3、使用pvc存储数据到存储主机的指定目录下

一、配置文件编写

1、数据持久化

所有节点安装nfs服务

yum install -y nfs-utils

在存储主机操作

vim /etc/exports

/data 192.168.58.0/24(rw,sync,no_root_squash,no_subtree_check)
/data/v1 192.168.58.0/24(rw,sync,no_root_squash,no_subtree_check)
/data/v2 192.168.58.0/24(rw,sync,no_root_squash,no_subtree_check)

执行命令

mkdir /data/v1 /data/v2  -p
systemctl enable --now nfs-server.service 

在集群master节点上操作配置持久化存储pvc

vim pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
 name: v1
spec:
 capacity:
  storage: 5Gi #pv的存储空间容量
 accessModes: ["ReadWriteOnce","ReadWriteMany"]
 nfs:
  path: /data/v1 #把nfs的存储空间创建成pv
​
  server: 192.168.58.170 #nfs服务器的地址
---
​
apiVersion: v1
kind: PersistentVolume
metadata:
 name: v2
spec:
 capacity:
  storage: 5Gi #pv的存储空间容量
 accessModes: ["ReadWriteOnce","ReadWriteMany"]
 nfs:
  path: /data/v2 #把nfs的存储空间创建成pv
  server: 192.168.58.170 #nfs服务器的地址

vim pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: mysql-pvc
spec:
 accessModes: ["ReadWriteMany"]
 resources:
   requests:
​
     storage: 5Gi
---
​
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: redis-pvc
spec:
 accessModes: ["ReadWriteMany"]
 resources:
   requests:
     storage: 5Gi

2、mysql主从复制

vim mysql-m-s/mysql-secrets.yaml

# 定义K8s Secret,存储MySQL敏感密码(base64编码)
apiVersion: v1
kind: Secret
metadata:
  name: mysql-secrets  # Secret名称,供其他资源引用
type: Opaque  # 通用类型,存储任意键值对
data:
  # 密码需先base64编码(示例原密码:123.com → 编码后:MTIzLmNvbQ==)
  root-password: MTIzLmNvbQ==          # MySQL root用户密码
  replication-password: cmVwbDEyMw==   # 主从复制用户(repl)密码rep123

vim mysql-m-s/mysql-configmap.yaml

# 定义K8s ConfigMap,存储非敏感配置(配置文件、脚本)
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config  # ConfigMap名称,供Pod引用
data:
  # --------------------------
  # 主库核心配置
  # --------------------------
  master.cnf: |
    [mysqld]
    server-id=1               # 主库唯一ID(必须≠从库)
    log_bin=mysql-bin         # 开启二进制日志(主从复制依赖)
    skip-host-cache           # 禁用主机缓存(减少DNS依赖)
    skip-name-resolve         # 禁用域名解析(加速连接)
    default_authentication_plugin=mysql_native_password  # 解决认证插件兼容问题
​
  # --------------------------
  # 从库核心配置
  # --------------------------
  slave.cnf: |
    [mysqld]
    server-id=2               # 从库唯一ID(必须≠主库)
    relay_log=mysql-relay-bin # 开启中继日志(存储主库同步的日志)
    log_bin=mysql-bin         # 开启二进制日志(支持级联复制)
    read_only=1               # 从库设为只读(root用户除外)
    skip-host-cache
    skip-name-resolve
​
  # --------------------------
  # 主库初始化脚本(容器启动时执行)
  # --------------------------
  init-master.sh: |
    #!/bin/bash
    set -e  # 脚本出错立即退出
​
    # 等待MySQL服务启动(避免脚本先于数据库执行)
    until mysqladmin ping -h localhost --silent; do
        echo "等待主库MySQL启动..."
        sleep 2
    done
​
    # 1. 创建复制用户repl(从库用该用户连接主库)
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "CREATE USER IF NOT EXISTS 'repl'@'%' IDENTIFIED BY '$REPLICATION_PASSWORD';"
    # 2. 授予复制权限(仅允许同步操作)
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';"
    # 3. 创建额外数据库
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "CREATE DATABASE IF NOT EXISTS discuz;"
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "CREATE DATABASE IF NOT EXISTS biyesheji;"
    # 4. 创建额外用户和权限
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "CREATE USER IF NOT EXISTS 'discuz_user'@'%' IDENTIFIED BY '123.com';"
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "GRANT ALL PRIVILEGES ON discuz.* TO 'discuz_user'@'%';"
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "DROP USER IF EXISTS 'root'@'%';"
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY '123.com';"
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;"
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "FLUSH PRIVILEGES;"  # 刷新权限
​
    # 记录主库日志状态(供从库同步起点使用)
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "SHOW MASTER STATUS\G" > /var/lib/mysql/master-status.txt
​
  # --------------------------
  # 从库初始化脚本(容器启动时执行)
  # --------------------------
  init-slave.sh: |  # 修正缩进:与init-master.sh保持同级(属于data的子项)
    #!/bin/bash
    set -e
    
    # 等待从库自身MySQL启动
    until mysqladmin ping -h localhost --silent; do
        echo "等待从库MySQL启动..."
        sleep 2
    done
​
    # 等待主库服务就绪(增加超时机制,避免无限等待)
    timeout=120
    elapsed=0
    until mysqladmin ping -h mysql-master --silent -u root -p"$MYSQL_ROOT_PASSWORD"; do
        echo "等待主库就绪...(已等待 $elapsed 秒)"
        sleep 2
        elapsed=$((elapsed + 2))
        if [ $elapsed -ge $timeout ]; then
            echo "ERROR: 主库超时未就绪!"
            exit 1
        fi
    done
​
    # 1. 从主库获取同步起点(增加重试,确保日志位置有效)
    retry=3
    while [ $retry -gt 0 ]; do
        MASTER_STATUS=$(mysql -u root -p"$MYSQL_ROOT_PASSWORD" -h mysql-master -e "SHOW MASTER STATUS\G")
        MASTER_LOG_FILE=$(echo "$MASTER_STATUS" | grep 'File:' | awk '{print $2}')
        MASTER_LOG_POS=$(echo "$MASTER_STATUS" | grep 'Position:' | awk '{print $2}')
        if [ -n "$MASTER_LOG_FILE" ] && [ "$MASTER_LOG_POS" -gt 0 ]; then
            break  # 日志位置有效,退出重试
        fi
        echo "重试获取主库日志位置...(剩余 $retry 次)"
        retry=$((retry - 1))
        sleep 5
    done
​
    # 2. 配置从库同步参数
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "STOP SLAVE;"
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "CHANGE MASTER TO
      MASTER_HOST='mysql-master',
      MASTER_USER='repl',
      MASTER_PASSWORD='$REPLICATION_PASSWORD',
      MASTER_LOG_FILE='$MASTER_LOG_FILE',
      MASTER_LOG_POS=$MASTER_LOG_POS;"
    # 3. 创建额外数据库
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "CREATE DATABASE IF NOT EXISTS discuz;"
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "CREATE DATABASE IF NOT EXISTS biyesheji;"
    # 4. 创建额外用户和权限
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "CREATE USER IF NOT EXISTS 'discuz_user'@'%' IDENTIFIED BY '123.com';"
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "GRANT ALL PRIVILEGES ON discuz.* TO 'discuz_user'@'%';"
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "DROP USER IF EXISTS 'root'@'%';"
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY '123.com';"
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;"
​
​
    # 5. 启动同步并验证状态(核心新增:确保启动成功)
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "START SLAVE;"
    if ! mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "SHOW SLAVE STATUS\G" | grep -q "Slave_IO_Running: Yes"; then
        echo "ERROR: 从库IO线程启动失败!"
        exit 1
    fi

vim mysql-m-s/mysql-master.yaml

# --------------------------
# 主库Pod定义
# --------------------------
apiVersion: v1
kind: Pod
metadata:
  name: mysql-master  # 主库Pod名称
  labels:
    app: mysql        # 应用标签(用于Service关联)
    role: master      # 角色标签(区分主从)
spec:
  containers:
  - name: mysql
    image: mysql:8.0  # 基础镜像(MySQL 8.0)
    ports:
    - containerPort: 3306  # 容器内MySQL端口
    env:
    # 从Secret获取root密码(引用mysql-secrets中的key)
    - name: MYSQL_ROOT_PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysql-secrets
          key: root-password
    # 从Secret获取复制密码
    - name: REPLICATION_PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysql-secrets
          key: replication-password
    volumeMounts:
    # 挂载主库配置文件(从ConfigMap获取)
    - name: master-config
      mountPath: /etc/mysql/conf.d/master.cnf  # MySQL默认配置目录
      subPath: master.cnf  # 只挂载ConfigMap中的master.cnf(避免覆盖其他文件)
    # 挂载主库初始化脚本(从ConfigMap获取)
    - name: init-scripts
      mountPath: /docker-entrypoint-initdb.d/init-master.sh  # MySQL初始化脚本目录
      subPath: init-master.sh
    # 挂载数据目录(持久化MySQL数据)
    - name: mysql-master-data
      mountPath: /var/lib/mysql  # MySQL数据存储路径
    # 健康检查(确保主库存活)
    livenessProbe:
      exec:
        # 执行mysqladmin ping检查服务是否可用
        command: ["mysqladmin", "ping", "-u", "root", "-p$(MYSQL_ROOT_PASSWORD)"]
      initialDelaySeconds: 30  # 启动后30秒再开始检查(给数据库启动时间)
      periodSeconds: 10        # 每10秒检查一次

  # 定义Pod使用的卷
  volumes:
  # 引用ConfigMap中的主库配置
  - name: master-config
    configMap:
      name: mysql-config
  # 引用ConfigMap中的初始化脚本(设置权限为0755,确保可执行)
  - name: init-scripts
    configMap:
      name: mysql-config
      defaultMode: 0755
  # 主库数据卷
  - name: mysql-master-data
    persistentVolumeClaim:
      claimName: mysql-pvc

---
# --------------------------
# 主库Service(提供稳定访问地址)
# --------------------------
apiVersion: v1
kind: Service
metadata:
  name: mysql-master  # 主库Service名称(从库通过此名称访问主库)
spec:
  selector:
    app: mysql
    role: master  # 关联标签为app=mysql、role=master的Pod(即主库Pod)
  ports:
  - port: 3306        # Service暴露的端口
    targetPort: 3306  # 转发到Pod的端口(与容器内MySQL端口一致)

vim mysql-m-s/mysql-slave.yaml

# --------------------------
# 从库Pod定义(核心优化:确保init-slave.sh自动执行+主从复制配置生效)
# 基于原有模板修改,保留Secret管理敏感密码的安全设计,补充脚本执行关键配置
# --------------------------
apiVersion: v1
kind: Pod
metadata:
  name: mysql-slave   # 从库Pod唯一名称,用于kubectl命令操作(如exec、logs)
  labels:
    app: mysql        # 业务标签,与后续Service的selector匹配
    role: slave       # 角色标签,明确区分主库/从库,便于批量管理(如筛选所有从库Pod)
spec:
  containers:
  - name: mysql       # 容器名称,唯一标识Pod内的MySQL进程
    image: mysql:8.0  # 使用MySQL 8.0镜像,必须与主库镜像版本一致(避免主从版本兼容问题)
    ports:
    - containerPort: 3306  # 容器内部MySQL服务端口(默认3306,与MySQL默认端口保持一致)
    env:  # 环境变量配置(敏感密码从Secret读取,符合K8s安全最佳实践,避免明文暴露)
    # 1. 从库root初始密码:需与主库root初始密码完全一致(主库后续修改密码会同步到从库)
    - name: MYSQL_ROOT_PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysql-secrets  # 引用的Secret名称(需提前通过kubectl create secret创建)
          key: root-password   # Secret中存储root密码的key(需与Secret定义的key匹配)
    # 2. 复制用户repl的密码:必须与主库ConfigMap中init-master.sh配置的REPLICATION_PASSWORD一致
    # (从库通过repl用户连接主库同步数据,密码不匹配会导致同步失败)
    - name: REPLICATION_PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysql-secrets
          key: replication-password  # Secret中存储复制密码的key
    volumeMounts:  # 卷挂载配置:将ConfigMap的配置/脚本、数据卷挂载到容器指定路径
    # 1. 挂载从库核心配置文件(slave.cnf)
    - name: slave-config
      mountPath: /etc/mysql/conf.d/slave.cnf  # MySQL默认加载此目录下的.cnf文件(自动生效)
      subPath: slave.cnf  # 仅挂载ConfigMap中的slave.cnf文件,避免覆盖目录内其他默认配置
    # 2. 挂载从库初始化脚本(关键:利用MySQL镜像特性,自动执行/docker-entrypoint-initdb.d下的.sh脚本)
    - name: init-scripts
      mountPath: /docker-entrypoint-initdb.d/init-slave.sh  # 脚本挂载路径(符合MySQL自动执行规则)
      subPath: init-slave.sh  # 仅挂载ConfigMap中的init-slave.sh脚本,避免干扰其他初始化文件
    # 3. 挂载从库数据目录(持久化MySQL数据,防止Pod重建后数据丢失)
    - name: slave-data
      mountPath: /var/lib/mysql  # MySQL默认数据存储路径(所有表数据、日志均存在此目录)
    # 健康检查配置(Liveness Probe):确保MySQL服务正常运行,异常时触发Pod重启
    livenessProbe:
      exec:
        # 健康检查命令:通过mysqladmin ping验证MySQL服务可用性(使用环境变量中的root密码)
        command: ["mysqladmin", "ping", "-u", "root", "-p$(MYSQL_ROOT_PASSWORD)"]
      initialDelaySeconds: 30  # 容器启动后延迟30秒再检查(给MySQL足够的启动时间,避免误判)
      periodSeconds: 10        # 健康检查间隔:每10秒检查一次
​
  volumes:  # 定义Pod需挂载的卷(关联ConfigMap、数据存储)
  # 1. 从ConfigMap挂载从库配置文件(slave.cnf)
  - name: slave-config
    configMap:
      name: mysql-config  # 关联之前定义的ConfigMap名称(需确保ConfigMap已创建)
  # 2. 从ConfigMap挂载初始化脚本(init-slave.sh):关键配置defaultMode确保脚本可执行
  - name: init-scripts
    configMap:
      name: mysql-config  # 关联的ConfigMap名称
      defaultMode: 0755   # 核心权限配置:赋予脚本rwxr-xr-x权限(Linux可执行权限),否则脚本无法运行
  # 3. 从库数据卷:注意!当前为emptyDir(临时存储,Pod删除后数据丢失),生产环境需替换为PV/PVC
  - name: slave-data
    emptyDir: {}  # 测试环境临时使用,生产环境替换为下方注释的persistentVolumeClaim配置
    # 生产环境数据卷配置示例(需提前创建PVC):
    # persistentVolumeClaim:
    #   claimName: mysql-slave-pvc  # 关联的PVC名称
​
---
# --------------------------
# 从库Service定义(作用:提供稳定访问入口,供主库/集群内其他服务访问从库)
# --------------------------
apiVersion: v1
kind: Service
metadata:
  name: mysql-slave  # Service名称:主库脚本中通过此名称访问从库(如-h mysql-slave)
spec:
  selector:  # 标签选择器:关联到对应的从库Pod(必须与Pod的labels完全匹配)
    app: mysql
    role: slave
  ports:
  - port: 3306          # Service暴露的端口(集群内访问从库的端口)
    targetPort: 3306    # 映射到Pod的目标端口(与容器的containerPort一致,即MySQL服务端口)
  type: ClusterIP       # Service类型:默认ClusterIP(仅K8s集群内部可访问,安全可控)
  # 若需外部访问从库(如运维调试),可临时改为NodePort(生产环境不建议长期暴露):
  # type: NodePort
  # nodePort: 30006  # 外部访问端口(需确保NodePort范围在K8s配置的范围内,默认30000-32767)

检查主从复制是否成功

kubectl exec -it mysql-slave -- mysql -u root -p123.com
show slave status\G;

3、php解析环境

vim php/php-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: php-config
data:
  www.conf: |
    [www]
    user = nginx
    group = nginx
    listen = 0.0.0.0:9000
    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3

vim php/php-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  # Deployment名称
  name: php-fpm-deployment
  # 标签用于识别Deployment
  labels:
    app: php-fpm
spec:
  # 副本数,根据负载需求调整
  replicas: 1
  # 选择器,匹配要管理的Pod标签
  selector:
    matchLabels:
      app: php-fpm
  # Pod模板定义
  template:
    metadata:
      # Pod标签,需与selector匹配
      labels:
        app: php-fpm
    spec:
      # 容器定义
      containers:
      - name: php-fpm
        # 基础镜像,使用最新版Alpine
        image: alpine:latest
        # 容器启动命令,在Alpine基础上构建PHP-FPM环境
        command: ["/bin/sh", "-c"]
        args:
          - |
            # 更新包索引并安装所需PHP组件
            apk update && apk add \
              php82 \
              php82-fpm \
              php82-mysqli \
              php82-xml \
              php82-json \
              php82-pdo \
              php82-pdo_mysql \
              php82-tokenizer \
              php82-pecl-redis && \
            # 创建与Nginx匹配的用户和组(ID 101)
            addgroup -g 101 -S nginx && \
            adduser -u 101 -S -G nginx nginx && \
            # 创建符号链接,方便使用php-fpm命令
            ln -s /usr/sbin/php-fpm82 /usr/bin/php-fpm && \
            # 创建PHP运行时目录并设置权限
            mkdir -p /var/run/php && \
            chown -R nginx:nginx /var/run/php && \
            # 添加Redis扩展配置
            echo "extension=redis.so" > /etc/php82/conf.d/redis.ini && \
            # 以前台模式启动PHP-FPM
            php-fpm82 --nodaemonize --force-stderr
        # 暴露容器端口
        ports:
        - containerPort: 9000
        # 挂载卷配置
        volumeMounts:
        - name: php-config-volume  # 卷名称,需与下面volumes定义一致
          mountPath: /etc/php82/php-fpm.d/www.conf  # 容器内挂载路径
          subPath: www.conf  # 只挂载ConfigMap中的www.conf文件
        - name: discuz-volume
          mountPath: /var/www/html  # 容器内 Discuz 目录路径(对应宿主机目录)
      # 卷定义
      volumes:
      - name: php-config-volume
        configMap:
          name: php-config  # 引用前面定义的ConfigMap
      - name: discuz-volume
        hostPath:
          path: /root/project/discuz  # 宿主机上的 Discuz 目录(含文件和子目录)
          type: Directory  # 必须是已存在的目录(避免自动创建空目录覆盖内容)
---
# Service配置:提供Pod的网络访问入口
apiVersion: v1
kind: Service
metadata:
  name: php-fpm-service  # 服务名称
spec:
  selector:
    app: php-fpm  # 关联标签,指向PHP-FPM的Pod
  ports:
  - port: 9000  # 服务暴露的端口(集群内访问用)
    targetPort: 9000  # 对应容器的端口
  type: ClusterIP  # 仅集群内部可访问(默认类型) 

4、nginx服务

vim nginx/nginx-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config  # ConfigMap名称,在Deployment中会引用此名称
data:
  # Nginx的默认配置文件内容,与原default.conf保持一致
  default.conf: |
    server {
        listen       80;
        listen       [::]:80;
        server_name  localhost;
        root         /usr/share/nginx/html;
        index index.php index.html index.htm;
        
        # PHP文件处理配置
        location ~ \.php$ {
            fastcgi_pass   php-fpm-service:9000;  # 指向PHP服务,需确保在同一网络中
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
​

vim nginx/nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx  # Deployment名称
spec:
  replicas: 1  # 副本数量,可根据需求调整
  selector:
    matchLabels:
      app: nginx  # 选择器标签,匹配Pod
  template:
    metadata:
      labels:
        app: nginx  # Pod标签,与selector一致
    spec:
      containers:
      - name: nginx  # 容器名称
        image: alpine:latest  # 基础镜像
        command: ["/bin/sh", "-c"]
        args:
        - |
          #!/bin/sh
          apk add --no-cache nginx;
          pkill nginx || true;
          rm -f /etc/nginx/http.d/default.conf;
          mkdir -p /run/nginx;
          chown nginx:nginx /run/nginx;
          chmod 755 /run/nginx;
          nginx -t;
          nginx -g "daemon off;";
        ports:
        - containerPort: 80  # 容器内部端口
        volumeMounts:
        - name: nginx-config-volume  # 引用配置卷
          mountPath: /etc/nginx/http.d/default.conf
          subPath: default.conf
        - name: discuz-volume  # 网站文件卷
          mountPath: /usr/share/nginx/html
          readOnly: true
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 30
          periodSeconds: 10
          failureThreshold: 3
        readinessProbe:
          tcpSocket:
            port: 80
          initialDelaySeconds: 20
          periodSeconds: 5
      volumes:
      - name: nginx-config-volume  # 配置卷(关联ConfigMap)
        configMap:
          name: nginx-config
          items:
          - key: default.conf
            path: default.conf
      - name: discuz-volume  # 网站文件卷
        hostPath:
          path: /root/project/discuz
          type: DirectoryOrCreate  # 保留自动创目录,避免路径不存在问题
      # 1. 最小化修改:删除nodeSelector(解决调度时标签不匹配问题)
      dnsPolicy: ClusterFirst
      restartPolicy: Always
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service  # Service名称
  namespace: default
spec:
  selector:
    app: nginx  # 关联Nginx Pod标签
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080  # 保留固定NodePort,避免端口变化
  type: NodePort

5、redis主从复制

vim redis/redis-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
data:
  redis.conf: |
    # 允许所有IP访问(K8s环境需暴露给集群内服务)
    bind 0.0.0.0       
    # 关闭保护模式(配合密码保证安全,允许外部连接)
    protected-mode no  
    # Redis服务端口(与Deployment容器暴露端口一致)
    port 6379         
    # 禁止后台运行(K8s容器需前台启动,否则容器会退出)
    daemonize no     
    # Redis数据存储目录(与Deployment数据卷挂载路径一致)
    dir /data        
    # Redis访问密码(基础安全验证)
    requirepass 123456 
    #允许从节点认证
    masterauth 123456  
​
  redis-slave.conf: |
    bind 0.0.0.0       
    protected-mode no  
    port 6379         
    daemonize no     
    dir /data        
    requirepass 123456
    # 从节点认证密码
    masterauth 123456  
    # 指向主节点服务
    slaveof redis-master 6379  
    # 从节点只读
    slave-read-only yes  

vim redis/redis-deployment.yaml

# -------------- 1. 主节点 Deployment --------------
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-master  # 主节点部署名,明确身份
spec:
  replicas: 1  # 主节点仅1个
  selector:
    matchLabels:
      app: redis
      role: master  # 主节点标签,用于Service选择
  template:
    metadata:
      labels:
        app: redis
        role: master
    spec:
      containers:
      - name: redis
        image: redis:7.2-alpine  # 与你原配置镜像一致
        ports:
        - containerPort: 6379  # 暴露Redis端口,与配置一致
        volumeMounts:
          # 挂载ConfigMap中的主节点配置文件(redis.conf)
          - name: redis-config
            mountPath: /etc/redis/redis.conf  # 配置文件路径
            subPath: redis.conf  # 仅挂载主配置文件,避免覆盖目录
          # 挂载数据卷(存储Redis数据)
          - name: redis-master-data
            mountPath: /data  # 与配置文件中dir /data一致
        # 启动Redis,指定加载主节点配置文件
        command: ["redis-server", "/etc/redis/redis.conf"]
      volumes:
        # 关联你已有的ConfigMap(redis-config)
        - name: redis-config
          configMap:
            name: redis-config  # 必须与你现有ConfigMap名称一致
        # 数据卷
        - name: redis-master-data
          persistentVolumeClaim:
            claimName: redis-pvc

---
# -------------- 2. 从节点 Deployment --------------
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-slave  # 从节点部署名,与主节点区分
spec:
  replicas: 1  # 2个从节点,可根据需求调整数量
  selector:
    matchLabels:
      app: redis
      role: slave  # 从节点标签,用于Service选择
  template:
    metadata:
      labels:
        app: redis
        role: slave
    spec:
      securityContext:
        fsGroup: 999  # 移到这里,作用于整个Pod的挂载卷
      containers:
      - name: redis
        image: redis:7.2-alpine  # 与主节点镜像一致,避免版本兼容问题
        ports:
        - containerPort: 6379
        securityContext:
          runAsUser: 999
          runAsGroup: 999
        volumeMounts:
          # 挂载ConfigMap中的从节点配置文件(redis-slave.conf)
          - name: redis-config
            mountPath: /etc/redis/redis.conf  # 配置文件路径(与主节点保持一致,便于启动命令统一)
            subPath: redis-slave.conf  # 挂载从节点专属配置文件
          # 挂载数据卷(存储Redis数据)
          - name: redis-slave-data
            mountPath: /data  # 与配置文件中dir /data一致
        # 启动Redis,指定加载从节点配置文件(路径与主节点一致,因subPath已区分配置)
        command: ["redis-server", "/etc/redis/redis.conf"]
      volumes:
        # 同样关联你已有的ConfigMap(无需新增)
        - name: redis-config
          configMap:
            name: redis-config
        # 从节点数据卷
        - name: redis-slave-data
          emptyDir: {}

---
# -------------- 3. 主节点 Service(供写入操作) --------------
apiVersion: v1
kind: Service
metadata:
  name: redis-master  # 主节点Service名,与从节点配置中slaveof redis-master 6379完全一致
spec:
  selector:
    app: redis
    role: master  # 仅选择主节点Pod
  ports:
  - port: 6379
    targetPort: 6379  # 与容器暴露端口一致
  type: ClusterIP  # 集群内访问(生产环境若需外部访问,可改NodePort/LoadBalancer)

---
# -------------- 4. 从节点 Service(供读取操作) --------------
apiVersion: v1
kind: Service
metadata:
  name: redis-slave  # 从节点Service名,供客户端读取数据使用
spec:
  selector:
    app: redis
    role: slave  # 仅选择从节点Pod
  ports:
  - port: 6379
    targetPort: 6379
  type: ClusterIP  # 自动负载均衡到所有从节点

6、tomcat服务

vim tomcat/shangcheng-deployment.yaml

# --------------------------
# Tomcat Deployment配置
# 特点:随机分配到Node节点(自动避开Master节点)
# --------------------------
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-shangcheng
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      # 【关键修改】删除节点亲和性配置,K8s会自动调度到Node节点
      # (Master节点因有control-plane污点,默认不调度普通Pod)
      containers:
      - name: tomcat
        image: tomcat:8
        ports:
        - containerPort: 8080
        volumeMounts:
        # 挂载宿主机目录(需所有Node节点都有此目录及文件)
        - name: tomcat-data
          mountPath: /usr/local/tomcat
          readOnly: false
        # 启动命令(保持不变)
        command: ["/bin/bash", "-c"]
        args:
          - ln -s /usr/local/tomcat/bin/startup.sh /usr/local/bin/tomcat_start;
            ln -s /usr/local/tomcat/bin/shutdown.sh /usr/local/bin/tomcat_stop;
            /usr/local/tomcat/bin/startup.sh && tail -f /usr/local/tomcat/logs/catalina.out;
      volumes:
      - name: tomcat-data
        hostPath:
          path: /root/project/tomcat8  # 所有Node节点必须有此目录及文件
          type: Directory  # 严格检查目录存在(避免创建空目录)
​
---
# --------------------------
# Tomcat Service配置
# --------------------------
apiVersion: v1
kind: Service
metadata:
  name: tomcat-shangcheng-svc
spec:
  selector:
    app: tomcat
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30081  # 使用未占用的端口
  type: NodePort
    

7、操作命令

#mysql主从复制
kubectl apply -f mysql-m-s/mysql-secrets.yaml 
kubectl apply -f mysql-m-s/mysql-configmap.yaml 
kubectl apply -f mysql-m-s/mysql-master.yaml
kubectl apply -f mysql-m-s/mysql-slave.yaml 
#php解析环境
kubectl apply -f php/php-configmap.yaml 
kubectl apply -f php/php-deployment.yaml 
#nginx访问
kubectl apply -f nginx/nginx-configmap.yaml 
kubectl apply -f nginx/nginx-deployment.yaml 
#redis缓存
kubectl apply -f redis/redis-configmap.yaml 
kubectl apply -f redis/redis-deployment.yaml 
#tomcat访问
kubectl apply -f tomcat/shangcheng-deployment.yaml 
​
​
#把商城的数据库文件导入库中
cp /root/project//tomcat/tomcat8/webapps/biyesheji/biyesheji.sql /root/project/tomcat
​
 kubectl exec -i mysql-master -- mysql -u root -p123.com biyesheji < /root/project/tomcat/biyesheji.sql

检查主从复制是否成功

kubectl exec -it mysql-slave -- mysql -u root -p123.com
show slave status\G;

8、在每个node节点操作上

有两个目录文件

/root/project/discuz
​
/root/project/tomcat8

操作

cd /root/project/discuz
chown 101:101 ./ -R

网站访问192.168.58.180:30080

9、更改服务文件加入redis缓存和实现访问动静分离

vim /root/project/discuz/config/config_global.php

#加入从库,实现访问动静分离
​
#修改redis
​
#加入用户redis-master和密码123456

redis查看

 kubectl exec -it redis-master-84d56bd7f-nshzz -- redis-cli -a 123456
 

在存储主机上查看

10、更改商城应用文件

vim /root/project/tomcat8/webapps/biyesheji/index.jsp

<%--
  Created by IntelliJ IDEA.
  User: baiyuhong
  Date: 2018/10/21
  Time: 18:43
  To change this template use File | Settings | File Templates.
--%>
<%
    response.sendRedirect(request.getContextPath()+"/fore/foreIndex"); //项目启动时,自动跳转到前台首页
%>

vim /root/project/tomcat8/webapps/biyesheji/WEB-INF/classes/jdbc.properties

#修改登陆数据库用户为mysql-master,修改密码为123.com
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://mysql-master:3306/biyesheji?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2b8&allowPublicKeyRetrieval=true
jdbc.user=root
jdbc.password=123.com

vim /root/project/tomcat8/conf/server.xml

#增加一层,使得访问时后面不需要添加目录biyesheji

网站访问192.168.58.180:30081

二、实现域名访问

1、配置ingress规则

vim IPAddressPool.yaml

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: planip-pool #这里与下面的L2Advertisement的ip池名称需要一样
  namespace: metallb-system
spec:
  addresses:
​
  - 192.168.58.50-192.168.58.60 #自定义ip段

vim L2Advertisement.yaml

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: planip-pool
  namespace: metallb-system
spec:
  ipAddressPools:
​
  - planip-pool #这里需要跟上面ip池的名称保持一致
​
​

vim ingress-nginx-nodeport.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress # 创建一个类型为Ingress的资源
metadata:
  name: nginx-ingress # 这个资源的名字为 nginx-ingress
spec:
  ingressClassName: nginx # 使用nginx
  rules:

  - host: www.sc.com # 访问此内容的域名
    http:
      paths:
      - backend:
          service:
            name: tomcat-shangcheng-svc # 对应nginx的服务名字,该规则的namespace必须与service的一致
            port:
              number: 8080 # 访问的端口
        path: / # 匹配规则
        pathType: Prefix # 匹配类型,这里为前缀匹配
  - host: www.lt.com # 访问此内容的域名
    http:
      paths:
      - backend:
          service:
            name: nginx-service  # 对应nginx的服务名字
            port:
              number: 80 # 访问的端口
        path: / # 匹配规则
        pathType: Prefix # 匹配类型,这里为前缀匹配
​
​

操作命令

kubectl apply -f IPAddressPool.yaml 
kubectl apply -f L2Advertisement.yaml 
kubectl apply -f ingress-nginx-nodeport.yaml 

2、在wondows主机上更改hosts文件

3、网站访问

网站访问www.lt.com

网站访问www.sc.com

看到感觉有帮助的朋友,劳烦动动发财的小手给博主点个赞

置顶必读(1) |《滚雪球学 Spring Boot 4.x》专栏目录导航篇(持续更新中)! 🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。 本专栏面向 有一点 Java 基础,但没有系统学过 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,最终带你从第一个 Hello API 一路完成一个可部署、可监控、可扩展的后端项目。 阅读详情

相关推荐

基于深度学习的高精度牙齿健康检测识别系统(PyTorch+Pyside6+YOLOv5模型)

近年来,机器学习和深度学习取得了较大的发展,深度学习方法在检测精度和速度方面与传统方法相比表现出更良好的性能。YOLOv5是单阶段目标检测算法YOLO的第五代,根据实验得出结论,其在速度与准确性能方面都有了明显提升,开源的代码可见https://github.com/ultralytics/yolov5。因此本博文利用YOLOv5检测算法实现一种高精度家禽猪识别检测模型,再搭配上Pyside6库写出界面系统,完成目标检测识别页面的开发。

sc1434404661的博客 5799

理解 Linux 动态库加载:LD_LIBRARY_PATH

flyfish

二分掌柜的 345

使用Java实现CRC16 MODBUS 格式校验

CRC16校验,测试如下 String str = "a5 98 03 00 00 5f c6 0f 7c 40 78 06 09 46 dc 6e db 00 16 3e 12 5c 98 00 19 98 0e 10 03 06 09 46 dc 6e db 03 0b bf 5f c6 0f 7c 43 bd b9 61 ee 96 76 99"; 校验规则: /** * CRC16_CCITT:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结

weixin_45063710的博客 1314

Linux-iostat命令详解

Linux命令学习记录

m0xin的博客 111

MIMIC数据库基本信息分析

一、MIMIC数据库中26张表介绍 数据库中一共有26张表,记录患者入院的各种信息,每张表的介绍如下所示。 表格名 信息 admission 患者基本信息,比如性别、种族、语言、宗教、婚姻、入院和出院时间、死亡时间等 callout 提供病人准备从ICU转出或者已经从ICU转出时相关信息 caregivers 记录医护人员信息(ID、类型、附加...

m0_37520426的博客 1万+

3D Slicer中Auto3DSeg和TotalSegmentator等自动分割插件总是安装失败,怎么办?教你两招

TotalSegmentator, MONAI auto3Dseg,这些工具因分割器官多,准确性高,备受关注。同时,这些自动分割工具被集成在了3D slicer平台,非常方便临床医生做手术规划。详细了解这些工具看之前的教程👇-------- 简单概述 --------其中,MONAIAuto3DSeg扩展附带数十种针对特定临床用例的预训练分割模型,这些模型旨在快速运行,几分钟内即可在任何普通计算机上运行,无需 GPU,甚至在笔记本电脑上。

zzjlhlcd的博客 1698

Linux 服务器性能排查手册(2026):CPU、内存、磁盘IO、网络四大瓶颈定位

iptables 四表五链模型、firewalld zone 信任级别、云安全组与主机防火墙的关系与优先级,避坑改了防火墙把自己挡在服务器外面的翻车事故。

2502_91473995的博客 317

【医学图像处理】X-ray成像之X射线的产生

【医学图像处理】X-ray成像之X射线的产生 概述 电流流过钨丝,并将其加热。 随着加热,增加的能量使电子能够通过热电子发射从灯丝中释放出来。 电子被吸引到带正电的阳极,并以由管电位(电压)确定的最大能量撞击钨靶。 当电子轰击目标时,它们通过轫致辐射和特有的相互作用将能量转换为热量(99%)和X射线光子(1%)。 X射线光子以一束能量(X射线光谱)从光束中释放出来,构成X射线图像形成的基础。 设备 阴极 灯丝 用细的(0.2毫米)钨丝制成,因为钨: 原子序数高(A 184,Z 74) 是良好的热

ZhangPY的专栏 2356

【Linux】APT 本地 deb 安装与 `-f` 参数总结笔记

apt install ./xx.deb 可自动解析并安装依赖,无需 -f;-f 仅用于修复已损坏的依赖状态,非首次安装时必需。apt install -f 可单独运行,修复 broken dependencies。两者职责不同:前者是安装与依赖解决,后者是故障修复。完全离线时需提前准备依赖包或本地源。

hknaruto的专栏 211

读懂 403 Forbidden, the request has been blocked by UCON.:它不是浏览器渲染问题,而是后端安全闸门在拦截

摘要 403 Forbidden 错误表明服务器理解请求但拒绝执行,通常与权限或访问控制有关。当错误信息显示 "blocked by UCON" 时,说明请求被 SAP 体系中的统一连接管控框架拦截。UCON 采用白名单机制限制外部调用,通过记录、评估、强制三阶段流程实施管控。常见触发场景包括 HTTP 服务与通信场景配置不一致、白名单未更新等。排查时应通过 DevTools 确认服务器响应,使用 curl 排除浏览器干扰,并比较不同环境的行为差异。解决方案通常涉及调整配置传输顺序或更新

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 239

【论文汇总】Diffusion Models视频生成/视频编辑/可控视频生成/跨模态视频生成

本文总结了Diffusion Models视频生成领域相关的工作,目前共收录142篇,持续更新中。

沉迷单车的追风少年 1672

Linux rm 误删文件恢复实操教程

Linux使用rm删除文件时,并不会直接抹除磁盘上的数据,只是移除文件索引,让系统不再识别这块空间。只要没有写入新数据,原有扇区内容就会保留。新文件写入才有可能覆盖这些区域,一旦覆盖就很难找回。恢复的本质就是扫描磁盘,找到这些还存在、但索引丢失的数据条目,再把它们导出保存到其他分区。越早停止写入,恢复成功的概率越高。

海天数据恢复-winhex数据恢复教程 228

Claude Code auto mode 管理 subagents 的三道安全闸门

文章摘要: Claude Code的auto mode核心在于重构多代理协作的安全边界,将信任拆解为三个检查点:任务委派前评估主会话指令是否越界(v2.1.178新增);执行中强制subagent继承主会话权限模式,禁止自行降级;返回前审查完整动作历史并附加安全警告。这种设计通过动态运行时约束(classifier)与多层防线(tools限制、hooks等)结合,避免安全策略分散化。auto mode并非完全放权,而是通过减少常规提示+后台严格检查实现平衡,与隔离环境专用的bypassPermissions

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 73

Linux sudo

如果输出 → 无 sudo 权限 如果输出 → 拥有全部 sudo 权限 辅助验证命令 ⚠️ 注意:在 wheel 组 ≠ 一定能 sudo,必须 开启 Ubuntu/Debian: ✅ 重要:修改组之后,用户要重新登录才生效! 或者执行 临时生效 看到这行(没有 #注释)才生效: 方式 2:visudo 直接单独给用户授权(精细化权限) 找到 ,下面添加一行: 自带语法校验,写错会告警,不要直接 vim 改 ,写错直接 sudo 炸掉! 想免密 su

fengliyang_的博客 178

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Windows/Linux下强实时运动控制内核(二):基于Qt的Delta机械手的开发应用

强实时运动控制内核MotionRT750下Qt开发Delta机械手的完整开发流程。

weixin_57350300的博客 241

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Linux epoll 一篇讲透:从 select/poll 到红黑树、LT/ET,再到完整 TCP 服务器

一万个客户端已经连上服务器,眼下只有十个客户端发来了数据。服务器怎样把时间花在这十个连接上?理解这个问题,就抓住了 epoll 的主线。接下来,我们沿着“为什么需要它 → 接口怎么用 → 内核如何实现 → LT/ET 怎么写 → 完整服务器怎么运行”的顺序,把知识连起来。**阅读基础:**了解socketbindlistenaccept的基本用途即可。本文示例面向 Linux,服务器使用 C++17,实验脚本使用 Python 3。

2601_94861874的博客 164

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Linux 网络基础详解:IP、子网、路由与 ip、ss 命令实战

建库建表、增删改查、连接查询(内连左连右连)、聚合函数、权限控制 GRANT/REVOKE,每条命令配可运行示例,零基础也能跟着敲会 SQL 基础。

2502_91473995的博客 615

Linux、Shell、MySQL 测试卷逐题细讲(下篇:MySQL)

本文为Linux、Shell、MySQL测试卷下半段MySQL部分逐题讲解,包含填空、选择与SQL分析三类题型。填空题覆盖COUNT、HAVING、DISTINCT、事务、约束、索引等核心语法;选择题辨析存储过程、索引类型、ACID、存储引擎、用户管理等考点。SQL大题围绕员工、部门、职位、地点四张关联表,考察多表连接、分组聚合、自连接、相关子查询、NULL处理等高频写法,标注LEFT JOIN统计计数、NULL判断、子查询别名等易错坑点,同时梳理试卷OCR识别带来的干扰问题,重点提示SQL实操中的常见失误

dongziwen1的博客 183

深入浅出聊聊 Linux 的 PageCache 与系统极致性能

本文深入浅出解析了 Linux PageCache 的核心机制,揭示其如何通过“延迟写、预读读”提升系统性能。以监控告警为切入点,阐明 free -h 中 buff/cache 并非真正占用,真正可用内存由 available 决定。结合 Kafka、Elasticsearch、MySQL 等实战场景,说明中间件如何依赖 PageCache 实现极致性能。强调不可手动清理缓存,并建议合理调优脏页参数,避免卡顿。最终指出:内存满≠危机,而是系统高效运行的体现。

小小默:进无止境 481

Linux 下 OpenCode 接入自定义大模型 API 教程:以 DeepSeek-V4.1-Flash-1017 为例

本文介绍在Linux下通过Python脚本配置OpenCode接入自定义大模型API(以DeepSeek-V4.1-Flash-1017为例),实现永久化、非侵入式配置。通过修改~/.config/opencode/opencode.json文件,添加OpenAI兼容服务商BLSC,注册模型并设置APIKey。支持命令行测试、默认模型设定及安全权限控制,操作简单且不影响原有配置。适用于各类支持OpenAI接口的自定义模型服务,提升开发灵活性与安全性。

qq_15060477的博客 123

【Linux 命令实战(06):Linux 文件权限管理,掌握 chmod、chown、chgrp】

chmod:修改文件和目录权限。chown:修改文件所有者,也可以修改所属用户组。chgrp:修改文件所属用户组。r:读取。w:写入。x:执行,对于目录则表示进入和访问能力。ugo:分别代表所有者、所属组和其他用户。我认为,权限管理最重要的不是记住755644这些数字,而是先弄清楚谁需要访问文件、需要执行什么操作,再给出恰当的权限。尤其是在测试服务器和生产服务器上,不要为了图方便直接使用chmod 777。权限开放得越大,并不代表问题解决得越好。

一些微不足道的见解、希望能帮助各位 311

【Linux 命令实战(02):文件与目录操作,掌握 pwd、ls、cd 三个核心命令】

命令作用cd /进入根目录cd ~进入当前用户家目录cd返回当前用户家目录cd …返回上一级目录cd …/…返回上两级目录cd -返回上一次所在目录进入指定目录命令核心用途常用参数pwd查看当前目录-L、-Pls查看文件和目录cd切换目录…、~、-Linux 文件系统的基本结构。绝对路径与相对路径的区别。Tab 自动补全。Shell 通配符。使用&&组合命令。这篇文章主要解决的是如何在 Linux 文件系统中快速定位目录。

一些微不足道的见解、希望能帮助各位 196

Linux篇(五)

本文系统梳理了Linux常用终端快捷键、软件包管理(yum/apt)、服务管理(systemctl)、软链接(ln)、时间与IP配置、域名解析、固定IP设置及网络命令(ping/wget/curl),涵盖日常运维核心操作,助力高效管理Linux环境。

wykyzdq的博客 189

Linux Day29——HTTP与网络排障

*实测**:`traceroute -n -m 8 8.8.8.8` 的输出:第 1 跳 `172.17.144.1`(本机网关)、第 2 跳 `10.32.0.1`、第 3 跳 `10.50.255.253`、第 4 跳 `* * *`、第 5 跳 `221.226.71.193`、第 6 跳 `* * *`、第 7、8 跳有地址但夹着星号。`ping` 和 `traceroute` 都靠它。**实测**:`ss -lta` 看到三行 `domain`,加 `-n` 后变成 `53`。

2503_94114317的博客 156

【Linux】进程间通信的基础概念及基于匿名管道的进程池

前面我们介绍了进程的创建、退出和等待,接下来看看进程之间怎样传递数据。这篇从匿名管道入手,再用管道把父子进程联系起来,写一个简单的进程池小demo。而且我把发行版从CentOS切换成Ubuntu了,主要是CentOS已经不维护了,可惜了。。。

qeen87的博客 317

Linux的渲染与显示系统链路

Linux渲染与显示链路核心为DRM/KMS + EGL直连模式,绕过传统X11/Wayland中间层,实现低延迟、高效率的直接帧提交。相比X11的粗粒度权限控制与Wayland的合成开销,该方案链路短、资源消耗低,但仅支持单进程独占显示,缺乏窗口管理与系统级兜底。EGL作为跨平台桥梁,连接OpenGL ES与原生显示系统,通过Display、Surface、Context三要素构建渲染环境。内核层DRM管理GPU资源,KMS配置显示模式,用户态GDM负责登录会话,共同构成从硬件到应用的完整图形栈。

微小的鱼的博客 383
上一篇: k8s-单主机Master集群部署+单个pod部署lnmp论坛服务(小白的“升级打怪”成长之路)
下一篇: 部署k8s-efk日志收集服务(小白的“升级打怪”成长之路)
deeper_wind
博客等级 码龄2年 262粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值