kubernetes集群pod理论介绍

前言

在 Kubernetes 中,Pod 是最小的可部署单元,它是一个或多个容器的集合,这些容器共享网络和存储资源,并在同一主机上运行。在本文中,我们将进一步探讨 Kubernetes 集群中的 Pod,包括 Pod 的定义、调度管理、镜像拉取策略、容器重启策略等方面的内容。

目录

一、Pod 基础概念

1. 概述

2. 集群中 pod 分类

2.1 自主式/自营/静态 pod

2.1.1 概述

2.1.2 示例

2.2 控制器管理的 pod

2.2.1 概述

2.2.2 示例

3. 集群中 pod 使用方式

3.1 一个 pod 中运行一个容器

3.2 一个 pod 中同时运行多个容器

4. 容器的分类

4.1 基础容器(pause)

4.2 初始化容器(Init)

4.3 应用容器

4.4 串行启动示例

5. 相关概念及联系

二、镜像拉取策略

1. 策略分类

1.1 IfNotPresent

1.2 Always

1.3 Never

2. imagePullPolicy 默认字段设置

三、重启策略

1. 策略分类

1.1 Always

1.2 OnFailure

1.3 Never


一、Pod 基础概念

1. 概述

pod 是 K8s 集群中最小的创建和运行单元,一个 pod 代表着集群中运行的一个进程,一个 pod 包含一个或多个容器。如:应用容器/业务容器(淘宝、京东、拼多多后台)。每个 pod 有一个根容器/父容器/基础容器/ pause 容器。

在 K8s 中 pod 里的容器共享 network、uts、ipc、user、mount 六大命名空间。这意味着这些容器在同一个 Pod 内部具有相同的网络、主机名、进程间通信、用户和文件系统挂载等环境。这种共享命名空间的机制使得容器之间可以方便地进行通信和共享资源,同时也提供了更高的隔离性和安全性。

2. 集群中 pod 分类

2.1 自主式/自营/静态 pod

2.1.1 概述

不被控制器管理的 pod,不保存在 etcd 中,存放在 node 节点里。没有自愈能力,一旦 pod 挂掉不会被重新拉起,且副本数量不会因为达不到期望值而创建新的 pod,直接结束生命周期。

2.1.2 示例
[root@master01 ~]# kubectl run nginx --image=nginx[root@master01 ~]# kubectl delete pod nginx
# 删除后不会被拉起

2.2 控制器管理的 pod

2.2.1 概述

被副本控制器管理的 pod 有自愈能力,一旦挂掉会被重新拉起,且副本数量会因为达不到期望值而创建新的 pod,也就是说 pod 出现问题(删除、故障等)会自动重新创建新的 pod。

2.2.2 示例
[root@master01 ~]# kubectl create deployment nginx --image=nginx --replicas=2
[root@master01 ~]# kubectl get pod -o wide
nginx-6799fc88d8-rj2k5      1/1     Running   0          59s   10.244.1.47   node01   <none>           <none>
nginx-6799fc88d8-wjb2w      1/1     Running   0          59s   10.244.2.40   node02   <none>           <none>[root@master01 ~]# kubectl delete pod nginx-6799fc88d8-wjb2w 
pod "nginx-6799fc88d8-wjb2w" deleted
[root@master01 ~]# kubectl get pod -o wide
nginx-6799fc88d8-n6ngr      0/1     ContainerCreating   0          13s     <none>        node01   <none>           <none>
nginx-6799fc88d8-rj2k5      1/1     Running             0          3m33s   10.244.1.47   node01   <none>           <none>
# 会重新创建新的pod
nginx-6799fc88d8-n6ngr      1/1     Running   0          61s     10.244.1.48   node01   <none>           <none>
nginx-6799fc88d8-rj2k5      1/1     Running   0          4m21s   10.244.1.47   node01   <none>           <none>

3. 集群中 pod 使用方式

3.1 一个 pod 中运行一个容器

“每个 pod 中一个容器”的模式是最常见的用法;在这种使用方式中,你可以把 pod 想象成是单个容器的封装,kuberentes 管理的是 pod 而不是直接管理容器。只适合单个应用容器使用。

3.2 一个 pod 中同时运行多个容器

一个 pod 中也可以同时封装几个需要紧密耦合互相协作的容器,它们之间共享资源。这些在同一个 pod 中的容器可以互相协作成为一个 service 单位,比如一个容器共享文件,另一个“sidecar”辅助容器来更新这些文件。pod 将这些容器的存储资源作为一个实体来管理。

又叫边车模式(SideCar),如 web服务配合日志收集、监控系统、数据库。

4. 容器的分类

4.1 基础容器(pause)

基础容器通常被称为"pause容器/父容器,它是 Pod 中的一个特殊容器,用于实现 Pod 中多个容器之间的共享网络命名空间和存储卷。负责创建网络命名空间和共享存储卷,并在其他容器启动之前保持运行,进行健康检查和生存探针(用于确定容器是否正在运行。如果存活探针检测到容器内的应用程序处于错误状态,Kubernetes 将重启该容器)。具体功能:

  • 提供整个 Pod 的 linux 命令空间的基础;
  • 启用 pid 命名空间,在每个 Pod 中都作为 pid 为1的进程(init 进程),并回收僵尸进程。

可以在 node 节点中查看与 pause 容器相关的信息:

[root@node01 ~]# docker ps | grep pause
ef5bf9280b1d   k8s.gcr.io/pause:3.2   "/pause"                  23 minutes ago   Up 23 minutes             k8s_POD_nginx-6799fc88d8-n6ngr_default_41e24650-59b3-455e-b7af-8ce5bd5d261d_0
218b9370f5f6   k8s.gcr.io/pause:3.2   "/pause"                  27 minutes ago   Up 27 minutes             k8s_POD_nginx-6799fc88d8-rj2k5_default_a8c4e6fa-784c-4f71-a92e-

4.2 初始化容器(Init)

初始化容器是在 Pod 中其他容器启动之前运行的容器。它们用于在应用容器启动之前执行初始化任务,例如加载配置文件、预处理数据等。

而应用程序容器是并行运行的,所以 Init 容器能够提供了一种简单的阻塞或延迟应用容器的启动的方法。与普通的容器区别有以下两点

  • Init 容器总是运行到成功完成为止
  • 在 Kubernetes 中,每个 Init 容器必须在下一个 Init 容器启动之前成功完成启动和退出。如果一个 Pod 的 Init 容器失败,Kubernetes 会持续重启该 Pod,直到 Init 容器成功为止。但如果 Pod 的重启策略设置为 Never,那么该 Pod 不会重新启动。

作用与特点如下:

① Init 容器提供了一种简单的阻塞或延迟应用容器的启动方法

② 通常使用单独的镜像,与应用容器分离,其启动相关代码具有如下优势

  • Init 容器包含额外工具或代码,避免为此修改应用镜像;例如,没有必要仅为了在安装过程中使用类似 sed、 awk、 python 或 dig 这样的工具而去 FROM 一个镜像来生成一个新的镜像
  • 安全地运行工具,不影响应用镜像的安全性
  • 创建者和部署者可以独立工作,无需合作构建应用镜像
  • Init容器有独立文件系统视图,可访问Secrets
  • 阻塞应用容器启动,直到满足先决条件,然后并行启动应用容器

③ 可以具有访问 secrets(用于存储敏感信息,如密码、API 密钥、证书等) 的权限,而应用容器通常没有这样的权限

4.3 应用容器

是 Pod 中运行实际应用程序的容器,它们在初始化容器执行完毕后启动。应用容器通常是用户定义的主要业务容器,负责运行应用程序并处理业务逻辑。

应用容器就像是一个盛放应用程序的容器桶,负责运行你想要的软件或服务,比如网站、数据库等。可以把它想象成一个装着软件的盒子,专门运行应用程序。

4.4 串行启动示例

定义一个具有两个 Init 容器的简单 Pod。 第一个等待 myservice 启动, 第二个等待 mydb 启动。 一旦这两个 Init 容器都启动完成,Pod 将启动 spec 中的应用容器。

官网示例:Init 容器 | Kubernetes

① 编辑 yaml 文件定义 pod

[root@master01 data]# vim myapp.yaml
apiVersion: v1              # Kubernetes API 的版本
kind: Pod                   # 定义的 Kubernetes 资源类型是 Pod
metadata:                   # 定义 Pod 的元数据,比如名称和标签name: myapp-pod           # Pod 的名称labels:                   # 定义了标签app: myapp
spec:                       # 定义 Pod 的规格,包括容器和初始化容器containers:               # 定义了主要的应用容器- name: myapp-container   # 应用容器的名称image: busybox:1.28     # 要使用的容器镜像command: ['sh', '-c', 'echo The app is running! && sleep 3600']
# 指定了容器启动时执行的命令,打印一条消息然后休眠 3600 秒initContainers:           # 定义了初始化容器,用于在主应用容器启动前完成特定任务- name: init-myservice    # 初始化容器的名称image: busybox:1.28     # 初始化容器要使用的容器镜像command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
# 指定了初始化容器启动时执行的命令,等待名为 "myservice" 的服务就绪- name: init-mydb         # 另一个初始化容器的名称为 "init-mydb"image: busybox:1.28     # 初始化容器要使用的容器镜像command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
# 指定了初始化容器启动时执行的命令,这里是等待名为 "mydb" 的数据库就绪

② 启动 Pod

[root@master01 data]# kubectl apply -f myapp.yaml
pod/myapp-pod created

③ 检查其状态

[root@master01 data]# kubectl get -f myapp.yaml
NAME        READY   STATUS     RESTARTS   AGE
myapp-pod   0/1     Init:0/2   0          10s
# READY列显示了Pod中的容器的就绪状态。在这种情况下,0/1表示Pod中有一个容器,但该容器尚未准备就绪。
# STATUS列显示了Pod的状态。这里显示为Init:0/2,表示Pod中有两个初始化容器,但两个初始化容器都尚未完成。
# RESTARTS列显示了容器的重启次数。在这里是0,表示容器尚未重启过。

④ 或者查看更多详细信息

[root@master01 data]# kubectl describe -f myapp.yaml

⑤ 如需查看 Pod 内 Init 容器的日志 

[root@master01 data]# kubectl logs myapp-pod -c init-myservice
nslookup: can't resolve 'myservice'
waiting for myservice
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.localwaiting for myservice
nslookup: can't resolve 'myservice'
# 初始化容器 "init-myservice" 在尝试执行 nslookup myservice 命令时无法解析到 "myservice" 这个服务的主机名[root@master01 data]# kubectl logs myapp-pod -c init-mydb
Error from server (BadRequest): container "init-mydb" in pod "myapp-pod" is waiting to start: PodInitializing
# 初始化容器init-mydb正在等待启动,

⑥ 创建这些 Service 的配置文件

[root@master01 data]# vim services.yaml
---
apiVersion: v1        # Kubernetes API版本
kind: Service         # Service对象,用于暴露应用程序
metadata:             # 有关对象的元数据,例如名称name: myservice     # Service的名称
spec:                 # Service的规范ports:              # Service监听的端口- protocol: TCP     # 端口使用的协议port: 80          # Service暴露的端口号targetPort: 9376  # Service转发流量到Pod的端口号为9376
---
apiVersion: v1
kind: Service
metadata:name: mydb
spec:ports:- protocol: TCPport: 80targetPort: 9377

⑦ 创建 mydb 和 myservice 服务

[root@master01 data]# kubectl apply -f services.yaml
service/myservice created
service/mydb created

⑧ 再次检查状态

[root@master01 data]# kubectl get -f myapp.yaml
NAME        READY   STATUS    RESTARTS   AGE
myapp-pod   1/1     Running   0          14m
# READY: 表示Pod中容器的就绪/运行情况。这里显示1/1,表示Pod中的所有容器都已经就绪[root@master01 data]# kubectl get pod
NAME                        READY   STATUS    RESTARTS   AGE
myapp-pod                   1/1     Running   0          15m

特别说明:

  • 在Pod启动过程中,Init容器会按顺序在网络和数据卷初始化之后启动。每个容器必须在下一个容器启动之前成功退出;
  • 如果由于运行时或失败退出,将导致容器启动失败,它会根据Pod的restartPolicy指定的策略进行重试。然而,如果Pod的restartPolicy设置为Always,Init容器失败时会使用RestartPolicy策略;
  • 在所有的Init容器没有成功之前,Pod将不会变成Ready状态。Init容器的端口将不会在Service中进行聚集。正在初始化中的Pod处于Pending状态,但应该会将Initializing状态设置为true。
  • 如果Pod重启,所有Init容器必须重新执行;
  • 对Init容器spec的修改被限制在容器image字段,修改其他字段都不会生效。更改Init容器的image字段,等价于重启该Pod;
  • Init容器具有应用容器的所有字段。除了readinessProbe,因为Init容器无法定义不同于完成(completion)的就绪(readiness)之外的其他状态。这会在验证过程中强制执行;
  • 在Pod中的每个app和Init容器的名称必须唯一;与任何其它容器共享同一个名称,会在验证时抛出错误。 

5. 相关概念及联系

  • Node(节点):在 Kubernetes 中,Node 是一个工作节点,可以是物理机器或虚拟机。每个 Node 都运行着容器运行时(比如 Docker),负责运行应用程序的容器,并由 Kubernetes 管理。
  • Docker:Docker 是一种容器化平台,用于构建、发布和运行容器化应用程序。在 Kubernetes 中,Docker 负责创建、管理和运行容器,确保应用程序能够在容器中正确运行。
  • Pod(Pod组):Pod 是 Kubernetes 中最小的调度单元,可以包含一个或多个紧密关联的容器。这些容器共享网络命名空间和存储卷,并在同一个 Pod 中共享资源。Pod 可以看作是一组共享上下文的容器集合,用于部署、扩展和管理应用程序。
  • 容器:容器是一种轻量级、独立的软件打包方式,包含应用程序及其所有依赖项。容器化技术(比如 Docker)使应用程序能够在不同环境中以一致的方式运行,提高了部署的灵活性和可移植性。在 Kubernetes 中,容器是在 Pod 中运行的实际应用程序实例。

Node、Docker、Pod 和容器之间的关系是:Node 上通过 Docker 运行着多个 Pod,每个 Pod 中可以包含一个或多个容器,Docker 负责创建和管理这些容器,Kubernetes 负责在 Node 上调度和管理这些 Pod。 

二、镜像拉取策略

Pod 的核心是运行容器,必须指定容器引擎,比如 Docker,启动容器时,需要拉取镜像,k8s 的镜像拉取策略可以由用户指定。

1. 策略分类

1.1 IfNotPresent

优先使用本地已存在的镜像,如本地没有则从仓库去拉取镜像。

这里省略 imagePullPolicy 字段,容器镜像指定了非 :latest 的标签,如 nginx:1.24,观察 imagePullPolicy 策略。

① 创建 yaml 文件定义 pod

[root@master01 demo]# kubectl delete -f pod1.yaml  # 如果第一次创建忽略此条命令
pod "pod-01" deleted[root@master01 demo]# vim pod1.yaml
apiVersion: v1                    # Kubernetes API 的版本
kind: Pod                         # 资源类型是一个 Pod
metadata:                         # Pod 对象的元数据name: pod-01                    # Pod 的名称
spec:                             # Pod 的规格,包括容器、卷挂载等信息containers:                     # Pod 中的容器列表- name: nginx-01              # 容器的名称image: nginx:1.24           # 使用的容器镜像#imagePullPolicy: Never      #command: ["echo","success"] 

② 启动 pod 并查看状态

[root@master01 demo]# kubectl apply -f pod1.yaml 
pod/pod-01 created
[root@master01 demo]# kubectl get pod pod-01
NAME     READY   STATUS    RESTARTS   AGE
pod-01   1/1     Running   0          39s[root@master01 demo]# kubectl get pod pod-01 -o yaml | grep -i imagepullpolicy:imagePullPolicy: IfNotPresent
# 拉取策略为 IfNotPresent

1.2 Always

总是从仓库拉取镜像,无论本地是否存在镜像。

① 创建 yaml 文件定义 pod

[root@master01 demo]# vim pod1.yaml
apiVersion: v1                    # Kubernetes API 的版本
kind: Pod                         # 资源类型是一个 Pod
metadata:                         # Pod 对象的元数据name: pod-01                    # Pod 的名称
spec:                             # Pod 的规格,包括容器、卷挂载等信息containers:                     # Pod 中的容器列表- name: nginx-01              # 容器的名称image: nginx                # 使用的容器镜像imagePullPolicy: Always     # 镜像拉取策略为 Alwayscommand: ["echo","success"] # 容器启动时要运行的命令

② 启动 pod 并查看状态

kubectl create -f pod1.yaml[root@master01 demo]# kubectl get pod
NAME     READY   STATUS      RESTARTS   AGE
pod-01   0/1     Completed   2          60s
# Completed意味着容器内的进程已经成功完成并退出
# 此时Pod的状态异常,原因是echo执行完进程终止,容器生命周期也就结束了[root@master01 demo]# kubectl get pod pod-01 -o yaml | grep -i restartpolicy:restartPolicy: Always
# 查看重启策略:当容器退出时,K8s控制器将尝试自动重启容器

1.3 Never

不从仓库拉取镜像,仅使用本地镜像。

① 修改 yaml 文件定义 pod

[root@master01 demo]# kubectl delete -f pod1.yaml 
pod "pod-01" deleted[root@master01 demo]# vim pod1.yaml
apiVersion: v1                    # Kubernetes API 的版本
kind: Pod                         # 资源类型是一个 Pod
metadata:                         # Pod 对象的元数据name: pod-01                    # Pod 的名称
spec:                             # Pod 的规格,包括容器、卷挂载等信息containers:                     # Pod 中的容器列表- name: nginx-01              # 容器的名称image: nginx:1.24           # 使用的容器镜像imagePullPolicy: Never      # 镜像拉取策略为 Nevercommand: ["echo","success"] # 容器启动时要运行的命令

② 启动 pod 并查看状态

[root@master01 demo]# kubectl apply -f pod1.yaml 
pod/pod-01 created[root@master01 demo]# kubectl get pod pod-01
NAME     READY   STATUS              RESTARTS   AGE
pod-01   0/1     ErrImageNeverPull   0          4s
# ErrImageNeverPull,这表示容器镜像无法拉取

2. imagePullPolicy 默认字段设置

当你(或控制器)向 API 服务器提交一个新的 Pod 时,你的集群会在满足特定条件时设置 imagePullPolicy 字段:

  • 如果你省略了 imagePullPolicy 字段,并且你为容器镜像指定了版本, 那么 imagePullPolicy 会自动设置为 IfNotPresent;
  • 如果你省略了 imagePullPolicy 字段,并且容器镜像的标签是 :latest, imagePullPolicy 会自动设置为 Always;
  • 如果你省略了 imagePullPolicy 字段,并且没有指定容器镜像的标签, imagePullPolicy 会自动设置为 Always;
  • 如果你省略了 imagePullPolicy 字段,并且为容器镜像指定了非 :latest 的标签, imagePullPolicy 就会自动设置为 IfNotPresent。

注意:

  • 镜像为 latest 或者无标签时,默认拉取镜像策略为 Always
  • 镜像标签为非 :latest 加标签时,默认的镜像拉取策略为 IfNotPresent

三、重启策略

当 Pod 中的容器退出时通过节点上的 kubelet 重启容器,适用于 Pod 中的所有容器。注意:K8S 中不支持重启 Pod 资源,只有删除重建。

1. 策略分类

1.1 Always

容器退出时总是重启容器,不管返回状态码如何,总是重启容器,默认的策略。

[root@master01 demo]# kubectl get pod pod-01 -o yaml | grep -i restartpolicy:restartPolicy: Always
# 默认重启策略

1.2 OnFailure

仅在容器异常退出时(返回状态码为非0时)会重启策略,正常退出则不重启容器。

 ① 创建 yaml 文件定义 pod

[root@master01 demo]# vim pod2.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-02
spec:containers:- name: busyboximage: busyboxargs:                  # 容器执行的命令参数,和command类似- /bin/sh - -c                   # 表示后面紧跟着要执行的命令- sleep 5; exit 1restartPolicy: OnFailure # 在容器内执行的命令,即让容器休眠5秒后以状态码 1 退出

② 启动 pod 并查看、追踪状态

[root@master01 demo]# kubectl apply -f pod2.yaml 
pod/pod-02 created[root@master01 demo]# kubectl get pod -w
NAME     READY   STATUS              RESTARTS   AGE
pod-02   0/1     ContainerCreating   0          2s
pod-02   1/1     Running             0          18s
pod-02   0/1     Error               0          23s
pod-02   1/1     Running             1          24s
pod-02   0/1     Error               1          29s
pod-02   0/1     CrashLoopBackOff    1          41s
pod-02   1/1     Running             2          57s
pod-02   0/1     Error               2          62s
pod-02   0/1     CrashLoopBackOff    2          75s
# 容器在运行过程中由于执行的命令导致失败,触发了重启策略

③ 修改 yaml 文件退出状态码

[root@master01 demo]# kubectl delete -f pod2.yaml 
pod "pod-02" deleted
[root@master01 demo]# vim pod2.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-02
spec:containers:- name: busyboximage: busyboxargs:- /bin/sh- -c- sleep 5        # 去掉 exit 1restartPolicy: OnFailure

④ 启动 pod 并查看 sleep 前后状态

[root@master01 demo]# kubectl get pod -w
NAME     READY   STATUS    RESTARTS   AGE
pod-02   0/1     ContainerCreating   0          1s
pod-02   1/1     Running             0          18s
pod-02   0/1     Completed           0          23s
# 退出后不会触发重启策略[root@master01 demo]# kubectl get pod pod-02 -o yaml | grep -i restartpolicy:restartPolicy: OnFailure

1.3 Never

容器退出时从不重启容器,不管返回状态码如何。

① 修改 yaml 文件

[root@master01 demo]# vim pod2.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-02
spec:containers:- name: busyboximage: busyboxargs:- /bin/sh- -c- sleep 5restartPolicy: Never

② 启动 pod 并查看、追踪状态

[root@master01 demo]# kubectl delete -f pod2.yaml 
pod "pod-02" deleted
[root@master01 demo]# kubectl apply -f pod2.yaml 
pod/pod-02 created[root@master01 demo]# kubectl get pod -w
NAME     READY   STATUS              RESTARTS   AGE
pod-02   0/1     ContainerCreating   0          3s
pod-02   1/1     Running             0          17s
pod-02   0/1     Completed           0          23s
# Completed 表示该 Pod 中的容器已经成功完成了它们的任务并且已经退出
# 未发生重启

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

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

相关文章

C++成员函数 - 析构函数

析构函数 析构函数 是特殊的成员函数&#xff0c;其 特征 如下&#xff1a; 1. 析构函数名是在类名前加上字符 ~ 。 2. 无参数无返回值类型。 3. 一个类只能有一个析构函数。若未显式定义&#xff0c;系统会自动生成默认的析构函数。注意&#xff1a;析构函数不能重 载 …

组成aim的方法数2(无限多张)

题目描述&#xff1a;arr是面值数组&#xff0c;其中的值都是正数且没有重复&#xff0c;再给定一个正数aim&#xff0c;每个值都认为是一种面值&#xff0c;且认为张数是无线的&#xff0c;返回组成aim的方法数。例如&#xff0c;arr[1,2]&#xff0c;aim4&#xff0c;方法有&…

Mysql基础(七)DQL之select 语句(二)

一 select 语句续 WHERE子句后面跟着的是一个或多个条件,用于指定需要检索的行COUNT(): 多少条数据 where 11 和 count(1) 与 count(*) count(1)、count(*)和count(指定字段)之间的区别 ① order by 排序 mysql 之数据排序扩展 1、使用 order by 语句来实现排序2、排序可…

洛谷P3574 [POI2014] FAR-FarmCraft(树形dp)

洛谷 P 3574 [ P O I 2014 ] F A R − F a r m C r a f t &#xff08;树形 d p &#xff09; \Huge{洛谷P3574 [POI2014] FAR-FarmCraft&#xff08;树形dp&#xff09;} 洛谷P3574[POI2014]FAR−FarmCraft&#xff08;树形dp&#xff09; 文章目录 题意题目说明 思路标程 题目…

nuxt: generate打包后访问资源404问题

现象 使用Nuxt.js开发的个人页面&#xff0c;部署到nginx服务器中&#xff0c;/_nuxt/*.js、/_nuxt/*.css等静态问题不能访问&#xff0c;提示404错误。 而我们的这些资源文件是存在的。 解决方法 加上此处代码进行上下文配置 baseURL: /nuxt/ 此时在nginx配置 /nuxt 代理 lo…

【Maven打包将resources/lib/下的jar也打包进jar包中】

Maven打包将resources/lib/下的jar也打包进jar包中 &#xff01;&#xff01;&#xff01;少走弯路 第一步 resources/lib/下引入jar ftp4j-1.7.2.jar替换为自己jar包的名称 <dependency><groupId>it.sauronsoftware.ftp4j</groupId><artifactId>ft…

张大哥笔记:穷人都在拼命挣钱,而富人都在努力让自己更值钱

最近行业大佬&#xff0c;纷纷网红化&#xff0c;比如周鸿祎&#xff0c;雷军&#xff0c;刘强东纷纷下场&#xff01; 大佬当网红&#xff0c;图啥&#xff1f;当然是图钱了。 大佬都很精的&#xff0c;他们老早就运用媒体的传播杠杆&#xff0c;把自己热度炒起来。 在不断…

hyperf 多对多关联模型

这里使用到三张表&#xff0c;一张是用户&#xff08;users&#xff09;&#xff0c;一张是角色(roles)&#xff0c;一张是用户角色关联表(users_roles)&#xff0c; 首先创建用户模型、角色模型 php bin/hyperf.php gen:model users php bin/hyperf.php gen:model rolesusers…

屎山代码SSM转换Springboot

SSM项目转Springboot项目 最近很多人可能是在网上买的那种屎山代码&#xff0c;数据库都是拼音的那种 比如项目如下所示&#xff1a; 这种屎山代码我改过太多了&#xff0c;很多人可能无从下手&#xff0c;因为代码结构太混乱了&#xff0c;但是我改过太多这种代码&#xff0…

[BT]小迪安全2023学习笔记(第29天:Web攻防-SQL盲注)

第29天 盲注 基于布尔 ?id1 and length(database())7通过AND&#xff0c;当数据库名字长度等于7时返回正常页面&#xff0c;否则返回其他&#xff08;或错误&#xff09;页面 其他函数&#xff1a; left(databse(),a)&#xff1a;截取数据库名的左侧前a位字符 substr(a,b,c…

Spring Boot:将文件推送到 FTP 服务器

在企业应用中&#xff0c;将文件推送到 FTP 服务器是一个常见的需求。本文将介绍如何在 Spring Boot 项目中实现将文件推送到 FTP 服务器&#xff0c;包括引入依赖、自定义配置和编写代码示例。 1. 引入依赖 首先&#xff0c;在 Spring Boot 项目的 pom.xml 文件中引入 Apach…

QGraphicsView中鼠标位置图像缩放时不变

设置QGraphicsView的变换锚和调整尺寸锚到鼠标下面的操作&#xff0c;是一个很常见的模式&#xff0c;尤其在实现图形视图的缩放和滚动功能时。这两行代码的作用是提高用户与图形界面交互的直观性和效率。 setTransformationAnchor(QGraphicsView::AnchorUnderMouse)&#xff1…

ASP+ACCESS公司门户网站建设

【摘 要】随着计算机科学的发展&#xff0c;数据库技术在Internet中的应用越来越广泛&#xff0c;为广大网络用户提供了更加周到和人性化的服务。本文讲解了一个公司的网站的建设&#xff0c;它基于数据关联规则的公司个性化页面及动态数据生成案例&#xff0c;在网页方面&…

甲方怒喷半小时:一次项目上线失败的深刻教训

哈喽大家好,这里是你们的老朋友小米~最近工作忙得不可开交,这不,昨夜又是一个通宵夜,因为一些原因导致了项目上线失败。今天在会议上被甲方喷了整整半个小时,我心里五味杂陈,但作为一个技术分享爱好者,我决定把这次经历记录下来,希望能给大家一些启发。 需求背景:一个…

HDFS,HBase,MySQL,Elasticsearch ,MongoDB分别适合存储什么特征的数据?

HDFS&#xff08;Hadoop Distributed File System&#xff09;通常用于存储大规模数据&#xff0c;适合存储结构化和非结构化数据&#xff0c;例如文本文件、日志数据、图像和视频等。 HBase是基于Hadoop的分布式数据库&#xff0c;适合存储大量非结构化和半结构化的数据&…

编程基础:掌握运算符与优先级

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、运算符的基石&#xff1a;加减乘除 二、比较运算符&#xff1a;判断数值大小 三、整除…

【Redis】String源码剖析:512MB大字符串的内存管理之道

大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#xff0c;但是也想日更的人。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4aa;&#x1f4aa;&#x1f4aa…

WebSocket——相关介绍以及后端配置

一、WebSocket介绍&#xff1a; WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;旨在改进客户端和服务器之间的实时通信。以下是关于WebSocket的详细介绍&#xff1a; 1、定义与标准 WebSocket是独立的、创建在TCP上的协议&#xff0c;通过HTTP/1.1协议的10…

13.js对象

定义 一种复杂数据类型&#xff0c;是无序的&#xff08;不保留键的插入顺序&#xff09;&#xff0c;以键值对&#xff08;{key:value})形式存放的数据集合 对象的创建 &#xff08;1&#xff09;字面量创建 var 对象名{ } &#xff08;2&#xff09;内部构造函数创建 v…

【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…