Kubernetes
一、基础知识
1. 概念和术语
2. Kubernetes特性
3. 集群组件
4. 抽象对象
5. 镜像加速下载
二、安装部署kubeadm
1. 基础环境准备
2. 安装runtime容器(Docker)
3. 安装runtime容器(Contained)
4. Containerd进阶使用
5. 部署kubernets集群
6. 部署calico网络组件
7. 部署NFS文件存储
8. 部署ingress-nginx代理
9. 部署helm包管理工具
10. 部署traefik代理
11. 部署dashboard管理面板(官方)
12. 部署kubesphere管理面板(推荐)
12. 部署metrics监控组件
13. 部署Prometheus监控
14. 部署elk日志收集
15. 部署Harbor私有镜像仓库
16. 部署minIO对象存储
17. 部署jenkins持续集成工具
三、kubectl命令
1. 命令格式
2.node操作常用命令
3. pod常用命令
4.控制器常用命令
5.service常用命令
6.存储常用命令
7.日常命令总结
8. kubectl常用命令
四、资源对象
1. K8S中的资源对象
2. yuml文件
3. Kuberbetes YAML 字段大全
4. 管理Namespace资源
5. 标签与标签选择器
6. Pod资源对象
7. Pod生命周期与探针
8. 资源需求与限制
9. Pod服务质量(优先级)
五、资源控制器
1. Pod控制器
2. ReplicaSet控制器
3. Deployment控制器
4. DaemonSet控制器
5. Job控制器
6. CronJob控制器
7. StatefulSet控制器
8. PDB中断预算
六、Service和Ingress
1. Service资源介绍
2. 服务发现
3. Service(ClusterIP)
4. Service(NodePort)
5. Service(LoadBalancer)
6. Service(ExternalName)
7. 自定义Endpoints
8. HeadlessService
9. Ingress资源
10. nginx-Ingress案例
七、Traefik
1. 知识点梳理
2. 简介
3. 部署与配置
4. 路由(IngressRoute)
5. 中间件(Middleware)
6. 服务(TraefikService)
7. 插件
8. traefikhub
9. 配置发现(Consul)
10. 配置发现(Etcd)
八、存储
1. 配置集合ConfigMap
6. downwardAPI存储卷
3. 临时存储emptyDir
2. 敏感信息Secret
5. 持久存储卷
4. 节点存储hostPath
7. 本地持久化存储localpv
九、rook
1. rook简介
2. ceph
3. rook部署
4. rbd块存储服务
5. cephfs共享文件存储
6. RGW对象存储服务
7. 维护rook存储
十、网络
1. 网络概述
2. 网络类型
3. flannel网络插件
4. 网络策略
5. 网络与策略实例
十一、安全
1. 安全上下文
2. 访问控制
3. 认证
4. 鉴权
5. 准入控制
6. 示例
十二、pod调度
1. 调度器概述
2. label标签调度
3. node亲和调度
4. pod亲和调度
5. 污点和容忍度
6. 固定节点调度
十三、系统扩展
1. 自定义资源类型(CRD)
2. 自定义控制器
十四、资源指标与HPA
1. 资源监控及资源指标
2. 监控组件安装
3. 资源指标及其应用
4. 自动弹性缩放
十五、helm
1. helm基础
2. helm安装
3. helm常用命令
4. HelmCharts
5. 自定义Charts
6. helm导出yaml文件
十六、k8s高可用部署
1. kubeadm高可用部署
2. 离线二进制部署k8s
3. 其他高可用部署方式
十七、日常维护
1. 修改节点pod个数上限
2. 集群证书过期更换
3. 更改证书有效期
4. k8s版本升级
5. 添加work节点
6. master节点启用pod调度
7. 集群以外节点控制k8s集群
8. 删除本地集群
9. 日常错误排查
10. 节点维护状态
11. kustomize多环境管理
12. ETCD节点故障修复
13. 集群hosts记录
14. 利用Velero对K8S集群备份还原与迁移
15. 解决K8s Namespace无法正常删除的问题
16. 删除含指定名称的所有资源
十八、k8s考题
1. 准备工作
2. 故障排除
3. 工作负载和调度
4. 服务和网络
5. 存储
6. 集群架构、安装和配置
本文档使用 MrDoc 发布
-
+
home page
4. Containerd进阶使用
`ctr`、`crictl` 和 `nerdctl` 是三种不同的容器管理工具,它们有各自的特点和用途。下面是它们的比较和推荐: ### 相同点 1. **容器管理**:这三个工具都是用于管理容器的命令行工具。 2. **功能**:它们都支持基本的容器操作,如创建、启动、停止、删除容器等。 3. **OCI**:它们都遵循开放容器倡议(OCI)的标准。 ### 不同点 | 特性 | `ctr` | `crictl` | `nerdctl` | |------------------|------------------------------------------|--------------------------------------------|------------------------------------------------| | **开发者** | containerd 项目 | Kubernetes CRI 社区 | containerd 项目 | | **用途** | 主要用于直接与 containerd 交互 | 主要用于与 CRI 容器运行时接口(如 containerd)交互 | 设计用于替代 Docker CLI | | **集成度** | 深度集成 containerd | 深度集成 Kubernetes | 提供与 Docker CLI 相似的体验 | | **目标用户** | 主要面向开发者和高级用户 | 主要面向 Kubernetes 管理员 | 主要面向开发者和 Docker 用户 | | **命令结构** | 结构简单但功能强大 | 专注于 CRI 操作 | 与 Docker CLI 类似,命令结构熟悉 | | **复杂度** | 复杂度较高,需要理解 containerd 的内部 | 复杂度适中,需要理解 CRI | 复杂度较低,适合有 Docker 经验的用户 | | **常用场景** | 调试和管理 containerd | 管理 Kubernetes 集群中的容器 | 替代 Docker,用于本地开发和测试 | | **文档支持** | 官方文档和社区支持 | 官方文档和社区支持 | 官方文档和社区支持 | ### 推荐 - **如果你是开发者或高级用户**,需要深度管理和调试 containerd,可以使用 `ctr`。 - **如果你是 Kubernetes 管理员**,需要管理 Kubernetes 集群中的容器,可以使用 `crictl`,因为它与 Kubernetes 的 CRI 集成得很好。 - **如果你有 Docker 使用经验**,希望寻找一个 Docker CLI 的替代品用于本地开发和测试,可以使用 `nerdctl`,因为它的命令结构与 Docker CLI 类似,学习成本较低。 每个工具都有其独特的优势和适用场景,选择哪个工具取决于你的具体需求和使用场景。 # 一、ctr命令使用 ## 1. 命名空间 1.1 查看命名空间 Containerd 中也支持命名空间的概念,比如查看命名空间: ``` [root@work3 ~]# ctr ns ls NAME LABELS default k8s.io moby ``` 1.2 创建命名空间 如果不指定,ctr 默认使用的是 default 空间。同样也可以使用 ns create 命令创建一个命名空间: ``` [root@work3 ~]# ctr ns create test [root@work3 ~]# ctr ns ls NAME LABELS default k8s.io moby test ``` 1.3 删除命名空间 使用 remove 或者 rm 可以删除 namespace: ``` [root@work3 ~]# ctr ns rm test test [root@work3 ~]# ctr ns ls NAME LABELS default k8s.io moby ``` 1.4 指定命名空间 有了命名空间后就可以在操作资源的时候指定 namespace,比如查看 test 命名空间的镜像,可以在操作命令后面加上 -n test 选项: ``` [root@work3 ~]# ctr -n test image ls REF TYPE DIGEST SIZE PLATFORMS LABELS ``` Docker 也是默认调用 containerd,事实上 Docker 使用的 containerd 下面的命名空间默认是 moby,而不是 default,假如有用 docker 启动容器,那么也可以通过 ctr -n moby 来定位容器: ``` [root@work3 ~]# ctr -n moby container ls ``` 同样 Kubernetes 下使用的 containerd 默认命名空间是 k8s.io,所以可以使用 `ctr -n k8s.io` 来查看 Kubernetes 下面创建的容器。 ## 2. 镜像操作 >通过ctr image命令完成,也可以简化为ctr i命令操作 2.1 拉取镜像 拉取镜像可以使用`ctr image pull` 来完成,如拉取 Docker Hub 官方镜像 nginx:alpine,需要注意的是镜像地址需要加上 docker.io Host 地址 ``` [root@work3 ~]# ctr image pull docker.io/library/nginx:alpine ``` 2.2 列出本地镜像 ``` # 列出镜像列表 [root@work3 ~]# ctr image ls REF TYPE DIGEST SIZE PLATFORMS LABELS docker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:647c5c83418c19eef0cddc647b9899326e3081576390c4c7baa4fce545123b6c 16.2 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x - - # 只查看镜像名称标签 [root@work3 ~]# ctr image ls -q docker.io/flannel/flannel-cni-plugin:v1.2.0 docker.io/flannel/flannel:v0.22.1 docker.io/library/busybox:latest docker.io/library/nginx:alpine ghcr.io/kube-vip/kube-vip:v0.6.0 harbor.local.com/library/busybox:latest ``` 2.3 重新打标签 ``` [root@work3 ~]# ctr image tag docker.io/library/nginx:alpine harbor.local.com/library/nginx:alpine harbor.local.com/library/nginx:alpine [root@work3 ~]# ctr image ls -q docker.io/library/nginx:alpine harbor.local.com/library/nginx:alpine ``` 2.4 删除镜像 ``` [root@work3 ~]# ctr image rm harbor.local.com/library/nginx:alpine harbor.local.com/library/nginx:alpine [root@work3 ~]# ctr image ls -q docker.io/library/nginx:alpine ``` 2.5 将镜像导出为压缩包 ``` [root@work3 ~]# ctr image export nginx.tar docker.io/library/nginx:alpine ``` 2.6 从压缩包导入镜像 ``` [root@work2 ~]# ctr image import nginx.tar ``` ## 3. 容器操作 通过ctr container命令完成,也可以简化为`ctr c`命令操作 对ctr下containers 和 task 的概念说明: - 在docker里面 container 概念被弱化,将containers 和 task 整在一起形成docker中的 container。 - ctr 中 containers 是镜像实例化的一个虚拟环境,提供一个磁盘,模拟空间,就好比电脑处于关机状态。 - ctr 中 tasks 是将容器运行起来,电脑开机 ,初始化进程等。 3.1 创建容器 ``` [root@work3 ~]# ctr container create docker.io/library/nginx:alpine nginx ``` 3.2 列出容器 ``` [root@work3 ~]# ctr container ls CONTAINER IMAGE RUNTIME nginx docker.io/library/nginx:alpine io.containerd.runc.v2 [root@work3 ~]# ctr container ls -q nginx ``` 3.3 查看容器详情 ``` [root@work3 ~]# ctr container info nginx { "ID": "nginx", "Labels": { "io.containerd.image.config.stop-signal": "SIGQUIT", "maintainer": "NGINX Docker Maintainers \u003cdocker-maint@nginx.com\u003e" }, "Image": "docker.io/library/nginx:alpine", "Runtime": { "Name": "io.containerd.runc.v2", "Options": { "type_url": "containerd.runc.v1.Options" } } …… } ``` 3.4 删除容器 ``` [root@work3 ~]# ctr container rm nginx [root@work3 ~]# ctr container ls CONTAINER IMAGE RUNTIME ``` ## 4. 任务操作 通过 container create 命令创建的容器,并没有处于运行状态,只是一个静态的容器。一个 container 对象只是包含了运行一个容器所需的资源及相关配置数据,表示 namespaces、rootfs 和容器的配置都已经初始化成功,只是用户进程还没有启动。 一个容器真正运行起来是由 Task 任务实现的,Task 可以为容器设置网卡,还可以配置工具来对容器进行监控等。 4.1 启动容器 ``` [root@work3 ~]# ctr container create docker.io/library/nginx:alpine nginx [root@work3 ~]# ctr task start -d nginx ``` 4.2 查看正在运行的容器 ``` [root@work3 ~]# ctr task ls TASK PID STATUS nginx 60394 RUNNING ``` 4.3 获取容器信息 使用 task metrics 命令用来获取容器的内存、CPU 和 PID 的限额与使用量。 ``` [root@work3 ~]# ctr task metrics nginx ID TIMESTAMP nginx 2023-08-13 04:42:31.648754469 +0000 UTC METRIC VALUE memory.usage_in_bytes 5226496 memory.limit_in_bytes 9223372036854771712 memory.stat.cache 155648 cpuacct.usage 74124077 cpuacct.usage_percpu [32560123 27605021 7821698 6137235 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] pids.current 5 pids.limit 0 ``` 4.4 获取容器PID 使用 task ps 命令查看容器中所有进程在宿主机中的 PID: ``` [root@work3 ~]# ctr task ps nginx PID INFO 62925 - 62954 - 62955 - 62956 - 62957 - [root@work3 ~]# ctr task ls TASK PID STATUS nginx 62925 RUNNING ``` 其中第一个 PID 62925 就是容器中的 1 号进程。 4.5 进入容器进行操作 ``` [root@work3 ~]# ctr task exec --exec-id 0 -t nginx sh # ls bin docker-entrypoint.sh lib # 指定用户进入 [root@work3 ~]# ctr task exec --exec-id 0 --user 65534 -t nginx sh $ whoami nobody $ exit [root@work3 ~]# ctr task exec --exec-id 0 --user 0 -t nginx sh # whoami root ``` > 注意必须要指定 --exec-id 参数,这个 id 可以随意,只要唯一就行。 4.6 暂停容器 ``` [root@work3 ~]# ctr task pause nginx # 暂停后容器状态变成了 PAUSED [root@work3 ~]# ctr task ls TASK PID STATUS nginx 60394 PAUSED ``` 4.7 恢复容器 ``` [root@work3 ~]# ctr task resume nginx [root@work3 ~]# ctr task ls TASK PID STATUS nginx 60394 RUNNING ``` 4.8 停止容器 需要注意 ctr 没有 stop 容器的功能,只能暂停或者杀死容器。杀死容器可以使用 task kill 命令: ``` [root@work3 ~]# ctr task kill nginx [root@work3 ~]# ctr task ls TASK PID STATUS nginx 60394 STOPPED ``` 4.9 删除容器 杀掉容器后可以看到容器的状态变成了 STOPPED。同样也可以通过 task rm 命令删除 Task: ``` [root@work3 ~]# ctr task rm nginx [root@work3 ~]# ctr task ls TASK PID STATUS ``` # 二、安装配置crictl crictl 是 CRI 兼容的容器运行时命令行接口,和containerd无关,由Kubernetes提供,可以使用它来检查和调试 k8s 节点上的容器运行时和应用程序。 ## 1. 安装配置 下载地址:https://github.com/kubernetes-sigs/cri-tools/releases ``` # 下载 [root@k8s-master ~]# wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.27.1/crictl-v1.27.1-linux-amd64.tar.gz # 解压 [root@k8s-master ~]# tar -zxvf crictl-v1.27.1-linux-amd64.tar.gz -C /usr/local/bin # 配置 [root@k8s-master ~]# cat > /etc/crictl.yaml << EOF runtime-endpoint: "unix:///run/containerd/containerd.sock" image-endpoint: "unix:///run/containerd/containerd.sock" timeout: 0 debug: false pull-image-on-create: false disable-pull-on-run: false EOF [root@k8s-master ~]# crictl version Version: 0.1.0 RuntimeName: containerd RuntimeVersion: 1.6.4 RuntimeApiVersion: v1 ``` ## 2. 打印清单 2.1 打印 Pod 清单 ``` # 打印所有 Pod 的清单 $ crictl pods POD ID CREATED STATE NAME NAMESPACE ATTEMPT 926f1b5a1d33a About a minute ago Ready sh-84d7dcf559-4r2gq default 0 4dccb216c4adb About a minute ago Ready nginx-65899c769f-wv2gp default 0 a86316e96fa89 17 hours ago Ready kube-proxy-gblk4 kube-system 0 919630b8f81f1 17 hours ago Ready nvidia-device-plugin-zgbbv kube-system 0 ``` ``` # 根据名称打印 Pod 清单: $ crictl pods --name nginx-65899c769f-wv2gp POD ID CREATED STATE NAME NAMESPACE ATTEMPT 4dccb216c4adb 2 minutes ago Ready nginx-65899c769f-wv2gp default 0 ``` ``` # 根据标签打印 Pod 清单 $ crictl pods --label run=nginx POD ID CREATED STATE NAME NAMESPACE ATTEMPT 4dccb216c4adb 2 minutes ago Ready nginx-65899c769f-wv2gp default 0 ``` 2.2 打印镜像清单 ``` # 打印所有镜像清单 $ crictl images IMAGE TAG IMAGE ID SIZE busybox latest 8c811b4aec35f 1.15MB k8s-gcrio.azureedge.net/hyperkube-amd64 v1.10.3 e179bbfe5d238 665MB k8s-gcrio.azureedge.net/pause-amd64 3.1 da86e6ba6ca19 742kB nginx latest cd5239a0906a6 109MB ``` ``` # 根据仓库打印镜像清单 $ crictl images nginx IMAGE TAG IMAGE ID SIZE nginx latest cd5239a0906a6 109MB ``` ``` # 只打印镜像 ID $ crictl images -q sha256:8c811b4aec35f259572d0f79207bc0678df4c736eeec50bc9fec37ed936a472a sha256:e179bbfe5d238de6069f3b03fccbecc3fb4f2019af741bfff1233c4d7b2970c5 sha256:da86e6ba6ca197bf6bc5e9d900febd906b133eaa4750e6bed647b0fbe50ed43e sha256:cd5239a0906a6ccf0562354852fae04bc5b52d72a2aff9a871ddb6bd57553569 ``` 2.3 打印容器清单 ``` # 打印所有容器清单 $ crictl ps -a CONTAINER ID IMAGE CREATED STATE NAME ATTEMPT 1f73f2d81bf98 busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47 7 minutes ago Running sh 1 9c5951df22c78 busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47 8 minutes ago Exited sh 0 87d3992f84f74 nginx@sha256:d0a8828cccb73397acb0073bf34f4d7d8aa315263f1e7806bf8c55d8ac139d5f 8 minutes ago Running nginx 0 1941fb4da154f k8s-gcrio.azureedge.net/hyperkube-amd64@sha256:00d814b1f7763f4ab5be80c58e98140dfc69df107f253d7fdd714b30a714260a 18 hours ago Running kube-proxy 0 # 打印正在运行的容器清单 $ crictl ps CONTAINER ID IMAGE CREATED STATE NAME ATTEMPT 1f73f2d81bf98 busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47 6 minutes ago Running sh 1 87d3992f84f74 nginx@sha256:d0a8828cccb73397acb0073bf34f4d7d8aa315263f1e7806bf8c55d8ac139d5f 7 minutes ago Running nginx 0 1941fb4da154f k8s-gcrio.azureedge.net/hyperkube-amd64@sha256:00d814b1f7763f4ab5be80c58e98140dfc69df107f253d7fdd714b30a714260a 17 hours ago Running kube-proxy 0 ``` ## 3. 容器运行 3.1 容器执行命令 ``` $ crictl exec -i -t 1f73f2d81bf98 ls bin dev etc home proc root sys tmp usr var ``` 3.2 获取容器日志 ``` # 获取容器的所有日志 $ crictl logs 87d3992f84f74 10.240.0.96 - - [06/Jun/2018:02:45:49 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-" 10.240.0.96 - - [06/Jun/2018:02:45:50 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-" 10.240.0.96 - - [06/Jun/2018:02:45:51 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-" ``` ``` # 获取最近的 N 行日志 $ crictl logs --tail=1 87d3992f84f74 10.240.0.96 - - [06/Jun/2018:02:45:51 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-" ``` 3.3 运行 Pod 沙盒 用 crictl 运行 Pod 沙盒对容器运行时排错很有帮助。 在运行的 Kubernetes 集群中,沙盒会随机地被 kubelet 停止和删除。 编写下面的 JSON 文件: ``` { "metadata": { "name": "nginx-sandbox", "namespace": "default", "attempt": 1, "uid": "hdishd83djaidwnduwk28bcsb" }, "logDirectory": "/tmp", "linux": { } } ``` 使用 crictl runp 命令应用 JSON 文件并运行沙盒。 ``` $ crictl runp pod-config.json ``` 返回沙盒的 ID。 3.4 创建容器 拉取 busybox 镜像 ``` $ crictl pull busybox Image is up to date for busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47 ``` 创建 Pod 配置 ``` { "metadata": { "name": "nginx-sandbox", "namespace": "default", "attempt": 1, "uid": "hdishd83djaidwnduwk28bcsb" }, "log_directory": "/tmp", "linux": { } } ``` 创建容器配置 ``` { "metadata": { "name": "busybox" }, "image":{ "image": "busybox" }, "command": [ "top" ], "log_path":"busybox.log", "linux": { } } ``` 创建容器,传递先前创建的 Pod 的 ID、容器配置文件和 Pod 配置文件。返回容器的 ID。 ``` $ crictl create f84dd361f8dc51518ed291fbadd6db537b0496536c1d2d6c05ff943ce8c9a54f container-config.json pod-config.json ``` 查询所有容器并确认新创建的容器状态为 Created。 ``` CONTAINER ID IMAGE CREATED STATE NAME ATTEMPT 3e025dd50a72d busybox 32 seconds ago Created busybox 0 ``` 3.5 启动容器 要启动容器,要将容器 ID 传给 crictl start: ``` $ crictl start 3e025dd50a72d956c4f14881fbb5b1080c9275674e95fb67f965f6478a957d60 3e025dd50a72d956c4f14881fbb5b1080c9275674e95fb67f965f6478a957d60 ``` 确认容器的状态为 Running。 ``` $ crictl ps CONTAINER ID IMAGE CREATED STATE NAME ATTEMPT 3e025dd50a72d busybox About a minute ago Running busybox 0 ``` # 三、安装与使用nerdctl containerd虽然可直接提供给终端用户直接使用,也提供了命令行工具(ctr),但并不是很友好,所以nerdctl应运而生,它也是containerd的命令行工具,支持docker cli关于容器生命周期管理的所有命令,并且支持docker compose (nerdctl compose up) ## 1. 安装nerdctl 下载地址:https://github.com/containerd/nerdctl/releases 下载 ``` [root@k8s-master ~]# https://github.com/containerd/nerdctl/releases/download/v1.7.5/nerdctl-1.7.5-linux-amd64.tar.gz ``` 解压 ``` [root@k8s-master ~]# tar -zxvf nerdctl-1.7.5-linux-amd64.tar.gz nerdctl containerd-rootless-setuptool.sh containerd-rootless.sh ``` 复制文件 ``` [root@k8s-master ~]# mv nerdctl /usr/bin/ ``` 配置 nerdctl 参数自动补齐 ``` [root@k8s-master ~]# echo 'source <(nerdctl completion bash)' >> /etc/profile [root@k8s-master ~]# source /etc/profile ``` 验证 ``` [root@k8s-master ~]# nerdctl -v nerdctl version 1.7.5 ``` ## 2. 命名空间 这个和K8s的名字空间不同,其中default就是containerd的默认名字空间,`http://k8s.io`是K8s的名字空间 ``` # 查看命名空间 [root@k8s-master ~]# nerdctl ns ls NAME CONTAINERS IMAGES VOLUMES LABELS default 0 2 0 docker.io 0 1 0 k8s.io 18 51 0 moby 0 0 0 ``` ``` # 创建命名空间 [root@k8s-master ~]# nerdctl ns create test ``` ``` # 删除命名空间 [root@k8s-master ~]# nerdctl ns remove test test ``` ``` # 查看名称空间详情 [root@k8s-master ~]# nerdctl ns inspect k8s.io [ { "Name": "k8s.io", "Labels": null } ] ``` ## 3. 镜像 ``` # 查看镜像 [root@k8s-master ~]# nerdctl -n k8s.io images REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZE registry.aliyuncs.com/google_containers/coredns v1.8.6 5b6ec0d6de9b 5 days ago linux/amd64 44.7 MiB 13.0 MiB registry.aliyuncs.com/google_containers/etcd 3.5.6-0 dd75ec974b0a 5 days ago linux/amd64 289.0 MiB 97.8 MiB ``` ``` # 拉取镜像 [root@k8s-master ~]# nerdctl -n test pull nginx:alpine ``` ``` # 构建镜像 [root@k8s-master ~]# cat Dockerfile FROM debian RUN apt-get install -y --force-yes locales RUN echo "LC_ALL=\"zh_CN.UTF-8\"" >> /etc/default/locale RUN locale-gen "zh_CN.UTF-8" [root@k8s-master ~]# nerdctl -n test build -t abc.com/debian . ``` ``` # 上传镜像 [root@k8s-master ~]# nerdctl -n test push abc.com/debian ``` ``` # 导出镜像 [root@k8s-master ~]# nerdctl -n test save -o debian.tar abc.com/debian ``` ``` # 导入镜像 [root@k8s-master ~]# nerdctl -n test load -i debian.tar ``` ## 4. 容器 ``` # 查看容器 [root@k8s-master ~]# nerdctl -n k8s.io ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05be77648e0c registry.aliyuncs.com/google_containers/kube-proxy:v1.25.0 "/usr/local/bin/kube…" 13 hours ago Up k8s://kube-system/kube-proxy-qd2dg/kube-proxy 240c8fdfb7dd registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 13 hours ago Up k8s://kube-system/kube-apiserver-k8s-master 24728a2d2f1b docker.io/flannel/flannel:v0.21.5 "/opt/bin/flanneld -…" 17 hours ago Up k8s://kube-flannel/kube-flannel-ds-45rxr/kube-flannel ``` ``` # 启动容器 [root@k8s-master ~]# nerdctl -n test run -d -p 80:80 --name web nginx:alpine ``` ``` # 进入容器 [root@k8s-master ~]# nerdctl -n test exec -it web sh / # ``` ``` # 停止容器 [root@k8s-master ~]# nerdctl -n test stop web web ``` ``` # 删除容器 [root@k8s-master ~]# nerdctl -n test rm web web ``` ## 5. 其他操作 ``` # 查看网络信息 [root@k8s-master ~]# nerdctl network ls NETWORK ID NAME FILE cbr0 /etc/cni/net.d/10-flannel.conflist 17f29b073143 bridge /etc/cni/net.d/nerdctl-bridge.conflist host none ``` ``` # 查看系统信息 [root@k8s-master ~]# nerdctl system info Client: Namespace: default Debug Mode: false Server: Server Version: 1.6.4 Storage Driver: overlayfs Logging Driver: json-file Cgroup Driver: cgroupfs Cgroup Version: 1 Plugins: Log: fluentd journald json-file syslog Storage: native overlayfs Security Options: seccomp Profile: default Kernel Version: 4.18.0-425.13.1.el8_7.x86_64 Operating System: Rocky Linux 8.7 (Green Obsidian) OSType: linux Architecture: x86_64 CPUs: 2 Total Memory: 3.618GiB Name: k8s-master ID: d2b76909-9552-4be5-a12a-00b955f756f2 ``` ## 6. 清理数据 和Dockerb不同,不会只清理标签为"none"的镜像,而是清理所有没有"正在使用"的镜像 ``` [root@k8s-master ~]# nerdctl system prune -h ``` ## 7. nerdctl替代docker-compose 7.1 安装bridge插件 ``` [root@tiaoban ~]# mkdir -p /opt/cni/bin [root@tiaoban ~]# cd /opt/cni/bin [root@tiaoban ~]# wget https://github.com/containernetworking/plugins/releases/download/v1.4.1/cni-plugins-linux-amd64-v1.4.1.tgz [root@tiaoban ~]# tar -zxvf cni-plugins-linux-amd64-v1.4.1.tgz ``` 7.2 管理compose 以Harbor为例演示,启动容器 ``` [root@tiaoban harbor]# nerdctl compose up -d INFO[0000] Creating network harbor_harbor INFO[0000] Creating network harbor_default ``` 7.3 查看启动的容器 ``` [root@tiaoban harbor]# nerdctl ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 276a4f6a92e5 docker.io/goharbor/harbor-jobservice:v2.10.1 "/harbor/entrypoint.…" 32 seconds ago Up harbor-jobservice 7c3699c62fc7 docker.io/goharbor/redis-photon:v2.10.1 "redis-server /etc/r…" 35 seconds ago Up redis 810fbb8229c1 docker.io/goharbor/harbor-core:v2.10.1 "/harbor/entrypoint.…" 35 seconds ago Up harbor-core 9a6237f63aeb docker.io/goharbor/nginx-photon:v2.10.1 "nginx -g daemon off;" 33 seconds ago Up 0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp nginx a0198a493795 docker.io/goharbor/harbor-db:v2.10.1 "/docker-entrypoint.…" 36 seconds ago Up harbor-db b4c2c4a1f934 docker.io/goharbor/harbor-log:v2.10.1 "/bin/sh -c /usr/loc…" 37 seconds ago Up 127.0.0.1:1514->10514/tcp harbor-log d9ec21d50e55 docker.io/goharbor/harbor-portal:v2.10.1 "nginx -g daemon off;" 34 seconds ago Up harbor-portal f1e6c92a6000 docker.io/goharbor/harbor-registryctl:v2.10.1 "/home/harbor/start.…" 33 seconds ago Up registryctl f2f383e2a191 docker.io/goharbor/registry-photon:v2.10.1 "/home/harbor/entryp…" 36 seconds ago Up registry ``` 7.4 查看日志 ``` [root@tiaoban harbor]# nerdctl compose logs db |time="2024-04-26T20:39:54+08:00" level=fatal msg="no log viewer type registered for logging driver \"syslog\"" portal |time="2024-04-26T20:39:54+08:00" level=fatal msg="no log viewer type registered for logging driver \"syslog\"" redis |time="2024-04-26T20:39:54+08:00" level=fatal msg="no log viewer type registered for logging driver \"syslog\"" registry |time="2024-04-26T20:39:54+08:00" level=fatal msg="no log viewer type registered for logging driver \"syslog\"" nginx |time="2024-04-26T20:39:54+08:00" level=fatal msg="no log viewer type registered for logging driver \"syslog\"" core |time="2024-04-26T20:39:54+08:00" level=fatal msg="no log viewer type registered for logging driver \"syslog\"" jobservice |time="2024-04-26T20:39:54+08:00" level=fatal msg="no log viewer type registered for logging driver \"syslog\"" registryctl |time="2024-04-26T20:39:54+08:00" level=fatal msg="no log viewer type registered for logging driver \"syslog\"" ``` 7.5 停止容器 ``` [root@tiaoban harbor]# nerdctl compose down ``` ## 8. nerdctl+buildkitd构建镜像 8.1 buildkit介绍 buildkit 从Docker公司的开源的镜像构建工具包,支持OCI标准的镜像构建 buildkitd组成部分: - buildkitd(服务端): 目前支持runc和containerd作为镜像构建环境,默认是runc,可以更换containerd。 - buildctl(客户端): 负责解析Dockerfile文件、并向服务端buildkitd发出构建请求。 构建镜像并推送至Harbor为例,整个服务调用过程如下: ![](/media/202406/2024-06-04_163730_6929300.08477812893927428.png) 8.2 安装buildkit 软件包下载地址:https://github.com/moby/buildkit/releases ``` [root@master ~]# wget https://github.com/moby/buildkit/releases/download/v0.13.2/buildkit-v0.13.2.linux-amd64.tar.gz [root@master ~]# tar -zxvf buildkit-v0.13.2.linux-amd64.tar.gz bin/ bin/buildctl bin/buildkit-cni-bridge bin/buildkit-cni-firewall bin/buildkit-cni-host-local bin/buildkit-cni-loopback bin/buildkit-qemu-aarch64 bin/buildkit-qemu-arm bin/buildkit-qemu-i386 bin/buildkit-qemu-mips64 bin/buildkit-qemu-mips64el bin/buildkit-qemu-ppc64le bin/buildkit-qemu-riscv64 bin/buildkit-qemu-s390x bin/buildkit-runc bin/buildkitd [root@master ~]# cd bin/ [root@master bin]# cp * /usr/local/bin/ ``` 8.3 创建service脚本 ``` [root@master bin]# cat /etc/systemd/system/buildkitd.service [Unit] Description=BuildKit Documentation=https://github.com/moby/buildkit [Service] ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true [Install] WantedBy=multi-user.target ``` 新增buildkitd配置文件,添加镜像仓库使用http访问 ``` [root@master bin]# vim /etc/buildkit/buildkitd.toml [registry."harbor.local.com"] http = false insecure = true ``` 启动buildkitd ``` [root@master bin]# systemctl daemon-reload [root@master bin]# systemctl start buildkitd [root@master bin]# systemctl enable buildkitd ``` 构建镜像并测试 ``` [root@master ~]# cat Dockerfile FROM busybox CMD ["echo","hello","container"] [root@master ~]# nerdctl build -t busybox:v1 . [root@master ~]# nerdctl images REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZE busybox v1 fb6a2dfc7899 About a minute ago linux/amd64 4.1 MiB 2.1 MiB [root@master ~]# nerdctl run busybox:v1 hello container ``` 推送至Harbor仓库 ``` [root@master ~]# nerdctl tag busybox:v1 harbor.local.com/app/busybox:v1 [root@master ~]# nerdctl push harbor.local.com/app/busybox:v1 ``` 此时查看Harbor仓库发现已经推送成功 ![](/media/202406/2024-06-04_163935_1607750.5478094741152096.png)
Nathan
July 15, 2024, 5:56 p.m.
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
PDF文件
Docx文件
share
link
type
password
Update password