一文学会Containerd配置和镜像加速

news2024/11/14 15:33:50

一文学会Containerd配置和镜像加速

❤️ 摘要: 本文介绍了 Containerd 的基本概念及其在 Kubernetes 中的作用,并详细说明了如何通过配置代理、使用国内镜像源或手动下载等方式加速镜像拉取。此外,还提供了针对不同场景的具体配置方法,包括通过环境变量、config.toml 文件和 hosts.toml 文件实现镜像加速的具体步骤。这些方法有助于提高容器镜像的拉取效率。通过这些详细的步骤和示例,读者可以更好地理解和掌握Containerd的使用方法。

目录

  • 1 概念
    • 1.1 什么是Containerd
      • 1.1.1 Containerd如何为Kubernetes服务?
      • 1.1.2 创建单容器 pod 的工作原理
    • 1.2 Containerd的镜像加速方式
      • 1.2.1 镜像代理或镜像同步
      • 1.2.2 使用国内的镜像源
      • 1.2.3 手动下载并上传到私有镜像仓库
      • 1.2.4 三种方式对比
  • 2 Containerd配置镜像加速
    • 2.1 未设置镜像加速
    • 2.2 Containerd代理实现镜像加速
      • 2.2.1 配置 Containerd 的环境变量
      • 2.2.2 测试拉取镜像
    • 2.3 Containerd的config.toml实现镜像加速
    • 2.4 Containerd的hosts.toml实现镜像加速
      • 2.4.1 主机配置方式对比config.toml配置方式的区别
      • 2.4.2 通过主机配置方式配置
      • 2.4.3 为所有注册表设置默认镜像
      • 2.4.4 hosts.toml 内容详细说明
        • 2.4.4.1 公共仓库案例
        • 2.4.4.2 私有仓库案例
  • 3 参考资料

1 概念

在这里插入图片描述

1.1 什么是Containerd

前文《一文掌握Containerd配置Harbor私有仓库》已经简单介绍过Containerd以及其配置说明。

Kubernetes 1.20 版本开始,Containerd 被设置为默认的容器运行时接口(CRI)。Kubernetes 官方在此版本中逐步淘汰了 Docker 作为默认 CRI,转而推荐使用 Containerd 来处理容器管理任务。所以如果您正在使用Kubernetes,那么了解并掌握Containerd是必要的。

1.1.1 Containerd如何为Kubernetes服务?

Containerd 通常与Kubelet运行在同一节点上,而Containerd内置了一个cri插件,通过cri插件处理来自 Kubelet 的所有 CRI 服务请求,并使用 containerd 来管理完整的容器生命周期和容器镜像。

下图是Kubelet与Containerd的关系图:

在这里插入图片描述

1.1.2 创建单容器 pod 的工作原理

❔ 说明: 以创建单容器pod的例子解释kublet、Containerd的工作原理

  1. Kubelet 通过 CRI 运行时服务 API 调用cri插件来创建 pod;
  2. cri使用 CNI 创建并配置 pod 的网络命名空间;
  3. cri使用containerd内部创建并启动一个特殊的暂停容器(Pause)(沙箱容器),并将该容器放入pod的cgroup和命名空间中(为简洁起见,省略了步骤);
  4. 随后Kubelet 通过 CRI 镜像服务 API 调用cri插件来拉取应用程序容器镜像;
  5. 如果节点上不存在镜像, cri会进一步使用 containerd 来拉取镜像;
  6. 然后,Kubelet 通过 CRI 运行时服务 API 调用cri ,使用拉取的容器镜像在 pod 内创建并启动应用程序容器;
  7. 最终cri插件使用containerd内部创建应用程序容器,将其放入pod的cgroup和命名空间中,然后启动pod的应用程序容器。经过这些步骤,一个 pod 及其对应的应用程序容器就被创建并运行了。
Kubelet CRI Plugin Containerd Pod CNI ①调用 CRI 运行时服务 API 创建 Pod ②使用 CNI 创建并配置网络命名空间 ③创建并启动 Pause 容器 ④将 Pause 容器放入 Pod 的 cgroup 和命名空间 ⑤调用 CRI 镜像服务 API 拉取应用程序镜像 ⑥检查镜像是否存在 ⑦镜像不存在,拉取镜像 ⑧镜像拉取完成 ⑨调用 CRI 运行时服务 API 创建并启动应用程序容器 ⑩使用镜像创建应用程序容器 ⑪将应用程序容器放入 Pod 的 cgroup 和命名空间 ⑫启动应用程序容器 Pod 及应用程序容器运行 Kubelet CRI Plugin Containerd Pod CNI

1.2 Containerd的镜像加速方式

❔ 说明:国内用户在拉取镜像时,往往会遇到过镜像拉取超时或者速度极慢的问题,那是因为 dockerContainerd 默认都是指向国外的镜像源(没有科学上网无法直接访问), 如docker.io, gcr.io,ghcr.io,k8s.gcr.io,quay.io。

目前实现镜像加速的方式有三种。

  1. 镜像代理或镜像同步
  2. 使用国内的镜像源
  3. 手动下载并上传到私有镜像仓库

在这里插入图片描述


1.2.1 镜像代理或镜像同步

  • 镜像代理:通过代理服务器加速镜像拉取,代理会将请求转发到目标镜像仓库,并在本地缓存镜像。常见的方案有 Docker 官方提供的镜像加速器或配置私有代理。
  • 镜像同步:使用代理服务器下载外部公共镜像再同步到本地镜像仓库,减少跨国下载的延迟,并确保镜像的稳定性和安全性。

1.2.2 使用国内的镜像源

使用国内的镜像源,如阿里云、网易云、华为云等提供的公共镜像加速服务,这些服务在国内多个地区都部署镜像官方仓库,大大减少网络传输延迟。

1.2.3 手动下载并上传到私有镜像仓库

手动从公共镜像仓库打包下载镜像,然后上传到本地或私有镜像仓库,确保本地有需要的镜像。

1.2.4 三种方式对比

方式优点缺点适用场景
镜像代理或镜像同步速度提升:通过代理或同步,镜像从本地网络获取,避免跨国网络带来的延迟问题。
高可用性:同步镜像可以确保即使外部仓库不可用,本地镜像仍可使用,增强容错性。
自动化:镜像同步可通过自动任务(如 Harbor 的同步功能)定期更新,无需人工干预。
复杂度:设置代理或镜像同步可能需要额外的网络配置或额外的基础设施(如网络代理,私有镜像仓库)。
开销成本:部署代理服务需要额外的带宽费用,本地存储的镜像占用较多的磁盘空间。
○ 大规模集群或企业内部环境,希望加速镜像拉取并提高可用性。
○ 需要对镜像进行统一管理、保证安全性。
使用国内的镜像源简单快捷:直接通过配置国内镜像源即可加速,无需复杂的网络设置。
成本低:大多数国内镜像源是免费的。
镜像同步及时:国内镜像源通常会快速同步官方仓库的镜像,更新速度较快。
依赖第三方服务:依赖国内的镜像源,无法保证服务的稳定性和长期可用性。
受限于公共镜像源的内容:如果某些镜像源未同步特定镜像,可能需要额外的处理步骤。
○ 小规模或个人用户,需要快速加速镜像拉取且不愿意搭建自有基础设施。
○ 对镜像源的稳定性和可用性要求较低的场景。
手动下载并上传到私有镜像仓库完全自主:不依赖外部服务,镜像管理自主可控。
安全性:镜像经过本地或私有仓库管理,确保镜像来源安全可控,适合企业的安全策略要求。
手动维护:需要手动下载和上传镜像,耗时耗力,尤其在更新频繁时难以管理。
复杂性高:需要私有镜像仓库和相关基础设施的支持,增加运维复杂度。
存储成本:所有镜像都需要存储在私有仓库中,带来较大的存储和管理负担。
○ 需要严格管理镜像安全和来源的企业环境。
○ 需要确保离线环境中使用的镜像始终可用的场景。
○ 容器需求较小的场景,如学习或测试。

2 Containerd配置镜像加速

❔ 说明:本环境是Containerd版本: v1.6.4(systemd部署); Kubernetes版本:V1.29.7(二进制部署)

2.1 未设置镜像加速

[root@k8s-master1 containerd.service.d]# time crictl pull gcr.io/google-containers/busybox:latest
E0911 19:34:59.050185   19189 remote_image.go:238] "PullImage from image service failed" err="rpc error: code = Unknown desc = failed to pull and unpack image \"gcr.io/google-containers/busybox:latest\": failed to resolve reference \"gcr.io/google-containers/busybox:latest\": failed to do request: Head \"https://gcr.io/v2/google-containers/busybox/manifests/latest\": dial tcp 108.177.97.82:443: i/o timeout" image="gcr.io/google-containers/busybox:latest"
FATA[0030] pulling image: rpc error: code = Unknown desc = failed to pull and unpack image "gcr.io/google-containers/busybox:latest": failed to resolve reference "gcr.io/google-containers/busybox:latest": failed to do request: Head "https://gcr.io/v2/google-containers/busybox/manifests/latest": dial tcp 108.177.97.82:443: i/o timeout

  • 这里拉取gcr.io的镜像肯定会超时。

2.2 Containerd代理实现镜像加速

关于Linux系统代理,可以通过两种方法实现。

方法一: 如果你希望系统中所有应用都使用代理,可以直接在系统的环境变量中配置实现全局代理。(自行百度,这里不展开说明。)

方法二: 针对Containerd服务配置代理,进而实现镜像加速。

2.2.1 配置 Containerd 的环境变量

❔说明: 你需要提前部署代理服务器,并在Containerd服务器配置代理服务。(代理部署方法自行百度,这里不展开说明。)

查看Containerd的服务文件位置

[root@k8s-master1 ~]# systemctl cat containerd
# /usr/local/lib/systemd/system/containerd.service

编辑 /etc/systemd/system/containerd.service.d/http-proxy.conf 文件(如果文件不存在,则创建它):

# 添加containerd.service链接
cd /etc/systemd/system/
ln -s /usr/local/lib/systemd/system/containerd.service  containerd.service 
# 创建containerd.service的代理配置
mkdir -p /etc/systemd/system/containerd.service.d
vim /etc/systemd/system/containerd.service.d/http-proxy.conf

添加以下内容(根据你的代理信息进行修改):

[Service]
Environment="HTTP_PROXY=http://your-proxy-server:port"
Environment="HTTPS_PROXY=http://your-proxy-server:port"
Environment="NO_PROXY=localhost,127.0.0.1,::1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12,,.svc,.cluster.local"

❔ 参数说明:

  • HTTP_PROXY:设置 HTTP 请求的代理。
  • HTTPS_PROXY:设置 HTTPS 请求的代理。
  • NO_PROXY:设置不走代理的网段

⚠️ 在生产环境谨慎配置系统代理,否则可能会导致网络不通影响正常业务,建议 NO_PROXY 配置包括但不限以下网段:

  1. 本地地址和网段:localhost127.0.0.1127.0.0.0/8
  2. Kubernetes 的默认域名后缀:.svc.cluster.local
  3. Kubernetes Node 的网段甚至所有应该不用 proxy 访问的 node 网段:<nodeCIDR>
  4. APIServer 的内部 URL: <APIServerInternalURL>
  5. Service Network: <serviceNetworkCIDRs>
  6. (如有)etcd 的 Discovery Domain: <etcdDiscoveryDomain>
  7. Cluster Network: <clusterNetworkCIDRs>
  8. 其他特定平台相关网段(如 DevOps, Git/制品仓库): <platformSpecific>
  9. 常用内网网段:
    1. 10.0.0.0/8
    2. 172.16.0.0/12
    3. 192.168.0.0/16

将代理配置为 Containerd 的服务环境变量后,重新加载并重启 Containerd 服务:

systemctl daemon-reload
systemctl restart containerd

2.2.2 测试拉取镜像

尝试拉取镜像

[root@k8s-master1 system]# time crictl pull gcr.io/google-containers/busybox:latest
Image is up to date for sha256:36a4dca0fe6fb2a5133dc11a6c8907a97aea122613fa3e98be033959a0821a1f

real    0m2.694s
user    0m0.011s
sys     0m0.007s


  • 发现拉取成功, 而且速度还不错。

2.3 Containerd的config.toml实现镜像加速

如果没有/etc/containerd/config.toml,执行以下命令生成默认配置

sudo containerd config default | sudo tee /etc/containerd/config.toml

编辑Containerd的配置文件,添加以下镜像配置

   # 找到mirrors配置处
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
            endpoint = ["https://docker.io","https://6qxc6b6n.mirror.aliyuncs.com","https://docker.m.daocloud.io","https://dockerproxy.com/"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
            endpoint = ["https://gcr.m.daocloud.io","https://gcr.nju.edu.cn","https://gcr.dockerproxy.com"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
            endpoint = ["https://k8s-gcr.m.daocloud.io","https://gcr.nju.edu.cn/google-containers/","https://k8s.dockerproxy.com/"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"]
            endpoint = ["https://quay.m.daocloud.io","https://quay.nju.edu.cn"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
            endpoint = ["https://k8s.m.daocloud.io","https://k8s.nju.edu.cn"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.elastic.co"]
            endpoint = ["https://elastic.m.daocloud.io"]  
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."ghcr.io"]
            endpoint = ["https://ghcr.m.daocloud.io","https://ghcr.nju.edu.cn"] 

重启Containerd服务

systemctl restart containerd

尝试在节点上通过Containerd直接拉取镜像,验证是否成功:

[root@k8s-master1 containerd.service.d]# time crictl pull gcr.io/google-containers/busybox:latest
Image is up to date for sha256:36a4dca0fe6fb2a5133dc11a6c8907a97aea122613fa3e98be033959a0821a1f

real    0m5.123s
user    0m0.013s
sys     0m0.058s

  • 成功拉取镜像,速度也可以。

2.4 Containerd的hosts.toml实现镜像加速

❔ 说明:Containerd v1.5 版本以后新增了新的镜像仓库配置方式—主机配置(hosts.toml),同时支持ctr(containerd 工具)、containerd 镜像服务客户端和 CRI 客户端(例如kubectlcrictl )等客户端。

2.4.1 主机配置方式对比config.toml配置方式的区别

  • config.tomlContainerd 的核心配置文件,定义了 Containerd 的全局行为和设置。
  • hosts.toml是从config.toml全局配置中分离出来,专用于配置 Containerd 的镜像仓库相关信息。这个文件可以定义多个镜像仓库以及如何访问这些仓库,可以实现更细粒度管理。
  • hosts.toml最大于config.toml的优势是配置不需要重启即可生效,避免了修改配置出错导致Containerd无法起来和减小修改全局配置的风险。

2.4.2 通过主机配置方式配置

为Containerd配置注册表将通过在配置目录中为每个所需的注册表主机指定(可选) hosts.toml文件来完成。注意:此目录下的更新不需要重新启动containerd守护进程。

配置全局配置文件/etc/containerd/config.toml,指定主机配置主目录,配置如下:

version = 2

[plugins."io.containerd.grpc.v1.cri".registry]
   config_path = "/etc/containerd/certs.d"

⚠️ 注意:同时将之前config.toml关于容器仓库的配置都要注释掉, 否则会冲突。

    [plugins."io.containerd.grpc.v1.cri".registry]
      config_path = "/etc/containerd/certs.d"
      
      [plugins."io.containerd.grpc.v1.cri".registry.auths]

      [plugins."io.containerd.grpc.v1.cri".registry.configs]
      #  [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.zx".auth]
      #    username = "admin"
      #    password = "admin12345"
      #
      #  [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.zx".tls]
      #    insecure_skip_verify = false
      #    ca_file = "/etc/containerd/certs.d/harbor.zx/ca.crt"
      #    cert_file = "/etc/containerd/certs.d/harbor.zx/client.cert"
      #    key_file = "/etc/containerd/certs.d/harbor.zx/client.key"

      [plugins."io.containerd.grpc.v1.cri".registry.headers]

      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        #[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
        #    endpoint = ["https://6qxc6b6n.mirror.aliyuncs.com","https://docker.m.daocloud.io","https://dockerproxy.com/"]
        #[plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
        #    endpoint = ["https://gcr.m.daocloud.io","https://gcr.nju.edu.cn","https://gcr.dockerproxy.com"]
        #[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
        #    endpoint = ["https://k8s-gcr.m.daocloud.io","https://gcr.nju.edu.cn/google-containers/","https://k8s.dockerproxy.com/"]
        #[plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"]
        #    endpoint = ["https://quay.m.daocloud.io","https://quay.nju.edu.cn"]
        #[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
        #    endpoint = ["https://k8s.m.daocloud.io","https://k8s.nju.edu.cn"]
        #[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.elastic.co"]
        #    endpoint = ["https://elastic.m.daocloud.io"]
        #[plugins."io.containerd.grpc.v1.cri".registry.mirrors."ghcr.io"]
        #    endpoint = ["https://ghcr.m.daocloud.io","https://ghcr.nju.edu.cn"]
        #[plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.zx"]
        #    endpoint = ["https://harbor.zx"]

重启Containerd服务

systemctl restart containerd

docker.io 的示例,其主机目录结构以下:

# 创建命名空间
mkdir -p /etc/containerd/certs.d/docker.io

# 创建主机配置
touch /etc/containerd/certs.d/docker.io/hosts.toml

# 目录结构
$ tree /etc/containerd/certs.d
/etc/containerd/certs.d
└── docker.io                 #  命名空间名称与镜像仓库域名一致
    └── hosts.toml         #  该镜像仓库的配置文件
 

❔ 目录结构说明:

  • 主机配置主目录为/etc/containerd/certs.d
  • 官方文档提出了三个概念: 注册表主机(registry host)、注册表镜像(registry mirror)、注册表主机命名空间(registry host namespace )
    • 注册表主机, 例如,docker.io、quay.io和 ghcr.io, 即容器镜像的仓库,一般以http/https协议提供对对服务;
    • 注册表镜像是registry host 的缓存或加速代理,类似于CDN加速;
    • 注册表主机命名空间即是主机配置主目录下的子目录,如docker.io, 格式可以是[registry_host_name|IP address][:port]

2.4.3 为所有注册表设置默认镜像

如果没有其他命名空间匹配,则可以选择将_default注册表主机命名空间用作后备。

$ tree /etc/containerd/certs.d
/etc/containerd/certs.d
└── _default
    └── hosts.toml

$ cat /etc/containerd/certs.d/_default/hosts.toml
[host."https://registry.example.com"]
  capabilities = ["pull", "resolve"]

2.4.4 hosts.toml 内容详细说明

对于容器仓库config_path中的每个容器仓库命名空间目录,您可以包含一个hosts.toml配置文件。以下根级别 toml 字段适用于容器仓库命名空间:

⚠️ 注意hosts.toml文件中指定的所有路径可以是绝对路径,也可以是相对于hosts.toml文件的相对路径。

2.4.4.1 公共仓库案例

下面以docker.io作为配置案例:

编写hosts.toml

server = "https://docker.io"

[host."https://docker.m.daocloud.io"]
  capabilities = ["pull", "resolve"]
[host."https://dockerproxy.com/"]
  capabilities = ["pull", "resolve"]

❔ 参数说明:

字段说明可能值
server指定此注册表主机命名空间的默认服务器1) 如果仅配置server,没有配置host,则访问server地址;
2)如果配置一个或多个主机,则按顺序尝试访问所有host ,则server将用作后备;
3)如果没有server和host,则以命名空间来访问
host指定此注册表主机终端节点,可以有一个或多个主机。可以是域名或者是IP地址,类似于CNAME;
capabilities是一个可选设置,用于指定主机能够执行哪些操作。1)push是指向镜像仓库推送镜像;
2)pull是向镜像仓库拉取镜像;
3)resolve是将镜像(image:tag)翻译成唯一标识的 digest(哈希值)

测试拉取镜像

[root@k8s-master1 certs.d]# crictl pull docker.io/library/busybox
Image is up to date for sha256:87ff76f62d367950186bde563642e39208c0e2b4afc833b4b3b01b8fef60ae9e

2.4.4.2 私有仓库案例

以harbor私有仓库为例:

创建主机配置目录

mkdir -p /etc/containerd/certs.d/harbor.zx/

编辑hosts.toml文件

server = "https://harbor.zx"

[host."https://harbor.zx"]
  capabilities = ["pull", "resolve", "push"]
  skip_verify = true
  #
  ca = "/etc/containerd/certs.d/harbor.zx/ca.crt"
  #双向认证配置客户端证书
  #client = ["/etc/certs/client.cert", "/etc/certs/client.key"]

❔参数说明:

  • skip_verify:是否跳过对注册表的证书链和主机名的验证。这只能用于测试或与其他验证连接的方法结合使用。 (默认为false
  • ca:ca (证书颁发机构认证)可以设置为一个路径或一组路径,每个路径都指向一个 ca 文件,用于通过注册表命名空间进行身份验证。
  • client: client证书配置, 如果是双向认证需要配置客户端证书。

3 参考资料

[1] Containerd 如何配置 Proxy

[2]主流可用Docker镜像加速站列表汇总

[3]docker proxy官方文档

[4]Registry Configuration - Introduction

[5] Configure Image Registry

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

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

相关文章

解码 OpenAI 的 o1 系列大型语言模型

OpenAI 表示&#xff0c;其 Strawberry 项目已升级为新的大型语言模型 (LLM) 系列&#xff0c;公司将其命名为 OpenAI o1。 该公司表示&#xff0c;新系列模型还包括一个 o1-mini 版本&#xff0c;以提高成本效益&#xff0c;可根据其推理能力与最新的GPT-4o 模型进行区分。 …

Visual Studio(vs)下载安装C/C++运行环境配置和基本使用注意事项

基本安装 点击跳转到vs官网点击箭头所指的按钮进行下载双击运行刚才下载好的下载器点击继续勾选“使用C的桌面开发”和“Visual Studio扩展开发”点击“安装位置”&#xff0c;对vs的安装位置进行更改。你可以跟我一样只选择D盘或者其他你空闲的盘&#xff0c;然后将默认的路径…

AIGC文本生成

文本生成是一种人工智能技术&#xff0c;它基于深度学习算法&#xff0c;根据给定的提示信息创作出有逻辑、连贯的文本内容。 文本生成所需的输入&#xff08;提示或Prompt&#xff09;可以是简单的关键词、一句话概述或是更复杂的指令和上下文信息。文本生成模型通过分析大量…

AR技术在电商行业中有哪些应用场景?有何优势?

AR&#xff08;增强现实&#xff09;技术在电商行业中的应用场景广泛且多样&#xff0c;为消费者带来了全新的购物体验&#xff0c;同时也为商家提供了诸多优势。51建模网为电商行业AR技术应用提供解决方案&#xff0c;以下是AR技术在电商行业中的主要应用场景及其优势&#xf…

数据结构:时间复杂度与空间复杂度

目录 算法效率时间复杂度大O渐进表示法时间复杂度计算案例 空间复杂度空间复杂度案例 复杂度算法题 算法效率 算法在编写成可执行程序后&#xff0c;运⾏时需要耗费时间资源和空间(内存)资源 。因此衡量⼀个算法的好坏&#xff0c;⼀般是从时间和空间两个维度来衡量的&#xf…

通过sshd_config限制用户登录

在CentOS Stream或其他现代的Linux发行版中&#xff0c;你可能会发现传统的hosts.deny和 hosts.allow文件已经不存在或不被使用。这是因为随着时间的推移&#xff0c;系统的安全策略和网络管理工具已经发生了演变&#xff0c;许多系统管理员和发行版维护者选择使用更现代、更灵…

12. DataLoader的基本使用

DataLoader的基本使用 1. 为什么要使用DataLoader DataLoader对创建好的DataSet的样本取样进行了集成操作&#xff0c;非常方便对于后续网络训练、测试的数据集的选择和使用 DataLoader可以集成了数据批量加载的方法&#xff0c;可以使用 batch_size 设置批量大小&#xff0c…

深入理解 Redis 的文件事件处理器

概述 Redis 的文件事件处理器是基于 Reactor 模式实现的&#xff0c;内部采用 IO 多路复用程序来同时监听多个套接字&#xff0c;当被监听的套接字准备好执行连接应答&#xff08;accept&#xff09;、读取&#xff08;read&#xff09;、写入&#xff08;write&#xff09;、…

计算机毕业设计 高校大学生竞赛项目管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

获取Live2d模型

文章目录 1、 Live2D官方示例数据集&#xff08;可免费下载&#xff09;2、模之屋3、unity商店4、直接b站搜索5、youtube6、BOOTH完结 1、 Live2D官方示例数据集&#xff08;可免费下载&#xff09; 官方提供了一些 Live2D实例模型给大家下载使用 地址&#xff1a;https://ww…

2024年【山东省安全员B证】报名考试及山东省安全员B证最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员B证报名考试是安全生产模拟考试一点通生成的&#xff0c;山东省安全员B证证模拟考试题库是根据山东省安全员B证最新版教材汇编出山东省安全员B证仿真模拟考试。2024年【山东省安全员B证】报名考试及山东省…

通用接口开放平台设计与实现——(31)API服务线程安全问题确认与修复

背景 在本系列的前面一篇博客评论中&#xff0c;有小伙伴指出&#xff0c;API服务存在线程安全问题&#xff1a; https://blog.csdn.net/seawaving/article/details/122905199#comments_34477405 今天来确认下&#xff0c;线程是否安全&#xff1f;如不安全&#xff0c;如何…

在k8s中,客户端访问服务的链路流程,ingress--->service--->deployment--->pod--->container

ingress是一个API资源。 其核心作用是nginx网页服务器。 当客户端访问服务器不同的url时, 用不同的location提供服务。 在k8s之外&#xff0c;nginx的配置一般如下&#xff1a; http {server {listen 80;server_name localhost;location / {root html; …

文件的应用实例

目录 1、拷贝文件 2、遍历文件夹 1、拷贝文件 说明&#xff1a;将一张图片/一首歌拷贝到另外一个目录下&#xff0c;要求使用read()和write()原生方法完成 """思路分析&#xff1a;1、打开源文件(需要拷贝的文件)&#xff0c;读取源文件的数据2、打开目标文…

网络安全学习(四)渗透工具msf

本文简要介绍metasploit framework&#xff0c;是一款渗透工具。官网地址&#xff1a;Metasploit | Penetration Testing Software, Pen Testing Security | Metasploit msf是一个框架&#xff0c;可以加载各种模块&#xff0c;这是它的最强大之处。 kali中有此工具。 点击即…

python中的各类比较与计算

运算符 1.算数运算符2.关系运算符3.逻辑运算符4.关于短路求值5.赋值运算符1&#xff09;的使用链式赋值多元赋值 2)复合赋值运算符 6.位运算符7.成员运算符8.身份运算符 1.算数运算符 # 加 print(1 2) # 减 print(2 - 1) # 乘 print(1 * 2) # 余数 4%31余数为1 print(4 % 3…

C++第五十一弹---IO流实战:高效文件读写与格式化输出

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1. C语言的输入与输出 2. 流是什么 3. CIO流 3.1 C标准IO流 3.2 C文件IO流 3.2.1 以写方式打开文件 3.2.1 以读方式打开文件 4 stringstre…

【测试方案】软件测试管理规程(doc源文件)

软件测试规程的作用在于确保软件测试活动的系统性、规范性和一致性。它明确了测试的目标、范围、方法、流程以及所需资源&#xff0c;为测试人员提供了明确的指导和操作规范。通过遵循测试规程&#xff0c;可以提高测试效率&#xff0c;减少测试遗漏和错误&#xff0c;保证软件…

NC 表达式求值

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 请写一个整数…

MySQL8.0.13-函数索引

目录 什么是函数索引 语法 函数索引测试 创建表结构 插入数据 创建普通索引 查看执行计划 创建函数索引 查看执行计划 查看索引信息 函数索引效率 普通索引 函数索引 分析 注意事项 老版本如何实现函数索引 什么是函数索引 本篇主要介绍 MySQL 的函数索引&…