一.前置概念
Docker 與 Kubernetes 共用同一個 containerd 進程 時,只要滿足以下 3 個條件,就不會沖突:
檢查點 | 要求 | 原因 |
---|---|---|
cgroup-driver | kubelet 與 containerd 必須同為?systemd | 二者不一致會導致 Pod 無法調度 |
Unix socket | kubelet 指向?/run/containerd/containerd.sock ;Docker 也復用該 socket | 不搶占,不重復啟動 containerd |
端口/目錄 | 無重疊 |
特性 | cri-dockerd | containerd (內置 CRI) |
---|---|---|
本質 | 一個適配器或墊片 | 一個完整的容器運行時,原生實現了 CRI 接口 |
目的 | 為了在?dockershim ?被移除后,讓用戶還能繼續使用 Docker Engine作為 Kubernetes 的底層運行時。 | 作為 Kubernetes?默認的、推薦的容器運行時。 |
架構 | 多一層翻譯,復雜度更高。kubelet ?->?cri-dockerd ?->?dockerd ?->?containerd ?->?runc | 架構更簡潔。kubelet ?->?containerd (CRI) ?->?runc |
推薦度 | 不推薦。僅作為舊集群遷移的臨時過渡方案。 | 強烈推薦。是所有新集群的標準選擇。 |
未來 | 是舊技術的延伸,會逐步淘汰。 | 是現在和未來的標準。 |
你有兩種主要的實現路徑,其核心區別如下表所示:
特性 | 方案 A:安裝 Docker 作為獨立工具(推薦) | 方案 B:使用 cri-dockerd 讓 K8s 接管 Docker |
---|---|---|
本質 | Docker 作為獨立的工具,用于構建鏡像、運行容器等 | 讓 Kubernetes 使用 Docker 作為其底層容器運行時 |
K8s 運行時 | 保持不變,仍是 containerd | 需要變更,從 containerd 改為 Docker (通過 cri-dockerd) |
管理方式 | 容器和鏡像由?Docker?和?containerd?分別管理 | 容器和鏡像由?Kubernetes?通過?Docker?統一管理 |
復雜度 | 低,簡單安裝配置即可 | 高,需安裝配置 cri-dockerd 并調整 K8s 組件配置 |
穩定性風險 | 低,不影響現有 K8s 集群 | 中,更改運行時可能引入風險 |
適用場景 | 需使用 Docker 命令構建鏡像、測試容器 | 確實需要讓 K8s 使用 Docker 來創建和管理容 |
二.安裝docker
1.解決containerd沖突,安裝docker
**注意:安裝的docker版本需要支持k8s里面的containerd版本,docker不額外安裝containerd,使用同一個containerd
# 確保已安裝 yum-utils,它提供了 yumdownloader 命令
sudo yum install yum-utils -y # 添加倉庫
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repoyumdownloader --resolve --destdir=/tmp docker-ce-24.0.* docker-ce-cli-24.0.* docker-compose-plugin 命令說明:--resolve:自動解析并下載所有依賴的包。這個參數非常重要,否則你只下載指定的包,安裝時會因為缺少依賴而失敗47。--destdir=/tmp:指定將下載的 RPM 包存放于?/tmp?目錄。你可以根據需要修改為其他路徑。
2.手動強制安裝(忽略依賴)
cd /tmp
sudo rpm -Uvh --nodeps docker-ce-24.0.* docker-ce-cli-24.0.*
3.配置
mkdir -p /etc/docker
vim /etc/docker/daemon.json
{"exec-opts": ["native.cgroupdriver=systemd"],"storage-driver": "overlay2"
}// 強制 cgroup 驅動為 systemd,與 kubelet 保持一致
// 使用性能較好的overlay2存儲驅動
4.啟動
# 啟動并設為開機自啟
systemctl daemon-reload
systemctl enable --now docker
docker version
5.安裝docker-compose?
sudo rpm -ivh docker-compose-plugin*-i install(安裝)
-v verbose(顯示詳細過程)
-h hash(進度條)
6.使用的命令查看的容器服務不同,原因containerd的名稱空間隔離
(1)雖然物理上是同一個 containerd 進程,Docker 與 Kubernetes 各自把容器放在 不同的 containerd 命名空間:
Docker 默認使用
moby
Kubernetes CRI 使用
k8s.io
工具 | 命名空間 | 能看到誰的容器 |
---|---|---|
docker ps ?/?docker images | moby | 僅 Docker 手動啟動的容器 |
crictl ps ?/?crictl images | k8s.io | 僅 Kubernetes Pod 容器 |
nerdctl -n k8s.io ps | k8s.io | Pod 容器 |
# 看看 containerd 里有哪些命名空間
sudo ctr ns ls
(2)把 Docker 鏡像搬到 k8s.io
# 把本地 Docker 鏡像導出
docker save nginx:latest | sudo ctr -n k8s.io images import -
(3)containerd操作命令
7.使用自己的harbor
(1)containerd默認拉取鏡像的地址配置
# 如果沒有這個文件
[root@master ~]# containerd config default >/etc/containerd/config.toml[root@master ~]# vim /etc/containerd/config.tomlsandbox_image = "harbor:443/k8s/pause:3.9"#這行配置指定了 containerd 用于創建 Pod 沙箱(sandbox)的鏡像。在 Kubernetes 中,每個 Pod 都需要一個基礎的沙箱鏡像來啟動,這個鏡像通常是一個輕量級的、只包含基本功能的鏡像,用于作為容器運行的基礎環境。pause 鏡像就是這樣一個鏡像,它通常用于在 Pod 內部創建一個容器,作為該 Pod 所有其他容器的“父容器”
這意味著 containerd 將從你的 Harbor 倉庫中拉取這個特定的 pause 鏡像版本。SystemdCgroup = true# 配置鏡像倉庫
末尾插入:[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]endpoint = ["https://192.168.88.240:443"][plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor:443"]endpoint = ["https://192.168.88.240:443"][plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.88.240:443".tls]insecure_skip_verify = true
#這部分配置允許 containerd 在與 192.168.88.240:443 通信時跳過 TLS 證書驗證。[root@master ~]# systemctl enable --now kubelet containerd
docker pull <Harbor地址>/<項目名>/<鏡像名>:<標簽>
8.nerdctl命令使用和安裝
(1)下載地址
curl -L https://github.com/containerd/nerdctl/releases/download/v1.7.7/nerdctl-full-1.7.7-linux-amd64.tar.gz -o nerdctl-full.tar.gz
(2)將下載的文件解壓到 /usr/local
目錄
sudo tar Cxzvf /usr/local nerdctl-full.tar.gznerdctl --version
(3)命令使用
(2)nerdctl
?- 開發者之友
場景:?你需要在裝了 Containerd 的機器上像用 Docker 一樣構建、拉取、運行鏡像。
重要提示:?
(1)要操作 K8s 的鏡像(在?k8s.io
?命名空間),必須加?-n
?參數:
(2)拉取鏡像必須寫完整鏡像倉庫地址
命 令 | 描述 | 示例 |
---|---|---|
run | 運行一個容器?(最常用) | sudo nerdctl run -d --name nginx -p 80:80 nginx:alpine |
ps | 查看容器列表 | sudo nerdctl ps -a |
images | 查看鏡像列表 | sudo nerdctl images |
pull | 拉取鏡像 | sudo nerdctl pull nginx:alpine |
exec | 進入容器 | sudo nerdctl exec -it nginx sh |
build | 構建鏡像?(需要 BuildKit) | sudo nerdctl build -t my-app:1.0 . |
network | 管理網絡 | sudo nerdctl network ls |
compose | 運行 Docker Compose | sudo nerdctl compose up -d |
名稱空間 | nerdctl namespace ls |
(3)配置harbor倉庫跳過證書認證
# 1. 創建證書配置目錄(目錄名必須與鏡像倉庫地址完全一致)
sudo mkdir -p /etc/containerd/certs.d/harbor:443# 2. 創建 hosts.toml 配置文件
sudo tee /etc/containerd/certs.d/harbor:443/hosts.toml > /dev/null <<EOF
server = "https://harbor:443"[host."https://harbor:443"]capabilities = ["pull", "push", "resolve"]skip_verify = true
EOF# 3. 重啟 containerd
sudo systemctl restart containerd