Kubernetes_v1.18 + containerd
在ubuntu18.04中,使用kubeadm安装k8s 1.18版本,底层不再用docker,改为使用containerd。
原因
kubelet在调用dockerd启动容器时的流程是 kubelet->dockerd->containerd。dockerd相较于containerd,增加了swarm cluster,docker build,docker API等,以及一些bug。所以,我们可以绕过dockerd,通过kubelet直接调用containerd。
优点:
- 更轻量,占用资源更少。首先,containerd比dockerd少了很多插件,其次kubelet调用链少了一层,我做过一个测试,在同时启动100个nginx的pod时,containerd的平均负载比dockerd的小一半(创建过程中,pod running后,平均负载差不多)。
- 安全性提高,一是,containerd比dockerd少了一些插件,这些插件的安全性就不用再关注,二是,containerd比dockerd命令更少,以及不如docker普遍,提高了攻击者的攻击难度。
缺点:
- 对维护人员要求更高,需要熟练掌握containerd的相关操作。
- 一些功能不再支持,比如 与构建镜像相关的操作。所以,在将k8s作为流水线的执行环境时,构建镜像需要使用dind的方式。
- containerd将不再能看到contianer的运行情况,需要使用crictl相关命令查看。但是crictl是从kubelet的视角上看到的,它操作的对象级别是pod,而不是单个容器。
安装过程
安装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的镜像国内无法下载,我从dockerhub上转了一下。
一些其他的配置可以参考: https://github.com/containerd/cri/blob/master/docs/
安装kubernetes
# 修改kubeadm的默认配置。
kubeadm config print init-defaults > config.yaml
vim config.yaml
需要修改的地方:
- localAPIEndpoint.advertiseAddress修改为本机地址。
- nodeRegistration.criSocket修改为contianerd的sock“/run/containerd/containerd.sock”
- networking添加podSubnet为192.168.0.0/16
- imageRepository改为 docker.io/s7799653(k8s.gcr的镜像国内没法下载,我自己从dockerhub上转了一下。)
修改完成之后:
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