Kubernetes_v1.18 + containerd

Kubernetes_v1.18 + containerd

在ubuntu18.04中,使用kubeadm安裝k8s 1.18版本,底層不再用docker,改為使用containerd。

原因

kubelet在調(diào)用dockerd啟動(dòng)容器時(shí)的流程是 kubelet->dockerd->containerd。dockerd相較于containerd,增加了swarm cluster,docker build,docker API等,以及一些bug。所以,我們可以繞過dockerd,通過kubelet直接調(diào)用containerd。

優(yōu)點(diǎn):

  1. 更輕量,占用資源更少。首先,containerd比dockerd少了很多插件,其次kubelet調(diào)用鏈少了一層,我做過一個(gè)測(cè)試,在同時(shí)啟動(dòng)100個(gè)nginx的pod時(shí),containerd的平均負(fù)載比dockerd的小一半(創(chuàng)建過程中,pod running后,平均負(fù)載差不多)。
  2. 安全性提高,一是,containerd比dockerd少了一些插件,這些插件的安全性就不用再關(guān)注,二是,containerd比dockerd命令更少,以及不如docker普遍,提高了攻擊者的攻擊難度。

缺點(diǎn):

  1. 對(duì)維護(hù)人員要求更高,需要熟練掌握containerd的相關(guān)操作。
  2. 一些功能不再支持,比如 與構(gòu)建鏡像相關(guān)的操作。所以,在將k8s作為流水線的執(zhí)行環(huán)境時(shí),構(gòu)建鏡像需要使用dind的方式。
  3. containerd將不再能看到contianer的運(yùn)行情況,需要使用crictl相關(guān)命令查看。但是crictl是從kubelet的視角上看到的,它操作的對(duì)象級(jí)別是pod,而不是單個(gè)容器。

安裝過程

安裝containerd以及kubeadm和kubelet等

參考:安裝 kubeadm

主要操作:

sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet=1.18.0-00 kubeadm=1.18.0-00 kubectl=1.18.0-00 containerd
sudo apt-mark hold kubelet=1.18.0-00 kubeadm=1.18.0-00 kubectl=1.18.0-00

配置containerd、kubelet以及cri

cat > /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

# Setup required sysctl params, these persist across reboots.
cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sysctl --system

# Configure containerd
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

# Restart containerd
systemctl restart containerd

# config kubelet cgroup
cat > /etc/default/kubelet <<EOF
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd
EOF

# config CRI

cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

修改containerd的一些配置(vim /etc/containerd/config.toml):
[plugins."io.containerd.grpc.v1.cri"]下的sandbox_image修改為docker.io/s7799653/pause:3.2 ,k8s.gcr的鏡像國(guó)內(nèi)無法下載,我從dockerhub上轉(zhuǎn)了一下。
一些其他的配置可以參考: https://github.com/containerd/cri/blob/master/docs/

安裝kubernetes

# 修改kubeadm的默認(rèn)配置。
kubeadm config print init-defaults > config.yaml
vim config.yaml

需要修改的地方:

  • localAPIEndpoint.advertiseAddress修改為本機(jī)地址。
  • nodeRegistration.criSocket修改為contianerd的sock“/run/containerd/containerd.sock”
  • networking添加podSubnet為192.168.0.0/16
  • imageRepository改為 docker.io/s7799653(k8s.gcr的鏡像國(guó)內(nèi)沒法下載,我自己從dockerhub上轉(zhuǎn)了一下。)

修改完成之后:

apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 127.0.0.1
  bindPort: 6443
nodeRegistration:
  criSocket: /run/containerd/containerd.sock
  name: k8s-127
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: docker.io/s7799653
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 192.168.0.0/16
scheduler: {}
kubeadm init --config config.yaml
# 下載calico的config文件
curl https://docs.projectcalico.org/v3.11/manifests/calico.yaml > calico.yaml
# 安裝calico
kubectl apply -f calico.yaml
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容