簡體   English   中英

使用 containerd 在 Kubernetes 中運行 docker

[英]Running docker inside Kubernetes with containerd

由於 K8S v1.11 Runtime 從 dockerd 更改為 containerd。 我在 Kubernetes 上使用 Jenkins 來使用 Docker 之外的 Docker 構建 Docker 鏡像(dood)。

當我嘗試使用常規 docker 客戶端切換到使用 conatinerd 的套接字文件(containerd/containerd.sock 映射廣告 /var/run/docker.sock)時,出現以下錯誤Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/json: net/http: HTTP/1.x transport connection broken: malformed HTTP response "\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x00\\x00".

docker 客戶端可以與 containerd 一起使用嗎?

免責聲明:在撰寫本文時,containerd 並未取代 Docker,您可以將 containerd與 Docker 分開安裝,並且您可以將Kubernetes CRI指向直接與 containerd 套接字對話。

因此,當您安裝 Docker 時,它確實與 containerd 一起安裝,並且Docker 守護進程會與之對話。 你會看到一個這樣的過程:

docker-containerd --config /var/run/docker/containerd/containerd.toml

然而,Docker 客戶端仍然與 Docker 守護進程對話,這就是為什么當你在容器中運行 Docker 客戶端時,你仍然需要直接與 Docker 守護進程對話( /var/run/docker.sock ),所以你可以切換回/var/run/docker.sock我相信它應該可以工作。

至少對於 Ubuntu 20.04 上的MicroK8s 1.18,我發現解決這個問題的方法是在 Kubernetes 旁邊顯式安裝 Docker。

類似的步驟應該適用於不包含 Docker 的其他 Kubernetes 發行版。

安裝microk8s ,您可以執行以下操作來安裝 Docker:

# Shut down microk8s
sudo snap disable microk8s

# Assuming no Docker installed yet - this fixes the case  
# where Kubernetes results in this path being a directory 
rm -rf /var/run/docker.sock

sudo apt-get install docker.io

ls -l /var/run/docker.sock
# Output should show socket not directory:
#    srw-rw---- 1 root docker 0 Aug  6 11:50 /var/run/docker.sock

# (See https://docs.docker.com/engine/install/linux-postinstall/ for usermod + newgrp commands at this point) 

# Restart microk8s 
sudo snap enable microk8s

其他 Kubernetes 發行版可能有不同的方式來更有選擇性地關閉進程。

journalctl -xe可用於在此處查看來自 Docker 或 Kubernetes 的任何錯誤。

在 Kubernetes manifests 中,掛載 docker.sock 時一定要使用/var/run/docker.sock作為主機路徑。

相關問題:

Linux 上 Docker 的安裝后步驟

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM