辭舊迎新娃惯,新手使用Containerd時的幾點須知

docker-gogogo.jpg

相信大家在2020年歲末都被Kubernetes即將拋棄Docker的消息刷屏了迄汛。事實上作為接替Docker運行時的Containerd在早在Kubernetes1.7時就能直接與Kubelet集成使用,只是大部分時候我們因熟悉Docker续誉,在部署集群時采用了默認(rèn)的dockershim。不過社區(qū)也說了初肉,在1.20之后的版本的kubelet會放棄對dockershim部分的支持酷鸦。

image.png

作為普通小白,我們在更換Containerd后,以往的一些習(xí)慣和配置也不得不改變和適配臼隔。那么本篇也是最近小白逐漸替換Containerd后的一些總結(jié)嘹裂。

1. Containerd安裝與Kubelet集成

  • 安裝前的準(zhǔn)備
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 設(shè)置必需的 sysctl 參數(shù),這些參數(shù)在重新啟動后仍然存在躬翁。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sudo sysctl --system
  • 安裝containerd
# 安裝 Docker 的官方 GPG 密鑰
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key --keyring /etc/apt/trusted.gpg.d/docker.gpg add -

# 新增 Docker apt 倉庫焦蘑。
sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
    
# 安裝containerd包
sudo apt-get update && sudo apt-get install -y containerd.io
  • 生成containerd默認(rèn)配置
sudo mkdir -p /etc/containerd
sudo containerd config default > /etc/containerd/config.toml
  • 修改kubelet配置

在配置文件/var/lib/kubelet/kubeadm-flags.env的KUBELET_KUBEADM_ARGS追加以下部分

KUBELET_KUBEADM_ARGS="--container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock --image-service-endpoint=unix:///run/containerd/containerd.sock"
  • 重啟containerd和kubelet服務(wù)
systemctl restart containerd kubelet

2. Containerd常見操作

更換Containerd后盯拱,以往我們常用的docker命令也不再使用盒发,取而代之的分別是crictl和ctr兩個命令客戶端。

  • crictl是遵循CRI接口規(guī)范的一個命令行工具狡逢,通常用它來檢查和管理kubelet節(jié)點上的容器運行時和鏡像
  • ctr是containerd的一個客戶端工具宁舰,

使用crictl命令之前,需要先配置/etc/crictl.yaml如下:

runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false

接下來就是crictl的的常見命令奢浑,其中能完全替代docker命令的參照下列表格

操作 crictl docker
查看運行容器 crictl ps docker ps
查看鏡像 crictl images docker images
查看容器日志 crictl logs docker logs
登陸容器控制臺 crictl exec docker exec
pull鏡像 crictl pull docker pull
容器啟動/停止 crictl start/stop docker start/stop
容器資源情況 crictl stats docker stats

可以看到crictl對容器生命周期的管理基本已經(jīng)覆蓋蛮艰,不過在crictl我們不能完成操作也比較多,比如對鏡像的管理就不屬于它的管理范圍雀彼。這部分還得依靠ctr來實現(xiàn)壤蚜,操作方式同樣可以參照下表

操作 ctr docker
查看鏡像 ctr images ls docker images
鏡像導(dǎo)入/導(dǎo)出 ctr images import/exporter docker load/save
鏡像拉取/推送 ctr images pull/push docker pull/push
鏡像tag ctr images tag docker tag

這里需注意的是,由于Containerd也有namespaces的概念徊哑,對于上層編排系統(tǒng)的支持袜刷,主要區(qū)分了3個命名空間分別是k8s.iomobydefault莺丑,以上我們用crictl操作的均在k8s.io命名空間完成如查看鏡像列表就需要加上-n參數(shù)

ctr -n k8s.io images list

3. Containerd與(虛擬)顯卡設(shè)備

在Docker中著蟹,通常用nvidia-docker來調(diào)用nvidia-container-runtime來實現(xiàn)容器的GPU設(shè)備掛載。在更換成Containerd后梢莽,我們就不再需要nvidia-docker這個客戶端萧豆,而是直接在containerd運行時的plugin中直接調(diào)用nvidia-container-runtime

除了需要正常安裝containerd和nvidia、cuda驅(qū)動外昏名,還需要安裝nvidia-container-runtime

curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \
  sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
sudo apt update
sudo apt install nvidia-container-runtime -y

最后在containerd添加nvidia運行時配置

/etc/containerd/config.toml

    [plugins."io.containerd.grpc.v1.cri".containerd]
      snapshotter = "overlayfs"
-     default_runtime_name = "runc"
+     default_runtime_name = "nvidia"
      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
        # This section is added by system, we can just ignore it.
        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
          runtime_type = "io.containerd.runc.v2"
          runtime_engine = ""
          runtime_root = ""
          privileged_without_host_devices = false
          base_runtime_spec = ""
+       [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
+         runtime_type = "io.containerd.runc.v2"
+         runtime_engine = ""
+         runtime_root = ""
+         privileged_without_host_devices = false
+         base_runtime_spec = ""
+         [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
+           BinaryName = "nvidia-container-runtime"

此外如果你和小白一樣用了騰訊的tke-gpu-manager來虛擬化GPU設(shè)備的話涮雷,還需要將gpu-manager升級到1.1.0版本以上。然后修改啟動參數(shù)即可解決

containers:
- env:
  - name: EXTRA_FLAGS
    value: --container-runtime-endpoint=/var/run/containerd/containerd.sock

最后我們用一個pod來驗證GPU是否能正常識別到即可

apiVersion: v1
kind: Pod
metadata:
  name: vcuda
spec:
  restartPolicy: Never
  containers:
  - image: nvidia/cuda:10.1-runtime-ubuntu16.04
    name: nvidia
    command:
    - "/usr/local/nvidia/bin/nvidia-smi"
    - "pmon"
    - "-d"
    - "10"
    resources:
      requests:
        tencent.com/vcuda-core: 50
        tencent.com/vcuda-memory: 4
      limits:
        tencent.com/vcuda-core: 50
        tencent.com/vcuda-memory: 4

4. Containerd控制臺日志

在Docker時代轻局,kubernetes的容器控制日志默認(rèn)格式為json份殿,在更換為Containerd后,容器的控制臺輸出變?yōu)閠ext格式嗽交,如下

# docker的json格式日志
{"log":"[INFO] plugin/reload: Running configuration MD5 = 4665410bf21c8b272fcfd562c482cb82\n","stream":"stdout","time":"2020-01-10T17:22:50.838559221Z"}

#contaienrd的text格式日志
2020-01-10T18:10:40.01576219Z stdout F [INFO] plugin/reload: Running configuration MD5 = 4665410bf21c8b272fcfd562c482cb82

大多情況情況下這會導(dǎo)致我們默認(rèn)的日志采集客戶端以前用json格式解析器報錯而無法繼續(xù)采集日志卿嘲,所以當(dāng)我們把Containerd上線后還需要修改日志采集端的配置。

以fluentd為樣例夫壁,我們需要引入multi_format來解析兩種格式的容器日志

<source>
  @id fluentd-containers.log
  @type tail
  path /var/log/containers/*.log
  pos_file /var/log/es-containers.log.pos
  tag raw.kubernetes.*
  read_from_head true
  <parse>
    @type multi_format
    <pattern>
      format json
      time_key time
      time_format %Y-%m-%dT%H:%M:%S.%NZ
    </pattern>
    #這部分用來正則匹配CRI容器日志格式
    <pattern>
      format /^(?<time>.+) (?<stream>stdout|stderr) [^ ]* (?<log>.*)$/
      time_format %Y-%m-%dT%H:%M:%S.%N%:z
    </pattern>
  </parse>
</source>

總結(jié)

K8S的Worker節(jié)點逐漸的往輕量化轉(zhuǎn)移拾枣,除了Containerd之外還有k8s的親兒子cri-o,不過相比Containerd已經(jīng)過大規(guī)模生產(chǎn)環(huán)境驗證的產(chǎn)品來講,當(dāng)下Containerd仍然是最佳的容器運行時管理工具梅肤。


關(guān)注公眾號「云原生小白」司蔬,獲取更多精彩內(nèi)容

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市姨蝴,隨后出現(xiàn)的幾起案子俊啼,更是在濱河造成了極大的恐慌,老刑警劉巖左医,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件授帕,死亡現(xiàn)場離奇詭異,居然都是意外死亡浮梢,警方通過查閱死者的電腦和手機(jī)跛十,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秕硝,“玉大人芥映,你說我怎么就攤上這事≡恫颍” “怎么了奈偏?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長躯护。 經(jīng)常有香客問我惊来,道長,這世上最難降的妖魔是什么榛做? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任唁盏,我火速辦了婚禮,結(jié)果婚禮上检眯,老公的妹妹穿的比我還像新娘厘擂。我一直安慰自己,他們只是感情好锰瘸,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布刽严。 她就那樣靜靜地躺著,像睡著了一般避凝。 火紅的嫁衣襯著肌膚如雪舞萄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天管削,我揣著相機(jī)與錄音倒脓,去河邊找鬼。 笑死含思,一個胖子當(dāng)著我的面吹牛崎弃,可吹牛的內(nèi)容都是我干的甘晤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饲做,長吁一口氣:“原來是場噩夢啊……” “哼线婚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盆均,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤塞弊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后泪姨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體游沿,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年驴娃,在試婚紗的時候發(fā)現(xiàn)自己被綠了奏候。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片循集。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡唇敞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咒彤,到底是詐尸還是另有隱情疆柔,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布镶柱,位于F島的核電站旷档,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏歇拆。R本人自食惡果不足惜鞋屈,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望故觅。 院中可真熱鬧厂庇,春花似錦、人聲如沸输吏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贯溅。三九已至拄氯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間它浅,已是汗流浹背译柏。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留姐霍,地道東北人鄙麦。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親黔衡。 傳聞我的和親對象是個殘疾皇子蚓聘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 本文轉(zhuǎn)自:https://feisky.xyz/posts/kubernetes-container-runtim...
    徐亞松_v閱讀 1,211評論 0 0
  • https://edu.aliyun.com/course/1651 第一章 云原生課 1.1 云原生技術(shù)發(fā)展歷程...
    MichelleZm閱讀 1,693評論 0 0
  • 久違的晴天,家長會盟劫。 家長大會開好到教室時夜牡,離放學(xué)已經(jīng)沒多少時間了。班主任說已經(jīng)安排了三個家長分享經(jīng)驗侣签。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,520評論 16 22
  • 今天感恩節(jié)哎塘装,感謝一直在我身邊的親朋好友。感恩相遇影所!感恩不離不棄蹦肴。 中午開了第一次的黨會,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,562評論 0 11
  • 可愛進(jìn)取猴娩,孤獨成精阴幌。努力飛翔,天堂翱翔卷中。戰(zhàn)爭美好矛双,孤獨進(jìn)取。膽大飛翔蟆豫,成就輝煌议忽。努力進(jìn)取,遙望十减,和諧家園栈幸。可愛游走...
    趙原野閱讀 2,726評論 1 1