概念介紹node
cri (Container runtime interface)linux
cri is a containerd plugin implementation of Kubernetes container runtime interface (CRI). cri是 kubernetes的容器運行時接口的容器插件實現。
containerdnginx
containerd is an industry-standard container runtime with an emphasis on simplicity, robustness and portability. containerd徹底支持運行容器的的CRI運行時規範。 cri在containerd1.1以上的版本的原生插件。它內置於containerd並默認啓用。
cri-ogit
OCI-based implementation of Kubernetes Container Runtime Interface. kubernetes爲了兼容cri和oci孵化了項目cri-o。爲了架設在cri和oci之間的一座橋樑。由此cri-o既兼容cri插件實現又兼容oci的容器運行時標準。
oci (Open Container Initiative)github
oci是由多家公司成立的項目,並由linux基金會進行管理,致力於container runtime 的標準的制定和runc的開發等工做。
runcdocker
runc is a CLI tool for spawning and running containers according to the OCI specification. runc,是對於OCI標準的一個參考實現,是一個能夠用於建立和運行容器的CLI(command-line interface)工具。
概述api
因爲docker嵌入了太多自身內容,爲了減輕容器負擔。這次選用containerd做爲kubernetes的容器實現方案。本文將帶你們講述如何搭建一個集成了containerd的k8s集羣。工具
環境準備測試
下載containerd二進制包。我這裏已經編譯並打包了好了,內含containerd、runc、crictl、ctr等。ui
下載連接:https://github.com/cuisongliu/containerd-dist/releases/download/v1.2.4/containerd-v1.2.4.tar.gz
runc版本: 1.0.1-dev containerd版本: v1.2.4
安裝containerd
解壓二進制包並生成默認文件
tar -C /usr/local/bin -xzf containerd-v1.2.4.tar.gz chmod a+x /usr/local/bin/* containerd config default > /etc/containerd/config.toml
生成的默認配置文件注意 [grpc] 的 address 字段默認爲 /run/containerd/containerd.sock
配置文件其餘參數含義參照github地址: https://github.com/containerd/containerd/blob/master/docs/man/containerd-config.toml.5.md
在 /etc/systemd/system 目錄下編寫文件 containerd.service內容以下
[Unit] Description=containerd container runtime Documentation=https://containerd.io After=network.target [Service] ExecStartPre=/sbin/modprobe overlay ExecStart=/usr/local/bin/containerd Restart=always RestartSec=5 Delegate=yes KillMode=process OOMScoreAdjust=-999 LimitNOFILE=1048576 # 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 [Install] WantedBy=multi-user.target
啓動containerd
systemctl enable containerd systemctl restart containerd systemctl status containerd
看containerd啓動狀態若是是running就沒有問題。下面咱們測試拉取一下hub的鏡像。
測試containerd
ctr images pull docker.io/library/nginx:alpine
看到輸出done,說明containerd運行一切正常。
使用crictl鏈接containerd,下一步咱們使用crictl鏈接containerd。
修改crictl的配置文件,在 /etc/crictl.yaml 寫入如下內容:
runtime-endpoint: unix:///run/containerd/containerd.sock image-endpoint: unix:///run/containerd/containerd.sock timeout: 10 debug: false
這裏注意runtime-endpoint 和image-endpoint 必須與/etc/containerd/config.toml中配置保持一致。
驗證一下cri插件是否可用
crictl pull nginx:alpine crictl rmi nginx:alpine crictl images
其中 crictl images 會列出全部的cri容器鏡像。
到此咱們的cri + containerd已經完成整合了。下一步咱們須要修改kubeadm配置進行安裝。
導入kubenetes離線鏡像包
這裏咱們就須要導入k8s的離線鏡像包了。這裏須要注意一下,kubernetes是調用的cri接口,因此導入時也須要從cri插件導入鏡像。
cri導入鏡像命令(cri導入鏡像):
ctr cri load images.tar
containerd導入鏡像命令(containerd導入鏡像):
ctr images import images.tar
修改kubelet配置和kubeadm安裝時配置
在 kubelet配置文件 10-kubeadm.conf 的[Service] 結點加入如下配置:
Environment="KUBELET_EXTRA_ARGS=--container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
在kubeadm配置文件 kubeadm.yaml 中加入
apiVersion: kubeadm.k8s.io/v1beta1 kind: InitConfiguration nodeRegistration: criSocket: /run/containerd/containerd.sock name: containerd
到此containerd和kubernetes的集成就完成了。下面能夠直接安裝便可。