【Kurbernetes集群】Pod资源、Pod资源限制和Pod容器的健康检查(探针)详解

Pod资源

  • 一、Pod概述
    • 1.1 Pod的定义
    • 1.2 一个Pod能包含几个容器?
    • 1.3 Pod的分类
      • 1.3.1 控制器管理的Pod
      • 1.3.2 自主式Pod
      • 1.3.3 静态Pod
    • 1.4 Pod中容器的分类
      • 1.4.1 Pause容器
      • 1.4.2 初始化容器
      • 1.4.3 应用容器
    • 1.5 Pod常见的状态
  • 二、Pod中的策略
    • 2.1 镜像拉取策略
    • 2.2 Pod中容器的重启策略
  • 三、Pod容器的资源限制 (面试必问)
    • 3.1 基于Requests和Limits的Pod调度机制
    • 3.2 Pod容器的资源限制
    • 3.3 资源量单位
    • 3.4 大页内存
    • 3.5 相关命令
    • 3.6 举个例子
      • a. container 的参数:
      • b. Pod 参数:
      • 执行效果
    • 补充:Pod中容器会触发oom错误的原因
  • 四、Pod容器的健康检查
    • 4.1 使用背景
    • 4.2 Pod容器的健康检测方式(三种探针)
      • 4.2.1 Liveness Probe(存活探针)
      • 4.2.2 Readiness Probe(就绪探针)
      • 4.2.3 Startup Probe(启动探针)
    • 4.3 Probe支持的三种检查方法
      • 4.3.1 exec方式
      • 4.3.2 tcpSocket方式
      • 4.3.3 httpGet方式
    • 4.4 探测参数和探测结果
  • 五、健康检查应用实例
    • 5.1 LivenessProbe 探针使用示例
      • 示例1:exec方式
      • 示例2:httpGet方式
      • 示例3:通过 TCP 方式做健康探测
    • 5.2 ReadinessProbe 探针使用示例
    • 5.3 StartupProbe 探针使用示例
  • 六、Pod应用容器生命周期的启动动作和退出动作

一、Pod概述

1.1 Pod的定义

Pod是kurbernets集群中最小的创建和运行管理单元,一个 Pod 又由多个容器组成。

1.2 一个Pod能包含几个容器?

1个pause容器(基础容器/父容器/根容器)
1个或者多个应用容器(业务容器)
在这里插入图片描述

通常一个Pod最好只包含一个应用容器,一个应用容器最好也只运行一个业务进程

同一个Pod里的容器都是运行在同一个node节点上的,并且共享 net、mnt、uts、 pid、 ipc 命名空间

1.3 Pod的分类

1.3.1 控制器管理的Pod

1)由scheduler进行调度的;

2)被控制器管理的;

3)有自愈能力,一旦Pod挂掉了,会被控制器重启拉起;

4)有副本管理、滚动更新等功能。

#创建命令
kubectl create deployment/statefulset/daemonset ....

1.3.2 自主式Pod

1)由scheduler进行调度的;

2)不被控制器管理的

3)没有自愈能力,一旦Pod挂掉了,不会被重启拉起;

4)没有副本管理、滚动更新功能

#创建命令
kubectl run ....

1.3.3 静态Pod

1)不由schedule调度,是由kubelet自行管理

2)始终和kubelet运行在同一个node节点上,不能直接删除

静态Pod的yaml配置文件目录默认存放 于/etc/kubernetes/manifests目录。

此目录下创建或者删除yaml配置文件,kubelet会自动创建或删除静态Pod。

1.4 Pod中容器的分类

在这里插入图片描述

1.4.1 Pause容器

Pause容器,基础容器/父容器/根容器。

作用:
1)作为linux命名空间(net mnt uts pid ipc)共享的基础,给Pod里的其它容器提供网络、存储资源的共享

​ 2)作为pid=1init进程管理整个Pod容器组的生命周期

1.4.2 初始化容器

Init Container ,初始化容器。

作用:
1)为应用容器启动前提供运行依赖环境或者工具包;

2)可以阻塞或者延迟应用容器的启动

特性:Pod有多个init容器时,是串行启动的,即要在上一个init容器成功的完成启动、运行、退出后,才会启动下一个init容器。

1.4.3 应用容器

应用容器(Main Container) ,也叫业务容器。

**作用:**提供应用程序业务

特性:Pod有多个应用容器时,是并行启动的,即应用容器要在所有init容器都成功的完成启动、运行、退出后才会启动。

1.5 Pod常见的状态

在这里插入图片描述

状态状态名描述
Pending挂起们在请求创建 pod 时,条件不满足,调度没有完成,没有任何一个节点能满足调度条件。已经创建了但是没有适合它运行的节点叫做挂起,这其中也包含集群为容器创建网络,或者下载镜像的过程。
RunningPod 内所有的容器都已经被创建,且至少一个容器正在处于运行状态、正在启动状态或者重启状态
Succeeded容器成功退出Pod 中所以容器都执行成功后退出,并且没有处于重启的容器
Failed容器失败退出Pod 中所以容器都已退出,但是至少还有一个容器退出时为失败状态
Unknown未知状态节点之上的 kubelet 本身出故障,那么 apiserver 就连不上 kubelet,得不到信息了,就会看 Unknown

二、Pod中的策略

2.1 镜像拉取策略

Kubernetes 是一个容器编排平台,用于管理和运行容器化应用程序,在 Kubernetes 中,容器是通过镜像创建的,而镜像可以从容器注册表中拉取。
在这里插入图片描述

imagePullPolicy 是一个用于定义 Kubernetes Pod 中容器镜像拉取策略的属性。

当 Pod 创建或重新启动时,Kubernetes 会根据 imagePullPolicy 属性确定容器镜像的拉取策略。

描述
ifNotPresent优先使用本地已存在的镜像,如果本地没有则从仓库拉取镜像。是标签为非latest的镜像的默认拉取策略
Always总是从仓库拉取镜像,无论本地是否已存在镜像。是标签为latest或无标签的镜像的默认拉取策略
Never仅使用本地镜像,总是不从仓库拉取镜像

默认情况下imagePullPolicy 的值为 Always,这意味着 Kubernetes 在创建或重新启动 Pod 时,始终尝试拉取最新的镜像。

2.2 Pod中容器的重启策略

重启策略restartPolicy(与containers字段同一层级)。
在这里插入图片描述

1)Always

当Pod容器退出时,总是重启容器,无论容器退出状态码如何。是默认的容器重启策略

2)OnFailure

当Pod容器异常退出时(容器退出状态码为非0),才会重启容器;正常退出的容器(容器退出状态码为0)不会重启。

3)Never

当Pod容器退出时,总是不重启容器,无论容器退出状态码如何

三、Pod容器的资源限制 (面试必问)

官方文档:为 Pod 和容器管理资源 | Kubernetes

3.1 基于Requests和Limits的Pod调度机制

  • 当为 Pod 中的容器指定了 request 资源时,代表容器运行所需的最小资源量,调度器就使用该信息来决定将 Pod 调度到哪个节点上。

  • 当为容器指定了 limit 资源时,kubelet 就会确保运行的容器不会使用超出所设的 limit 资源量

  • 调度器在调度时,首先要确保调度后该节点上所有Pod的CPU和内存的Requests总和,不超过该节点能提供给Pod使用的CPU和Memory的最大容量值。

  • 可能某节点上的实际资源使用量非常低,但是已运行Pod配置的Requests值的总和非常高,再加上需要调度的Pod的Requests值,会超过该节点提供给Pod的资源容量上限,这时Kubernetes仍然不会将Pod调度到该节点上。

  • 如果Kubernetes将Pod调度到该节点上,之后该节点上运行的Pod又面临服务峰值等情况,就可能导致Pod资源短缺。

3.2 Pod容器的资源限制

与image字段同一层级

`resources.requests.cpu|memory|hugepages-<size>|ephemeral-storage|gpu(需要第三方插件支持)`     #设置Pod容器创建时需要预留的资源量
`resources.limits.cpu|memory|hugepages-<size>|ephemeral-storage|gpu(需要第三方插件支持)`       #设置Pod容器能够使用的最大资源量

3.3 资源量单位

Kubernetes的计算资源单位是大小写敏感的。

1.CPU

资源量单位
CPU核(Cores)数/个数1 、2 、 0.1 、0.5、 1.25
CPU豪核(mCores)1000m、 2000m 、 100m 、 500m 、1250m

例如:一个Pod分配 0.5 核 CPU,表示它占用了系统总CPU能力的一半。

2.内存

内存的Requests和Limits计量单位是字节数,使用整数或者定点整数加上国际单位制(InternationalSystem of Units)来表示内存值。

KiB与MiB是以二进制表示的字节单位,常见的KB与MB则是以十进制表示的字节单位。

◎ 1 KB(KiloByte)= 1000 Bytes = 8000 Bits;
◎ 1 KiB(KibiByte)= 210Bytes = 1024 Bytes = 8192 Bits。因此,128974848、129e6、129M、123Mi的内存配置是一样的。

资源量单位描述
内存 (memory)KiB与MiB、KB与MB用于表示容器可用的内存大小
临时存储 (ephemeral-storage)KiB与MiB 、KB与MB表示容器可以使用的临时存储空间大小,通常用于临时存储数据、日志等
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    resources:
      requests:
        memory: "1Gi"
        ephemeral-storage: "100Gi"
      limits:
        memory: "2Gi"
        ephemeral-storage: "200Gi"
        #上面的示例中,容器请求 1GB 内存和 100GB 临时存储空间,同时容器的上限为 2GB 内存和 200GB 临时存储空间。

3.4 大页内存

hugepages-2Mi 是 Linux 内核提供的一种机制,用于管理大页内存,即 2MB 页大小的内存
大页内存的使用可以提升内存访问效率,特别是对于需要大量内存的应用程序,如数据库等。

在 Pod 的 YAML 文件中,可以通过设置 hugepages-2Mi 资源请求和限制来指定应用程序需要的大页内存数量。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    resources:
      requests:
        hugepages-2Mi: 4Gi
      limits:
        hugepages-2Mi: 8Gi
#容器请求 4GB 的 HugePages-2Mi 内存
#同时容器的限制为 8GB 的 HugePages-2Mi 内存

注意,请求和限制的值必须是 HugePages-2Mi 页的整数倍

容器可以通过挂载 HugePages-2Mi 文件系统来访问 HugePages-2Mi 内存。

mkdir /mnt/huge
mount -t hugetlbfs -o pagesize=2M none /mnt/huge
#在容器内创建 /mnt/huge 目录并挂载 HugePages-2Mi 文件系统
#容器可以将内存分配给 /mnt/huge 目录,并通过 mmap() 系统调用映射 HugePages-2Mi 内

3.5 相关命令

#查看Pod中的每个容器的资源限制的配置
kubectl describe [-n 命名空间] pod <pod名称> 

在这里插入图片描述

#查看node节点的每个Pod和总的资源限制情况
kubectl describe node <node名称>                 

在这里插入图片描述

3.6 举个例子

计算资源使用情况监控

apiVersion: v1
kind: LimitRange
metadata:
  name: mylimits
spec:
  limits:
    - type: Pod      # pod 的max、min、maxLimitRequestRatio
      max:
        cpu: "4"
        memory: 2Gi
      min:
        cpu: 200m
        memory: 6Mi
      maxLimitRequestRatio:
        cpu: "3"
        memory: "2"
      
    - type: Container        #container 级别的default、defaultRequest、max、min、maxLimitRequestRatio
      default:
        cpu: 300m
        memory: 200Mi
      defaultRequest:
        cpu: 200m
        memory: 100Mi
      max:
        cpu: "2"
        memory: 1Gi
      min:
        cpu: 100m
        memory: 3Mi
      maxLimitRequestRatio:
        cpu: "5"
        memory: "4"


#创建方式
kubectl create -f <yaml文件名> --namespace=<namespaces名>

a. container 的参数:

max、min: 指的是单个container 的最大值和最小值限制.

maxLimitRequestRatio: 指的是MaxLimit/Requests Ratio的比值。

可以设置Default Request和Default Limit参数,值得是默认Pod中所有未指定Request/Limits值的容器的默认Request/Limits值。

Min ≤ Default Request ≤ Default Limit ≤Max。

b. Pod 参数:

max、min: 指的是Pod中所有容器的Requests值的总和最大值和最小值。

maxLimitRequestRatio:Pod中所有容器的Limits值总和与Requests值总和的比例上限。

Pod不能设置Default Request和Default Limit参数。

#注意
 a.Container 设置了max ,容器必须设置limits。Pod内容器未设置Limits,将使用Default Limit,如果也未设置Default,则无法成功创建。
 设置了max,那么容器需要limits > DefaultsLimits > 无法成功创建。

b. Container 设置了Min,集群中容器必须设置Requests,如果未设置Request,将使用defaultRequest,如果也为配置DefaultRequest,会默认等于该容器的Limits,如果Limits也未定义,就会报错。

 设置了min,  那么 需要Requests > DefaultRequest> Limits > 报错。依次使用字段。

 c. Pod里任何容器的Limits与Requests的比例都不能超过Container的Max Limit/RequestsRatio;Pod里所有容器的Limits总和与Requests的总和的比例不能超过Pod的Max Limit/RequestsRatio。

执行效果

  • 命名空间中LimitRange只会在Pod创建或者更新时执行检查。
  • 如果手动修改LimitRange为一个新的值,那么这个新的值不会去检查或限制之前已经在该命名空间中创建好的Pod。
  • 如果在创建Pod时配置的资源值(CPU或者内存)超过了LimitRange的限制,那么该创建过程会报错,在错误信息中会说明详细的错误原因。

补充:Pod中容器会触发oom错误的原因

如果Pod容器中进程使用的内存超过limits.memory设置的资源量,会引发内存不足(OOM)错误

四、Pod容器的健康检查

探针(Probe)

4.1 使用背景

因为 k8s 中采用大量的异步机制、以及多种对象关系设计上的解耦,当应用实例数 增加/删除、或者应用版本发生变化触发滚动升级时,系统并不能保证应用相关的 service、ingress 配置总是及时能完成刷新。

在一些情况下,往往只是新的 Pod 完成自身初始化,系统尚未完成 Endpoint、负载均衡器等外部可达的访问信息刷新,老得 Pod 就立即被删除,最终造成服务短暂的额不可用,这对于生产来说是不可接受的。

所以 k8s 就加入了一些存活性探针:startupProbe、livenessProbe、readinessProbe。

4.2 Pod容器的健康检测方式(三种探针)

4.2.1 Liveness Probe(存活探针)

探测容器是否在正常运行

如果探测失败kubelet杀掉容器,并根据容器重启策略决定是否重启容器

4.2.2 Readiness Probe(就绪探针)

探测Pod是否进入就绪状态(ready状态栏是否100%比例),并做好接收service请求的准备。

如果探测失败则Pod变成未就绪状态(ready状态栏不是100%比例),service资源会删除所关联的Pod的端点,并不会转发请求给未就绪的Pod

4.2.3 Startup Probe(启动探针)

探测容器内的应用进程是否启动成功。

在启动探针探测成功之前,存活探针和就绪探针都会暂时处于无效状态,直到启动探针探测成功

如果探测失败,kubelet会杀掉容器,并根据容器重启策略决定是否重启容器。

4.3 Probe支持的三种检查方法

4.3.1 exec方式

在容器中执行linux命令

如果命令返回码为0则认为探测成功

如果命令返回码为非0值则认为探测失败

4.3.2 tcpSocket方式

PodIP指定的端口发送tcp连接请求

如果端口正确且tcp连接成功则认为探测成功

如果tcp连接失败则认为探测失败

4.3.3 httpGet方式

Pod IP指定的端口URL路径发送HTTP GET请求

如果HTTP响应状态码为2XX3XX则认为探测成功

如果HTTP响应状态码为4XX5XX则认为探测失败

4.4 探测参数和探测结果

探测参数描述
initialDelaySeconds指定容器启动后延迟探测的秒数默认是 0 秒,最小值是 0
periodSeconds指定每次探测间隔的秒数默认是 10 秒,最小值是 1
failureThreshold探测连续失败判断整体探测失败的次数默认值是 3,最小值是 1
timeoutSeconds指定探测超时等待的秒数默认值是 1 秒,最小值是 1
探测结果描述
Success成功表示容器通过了检测
Failure失败表示容器未通过检测
Unknown未知表示检测没有正常进行

五、健康检查应用实例

官方示例:Configure Liveness, Readiness and Startup Probes | Kubernetes

5.1 LivenessProbe 探针使用示例

示例1:exec方式

思路整理

1)容器在初始化后,执行命令;

/bin/sh -c "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600"`

#创建一个 /tmp/healthy 文件
#然后执行睡眠命令,睡眠 30 秒
#到时间后执行删除 /tmp/healthy 文件命令

2)设置的存活探针检检测方式执行 shell 命令

用 cat 命令输出 healthy 文件的内容,如果能成功执行这条命令一次(默认 successThreshold:1),存活探针就认为探测成功

由于没有配置(failureThreshold、timeoutSeconds),所以执行(cat /tmp/healthy)并只等待 1s,如果 1s 内执行后返回失败,探测失败。

3)判断方式:

在前 30 秒内,由于文件存在,所以存活探针探测时执行 cat /tmp/healthy 命令成功执行。

30 秒后 healthy 文件被删除,所以执行命令失败,Kubernetes 会根据 Pod 设置的重启策略来判断,是否重启 Pod。

编写配置清单文件

vim liveness-exec.yaml

apiVersion: v1
kind: Pod
metadata:
    name: liveness-exec
    labels:
        app: liveness
spec:
    containers:
        - name: liveness
          image: busybox
          args: #创建测试探针探测的文件
              - /bin/sh
              - -c
              - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
          livenessProbe:
              initialDelaySeconds: 10 #延迟检测时间
              periodSeconds: 5 #检测时间间隔
              exec: #使用命令检查
                  command: #指令,类似于运行命令sh
                      - cat #sh 后的第一个内容,直到需要输入空格,变成下一行
                      - /tmp/healthy #由于不能输入空格,需要另外声明,结果为sh cat"空格"/tmp/healthy

创建Pod并观察健康探测状况

#创建
kubectl create -f liveness-exec.yaml

在这里插入图片描述

#详细信息
kubectl describe pods liveness-exec

在这里插入图片描述

示例2:httpGet方式

思路

1)在 pod 启动后,初始化等待 20s 后,livenessProbe 开始工作,去请求 http://Pod_IP:8081/ping 接口,考虑到请求会有延迟,所以给这次请求操作一直持续 5s;

2)如果 5s 内访问返回数值在>=200 且<=400 代表第一次检测 success,如果是其他的数值,或者 5s 后还是假死状态,执行类似(ctrl+c)中断,并反回 failure 失败。

等待 10s 后,再一次的去请求 http://Pod_IP:8081/ping 接口。

3)判断方式

如果有连续的 2 次都是 success,代表无问题

如果期间有连续的 5 次都是 failure,代表有问题,直接重启 pod,此操作会伴随 pod 的整个生命周期。

编写资源配置清单文件

vim liveness-http.yaml

apiVersion: v1
kind: Pod
metadata:
    name: liveness-http
    labels:
        test: liveness
spec:
    containers:
        - name: liveness
          image: nginx:latest
          livenessProbe:
              failureThreshold: 5 #检测失败5次表示未就绪
              initialDelaySeconds: 20 #延迟加载时间
              periodSeconds: 10 #重试时间间隔
              timeoutSeconds: 5 #超时时间设置
              successThreshold: 1 #检查成功1次表示就绪
              httpGet:
                  scheme: HTTP
                  port: 8081
                  path: /ping

Kubernetes 将使用 HTTP GET 请求来探测容器中的 /ping 路径,并在每隔 10 秒进行一次探测。

如果容器返回成功的响应(HTTP 状态码为 2xx),则认为该容器是存活和就绪的。

如果连续失败 5 次,容器将被标记为未准备就绪

kubectl create -f 
kubectl describe pod liveness-http

在这里插入图片描述

示例3:通过 TCP 方式做健康探测

思路

1)在容器启动 initialDelaySeconds 参数设定的时间后,kubelet 将发送第一个livenessProbe 探针,尝试连接容器的 80 端口,类似于 telnet 80 端口;

2)每隔 20 秒(periodSeconds)做探测,如果连接失败则Pod 重启容器;

3)如果容器的存活探针在连续 2 次检查中失败,则容器将被认为是不健康的,并且 Kubernetes 将尝试重启该容器,或将其从集群中删除。

编写配置清单文件

vim liveness-tcp.yaml

apiVersion: v1
kind: Pod
metadata:
    name: liveness-tcp
    labels:
        app: liveness
spec:
    containers:
        - name: liveness
          image: nginx
          livenessProbe:
              initialDelaySeconds: 15
              periodSeconds: 20
              tcpSocket:
                  port: 80
              failureThreshold: 2

测试

kubectl apply -f liveness-tcp.yaml
kubectl describe pod liveness-tcp

在这里插入图片描述

5.2 ReadinessProbe 探针使用示例

ReadinessProbe 探针使用方式和 LivenessProbe 探针探测方法一样,也是支持三种,只是一个是用于探测应用的存活,一个是判断是否对外提供流量的条件。

vim readiness-exec.yaml

apiVersion: v1
kind: Pod
metadata:
    name: readiness-exec
    labels:
        app: readiness-exec
spec:
    containers:
        - name: readiness-exec
          image: busybox
          args: #创建测试探针探测的文件
              - /bin/sh
              - -c
              - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
          livenessProbe:
              initialDelaySeconds: 10
              periodSeconds: 5
              exec:
                  command:
                      - cat
                      - /tmp/healthy
---
apiVersion: v1
kind: Pod
metadata:
    name: readiness-http
    labels:
        app: readiness-http
spec:
    containers:
        - name: readiness-http
          image: test.com/test-http-prober:v0.0.1
          ports:
              - name: server
                containerPort: 8080
              - name: management
                containerPort: 8081
          readinessProbe:
              initialDelaySeconds: 20
              periodSeconds: 5
              timeoutSeconds: 10
              httpGet:
                  scheme: HTTP
                  port: 8081
                  path: /ping
---
apiVersion: v1
kind: Pod
metadata:
    name: readiness-tcp
    labels:
        app: readiness-tcp
spec:
    containers:
        - name: readiness-tcp
          image: nginx
          livenessProbe:
              initialDelaySeconds: 15
              periodSeconds: 20
              tcpSocket:
                  port: 80

5.3 StartupProbe 探针使用示例

思路

1)在容器启动 initialDelaySeconds (5 秒) 参数设定的时间后,kubelet 将发送第一个 StartupProbe 探针,尝试连接容器的 80 端口。;

2)如果连续探测失败没有超过 3 次 (failureThreshold) ,且每次探测间隔为 5 秒 (periodSeconds) 和探测执行时间不超过超时时间 10 秒/每次 (timeoutSeconds),则认为探测成功,反之探测失败,kubelet 直接杀死 Pod。

文件编写及测试

vim startup.yaml

apiVersion: v1
kind: Pod
metadata:
    name: startup
    labels:
        app: startup
spec:
    containers:
        - name: startup
          image: nginx
          startupProbe:
              failureThreshold: 3 # 失败阈值,连续几次失败才算真失败
              initialDelaySeconds: 5 # 指定的这个秒以后才执行探测
              timeoutSeconds: 10 # 探测超时,到了超时时间探测还没返回结果说明失败
              periodSeconds: 5 # 每隔几秒来运行这个
              httpGet:
                  path: /test
                  port: 80

六、Pod应用容器生命周期的启动动作和退出动作

lifecycle.postStart 设置Pod中的应用容器启动时额外执行的操作
lifecycle.preStop 设置Pod中的应用容器被kubelet杀掉退出时执行的操作(不包含容器自行退出的情况)
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络】HTTPS

文章目录 前言为什么会出现 HTTPSHTTPS 是如何进行加密的1. 对称加密非对称加密中间人攻击3. 引入证书 前言 前面我们学习了应用层中使用比较常见的 HTTP 协议&#xff0c;但是呢&#xff1f;在实际的使用中&#xff0c;浏览器和服务器之间的通信其实很少使用到 HTTP&#xff…

Google Firebase PHP实现消息推送

获取key的方法&#xff1a; 登录谷歌开发者后台 https://console.firebase.google.com/?hlzh-cn function firebaseNotice($title,$body){$token_arr[token1,token2]; //用户的firebasetoken列表$notify_msg ["notification" > ["title" > $title…

C++入门 1——命名空间,缺省参数

C入门 一.前言二.命名空间2.1命名空间的定义2.2命名空间的使用 三.C的输入&输出四.缺省参数4.1概念4.2缺省分类 五.函数重载5.1概念5.2函数重载条件及代码 六.引用6.1概念6.2引用特性6.3常引用6.4使用6.5引用和指针的区别和联系 七.内联函数7.1概念7.2特性 一.前言 今天就…

[ Linux Busybox ] nandwrite 命令解析

文章目录 相关结构体nandwrite 函数实现nandwrite 实现流程图 文件路径&#xff1a;busybox-1.20.2/miscutils/nandwrite.c 相关结构体 MTD 相关信息结构体 struct mtd_info_user {__u8 type; // MTD 设备类型__u32 flags; // MTD设备属性标志__u32…

(免费版?)CLion Nova 强势登陆 C 和 C++ 开发领域

系列文章目录 文章目录 系列文章目录前言一、CLion Nova二、目标三、优势和改进四、显著差异五、如何安装 CLion Nova六、分享您的反馈意见总结 阿纳斯塔西娅-卡扎科娃 2023 年 11 月 9 日 前言 今天&#xff0c;我们宣布推出免费的 CLion 早期预览版&#xff0c;它使用 ReSh…

400G OSFP SR8光模块最新解决方案

数字化时代&#xff0c;意味着网络速度、能效和成本成为数据中心和通信网络关注的焦点。为了满足这些需求不断催生和进化新的产品&#xff0c;因此在这一背景下400G OSFP SR8光模块最新解决方案成为了很好的助力。该方案不仅提高了网络速度&#xff0c;还实现了节能降耗&#x…

ARM 基础学习记录 / ARM 裸机编程

汇编程序调用 C 程序详情 在 C 程序和 ARM 汇编程序之间相互调用时必须遵守 ATPCS 规则&#xff0c;其是基于 ARM 指令集和 THUMB 指令集过程调用的规范&#xff0c;规定了调用函数如何传递参数&#xff0c;被调用函数如何获取参数&#xff0c;以何种方式传递函数返回值。 寄存…

95. 费解的开关

题目 思路 因为最优解是每个灯只操作一次所以顺序无所谓只要确定了第一行后&#xff0c;下面都可以确定当前灯不亮就操作它下面的格子即可点亮它我觉得这种方法是唯一不会互相干扰的方法还是不太理解… 代码 #include <cstdio> #include <cmath> #include <c…

2023最新版本 从零基础入门C++与QT(学习笔记) -1- C++输入与输出

&#x1f38f;说在前面 &#x1f388;我预计是使用两个月的时间玩转C与QT &#x1f388;所以这是一篇学习笔记 &#x1f388;根据学习的效率可能提前完成学习,加油&#xff01;&#xff01;&#xff01; 输入(代码如下方代码块) &#x1f384;分析一下构成 &#x1f388;…

Rocksdb LSM Tree Compaction策略

RocksDB读写简介 直接画图说明。这张图取自Flink PMC大佬Stefan Richter在Flink Forward 2018演讲的PPT&#xff0c;笔者重画了一下。 RocksDB的写缓存&#xff08;即LSM树的最低一级&#xff09;名为memtable&#xff0c;对应HBase的MemStore&#xff1b;读缓存名为block cac…

CV计算机视觉每日开源代码Paper with code速览-2023.11.8

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构】&#xff08;WACV2024&#xff09;SBCFo…

Vue3-ref函数、reactive函数的响应式

Vue3-ref函数、reactive函数的响应式 在这之前&#xff0c;先讲Vue2的响应式处理 Vue2原本使用的是Object.defineProperty的响应式处理方式 methods方法中的this.name指的是vm.namereturn的name属性在通过this.name的间接调用时&#xff0c;通过了Object.defineProperty响应式…

火山引擎公共云·城市分享会:共享云经验,一起向未来

数智化时代的来临&#xff0c;不仅激发了行业对云计算的资源需求&#xff0c;也重构了云计算的技术架构及产品布局&#xff0c;给业务场景带来更多可能性&#xff0c;让云计算成为企业走向高效治理的一剂“良方”。随着业务的多样化、复杂化&#xff0c;企业应该如何借助云计算…

极兔面试:微服务爆炸,如何解决?Uber 是怎么解决2200个微服务爆炸的?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈你的DDD落地经验&#xff1f; 谈谈你对DDD的理解&#x…

【ubuntu 快速熟悉】

ubuntu 快速熟悉 2.ubuntu桌面管理器3.ubuntu常见文件夹说明4.ubuntu任务管理器4.1 gnome桌面的任务管理器4.2 实时监控GPU4.3 top 命令 5.ubuntu必备命令5.1 .deb文件5.2 查找命令5.2.1 find文件搜索5.2.2 which查找可执行文件的路径5.2.3 which的进阶&#xff0c;whereis5.2.…

Linux学习教程(第一章 简介)2

第一章 Linux简介 四、类UNIX系统是什么鬼? 《三、UNIX和Linux的区别》中讲到了 UNIX 系统的历史,UNIX 是操作系统的开山鼻祖,是操作系统的发源地,后来的 Windows 和 Linux 都参考了 UNIX。 有人说,这个世界上只有两种操作系统: UNIX 和类 UNIX 操作系统;其它操作系统…

解决:Git报错same change IDs

当使用git review的时候&#xff0c;review失败&#xff0c;报错multi commit …same change ids。。 错误&#xff1a; same Change-Id in multiple changes 意思是说&#xff0c;有多个commit记录的change ids是相同的&#xff0c;这change id概念出现在gerrit&#xff0…

数电发票接口服务商怎么选择?

自2023年11月1日起&#xff0c;除了港澳台、西藏外&#xff0c;全国范围内都开展了数电票开票试点&#xff0c;对于那些已经习惯使用传统税控开票接口的企业&#xff0c;如今在数电发票的试点下&#xff0c;原本的税控开票接口如同老去的侠客&#xff0c;曾经的荣光已经不再。在…

Zynq-Linux移植学习笔记之65- 国产ZYNQ在linux下usleep时间精度不准问题解决

1、背景介绍 采用复旦微的ZYNQ&#xff0c;跑linux操作系统&#xff0c;在应用程序中使用usleep进行延时时&#xff0c;发现存在10ms以下采用usleep试验都为10ms的情况 2、解决办法 使能设备树中的PS TTC设备&#xff0c;默认不是打开的 timere0024000 {compatible "s…

Android—幸运抽奖火箭发射倒计时(第六次作业)

Android—幸运抽奖&&点火发射&#xff08;第六次作业&#xff09; 创建项目 准备工作 修改按钮的颜色&#xff0c;如果不修改这行代码&#xff0c;那么后期给按钮添加background属性的时候&#xff0c;按钮并不会发生变化。 设置按钮的样式文件btn_press_blue.xml&am…