Containerd单机使用教程

在学习k8s 时1.28版本有提示,已经移除了docker的集成,自己之前没有接触过,有一点蒙,查问题时看到博主写的不错,就复制过来。(主要是怕博主删除了原帖)。

 

原作者:cci
链接:https://juejin.cn/post/7403564345550290979
来源:稀土掘金

为什么不用Docker?

k8s需要ContainerRuntime来运行节点中的容器,随着越来越多的容器出现(dockercontainerd...),在k8s 1.5版本后推出了CRI(ContainerRuntimeInterface,容器运行时接口)用于与容器交互,但只有遵循CRI规范的容器才能与其交互,如containerd,docekr虽然使用containerd作为后端,但docker本身不遵循CRI规范,所以需要加一个中间层dockershim(已被移除,现在使用cri-dockerd)来与docker交互,既然containerd遵循CRI规范为什么不直接使用containerd呢?

  • 如果你想要更方便的单机使用容器,docker仍然是最好的选择
  • 如果要用于k8s集群,containerd或者CRI-O或许是更好的选择

容器扫盲

  • Container Runtime Interface(CRI)k8s使用grpc协议通信的容器运行时接口,k8s可以与遵循CRI规范的容器运行时交互

  • Open Container Initiative (OCI):OCI 开放容器倡议,维护容器镜像格式规范、容器如何运行,只要运行时符合OCI倡议的规范,例如使用Dockerwin上可以跑的镜像,在Linuxcontainerd也能跑

    • 容器运行时规范: 定义了如何根据相应的配置构建容器运行时
    • 容器镜像规范: 定义了容器运行时使用的镜像的打包规范
  • runc(libcontainer):符合OCI规范的容器执行器,或叫低级容器运行时,使用一个符合OCI规范的容器即可通过runc运行,是大多数容器运行时的底层容器执行器(低级运行时)实现,只关注容器创建、运行和与操作系统的交互,runc使用Linux内核的cgroupsnamespace和其他特性来实现容器的隔离和资源管理

  • conatinerd高级容器运行时,守护进程,专注于容器生命周期管理(创建、管理、销毁容器),遵循OCI规范,提供了容器的生命周期管理、镜像管理、存储和网络等核心功能

    • cri-containerd(containerd 2.0会删除):在conatinerd:v1.0需要cri-containerd来与k8s的CRI接口交互,conatinerd:v1.1后通过CRI插件实现,只需要安装containerd即可
  • CRI-O高级容器运行时,遵循CRIOCI规范,专为k8s提供符合CRI规范API的容器运行时

  • Docker容器化平台,可以用来开发、运输、运行容器,运行容器实际上是使用Containerdrunc来运行的

    • dockershim:由于Docker不遵循CRI接口规范,k8sDocker交互需要加这个中间层,这个中间层遵循CRI规范
    • cri-dockerdockershim已经从kubelet中移除,dockershim的替代品
    • dockerd(Docker Daemon):守护进程,用于构建、运行、管理容器
    • Docker Hub:官方镜像仓库
    • docker cli:用于与容器、镜像交互的命令行工具
  • Podman(Pod Manager):直接调用runc接口来管理容器的命令行工具,遵循OCI规范,相当于docker cli+dockerd,大多数docker命令换成podman即可使用,如查看正在运行的容器:docker ps->podman ps

    • podman cli:命令行工具
    • conmon:负责监控,日志,TTY 分配,以及类似 out-of-memory 情况的杂事
  • rkt(rocket)高级容器运行时,遵循OCI规范,已停止活跃开发

    • rktlet:遵循OCI规范的容器执行器
  • CRI-O高级容器运行时,专为k8s设计的轻量级容器运行时,与containerd同级,遵循CRIOCI规范,底层使用runc

系统环境(Linux)

Debian12

安装Containerd

 

代码解读

复制代码

ctr version

离线安装 containerd

1、从 github.com/containerd/… 下载最新版containerd(右键复制链接)

#下载
wget https://github.com/containerd/containerd/releases/download/v1.7.20/containerd-1.7.20-linux-amd64.tar.gz
#解压
tar Cxzvf /usr/local containerd-1.7.20-linux-amd64.tar.gz
#清理
rm containerd-1.7.20-linux-amd64.tar.gz

作者:cci
链接:https://juejin.cn/post/7403564345550290979
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

新建目录mkdir -p /usr/local/lib/systemd/system

新增加配置文件vim /usr/local/lib/systemd/system/containerd.service

# Copyright The containerd Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd

Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target

作者:cci
链接:https://juejin.cn/post/7403564345550290979
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

systemctl daemon-reload systemctl enable --now containerd

2、安装 runc 从github.com/opencontain…下载最新版runc(右键复制链接)

#下载
wget https://github.com/opencontainers/runc/releases/download/v1.1.13/runc.amd64
#安装
install -m 755 runc.amd64 /usr/local/sbin/runc
#清理
rm runc.amd64
#检查
runc -v

3、安装 CNI 插件 从 github.com/containerne… 下载最新版CNI(右键复制链接)

#下载
wget https://github.com/containernetworking/plugins/releases/download/v1.5.1/cni-plugins-linux-amd64-v1.5.1.tgz
#新建目录
mkdir -p /opt/cni/bin
#解压
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.5.1.tgz
#清理
rm cni-plugins-linux-amd64-v1.5.1.tgz

检查
ctr version 

自定义conatinerd

配置详情github.com/containerd/…

生成默认配置

containerd config default > /etc/containerd/config.toml

containerd使用

  • 单机运行的conatinerd使用内置的ctr来执行命令
  • k8s中的containerd使用k8s的命令行工具crictl来执行命令
  • 只要是符合OCI规范的镜像就可以使用,比如docker的镜像就可以直接使用

如查看本地镜像单机中使用ctr images ls,在k8s中使用crictl images ls(ctr大多数命令crictl都不支持)

镜像命令

DockerContainerd解释
docker pull docker.io/library/nginx:latestctr i pull docker.io/library/nginx:latest下载镜像(一定要指定主机)
docker imagesctr i lsorctr image list查看本地镜像
docker run --name mysql -v /opt/soft/mysql/log:/var/log/mysql mysql:5.7ctr i mount docker.io/library/nginx:latest /mnt挂载镜像
``umount /mnt解挂
docker save -o nginx.tar.gz nginx:latestctr i export nginx.tar.gz docker.io/library/nginx:latest导出镜像
docker load -i nginx.tar.gzctr i import nginx.tar.gz导入镜像
docker rmi docker.io/library/nginx:latestctr i rm docker.io/library/nginx:latest删除镜像
docker tag docker.io/library/nginx:latest nginx:latestctr i tag docker.io/library/nginx:latest nginx:latest修改镜像tag

容器命令

DockerContainerd解释
docker ps -actr conatiner lsorctr c ls查看静态容器列表
docker start mynginxctr task lsorctr t ls查看正在运行的容器
docker run nginxctr c create docker.io/library/nginx:latest nginx创建容器(静态容器,需要提前pull下载)
docker rmi nginxctr c rm nginx删除静态容器
docker start nginxctr t start -d nginx启动静态容器为动态容器
docker stop mynginxctr t kill nginx停止容器
docker pause mynginxctr t pause nginx暂停容器
docker unpause mynginxctr t resume nginx恢复容器
docker rm mynginxctr t rm nginx删除容器进程
docker rm mynginxctr c rm nginx删除容器(先停再删)
docker psctr t ps nginx查看容器所有进程
docker exec -it mynginx /bin/shctr t exec --exec-id 1 nginx /bin/sh进入容器
docker inspect mynginxctr c info nginx查看容器详细信息
docker run ctr run 创建并启动容器(动态容器)

快照命令

Containerd解释
ctr snapshot ls查看容器快照
ctr snapshot create <container_id> <snapshot_name>创建容器快照
ctr snapshot rm <snapshot_name>删除指定快照
ctr snapshot restore <snapshot_name> <new_container_id>恢复容器快照

命名空间命令

Containerd解释
ctr namespace create k8sorctr ns create k8s创建命名空间
ctr ns default i ls查看默认命名空间的镜像
ctr ns rm k8s删除命名空间
ctr ns label k8s env=production为命名空间添加标签

标签:

后端Docker

### 配置 Containerd 使用 Harbor 私有仓库 为了使 Kubernetes 中的 containerd 能够访问并拉取来自 Harbor 的私有镜像,需完成如下配置: #### 修改 `/etc/containerd/config.toml` 文件 确保 `config.toml` 文件中包含必要的认证信息和镜像端点设置。对于 Harbor 服务器,默认情况下会启用 HTTPS;如果使用的是自签名证书,则还需要指定 CA 证书路径。 ```toml [plugins."io.containerd.grpc.v1.cri".registry.mirrors."my.harbor.registry"] endpoint = ["https://192.168.209.182"] [plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.209.182".tls] ca_file = "/path/to/ca.crt" [plugins."io.containerd.grpc.v1.cri".registry.auth] auths = [ { server = "https://192.168.209.182" username = "your_username" password = "your_password" } ] ``` 上述配置指定了 Harbor 服务地址、TLS 加密所需的 CA 文件位置以及用于身份验证的用户名密码[^1]。 #### 创建或更新 Kubelet 配置文件中的 ImagePullSecrets 为了让 Pod 可以成功从私有库拉取镜像,在部署应用之前还需定义 Secret 对象来保存 Docker 凭证,并将其关联到命名空间下的 ServiceAccount 或者直接在 Pod 定义里声明 imagePullSecret 字段。 ```yaml apiVersion: v1 kind: Secret metadata: name: my-harbor-secret type: kubernetes.io/dockerconfigjson data: .dockerconfigjson: <base64-encoded-auth-string> --- apiVersion: apps/v1 kind: Deployment spec: template: spec: containers: - name: nginx-container image: 192.168.209.182/nginx/mynginx:v1.0 imagePullSecrets: - name: my-harbor-secret ``` 此 YAML 片段展示了如何创建一个名为 `my-harbor-secret` 的 secret 来存储经过 base64 编码后的 `.dockerconfigjson` 数据,并通过 `imagePullSecrets` 将其应用于 pod 规范中[^2]。 重启 containerd 后即可生效新配置: ```bash systemctl restart containerd ``` 随后可以尝试拉取测试镜像确认连接正常工作: ```bash crictl pull 192.168.209.182/nginx/mynginx:v1.0 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值