k8s二进制安装02-前期规划及containerd设定


部署架构

架构图如下:

image-20220323172716454

主机规划
主机名 IP地址 角色 安装组件
m01 1921.168.1.51 master apiserver,controller-manager,scheduler,etcd,kubectl
m02 1921.168.1.52 master apiserver,controller-manager,scheduler,etcd
m03 1921.168.1.53 master apiserver,controller-manager,scheduler,etcd
w01 1921.168.1.61 worker kubelet,kube-proxy,containerd
w02 1921.168.1.62 worker kubelet,kube-proxy,containerd
lb01 1921.168.1.41 loadbalance nginx,keepalived
lb02 1921.168.1.42 loadbalance nginx,keepalived
192.168.1.40 vip
网络规划
  • 节点网络:192.168.1.0/24
  • service网络:10.96.0.0/16
  • pod网络:172.16.0.0/16
软件版本
  • kubernets:1.23.3
  • etcd:3.5.2

虚拟主机系统配置参见另一篇博文--

基本设定

此次部署基本都在m01上进行操作,生成配置后,将配置文件发送到其他节点

配置免密认证
## 进入root家目录
cd ~

## 生成秘钥文件
ssh-keygen -t rsa
回车 回车

## 将秘钥文件拷贝需要免密登陆的主机
for i in m01 m02 m03 w01 w02 ;do ssh-copy-id -i ${HOME}/.ssh/id_rsa.pub $i;done
安装PKI管理工具-cfssl
## 下载cfssl二进制程序
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl_1.6.1_linux_amd64 -O /usr/local/bin/cfssl
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssljson_1.6.1_linux_amd64 -O /usr/local/bin/cfssljson

## 添加执行权限
chmod +x /usr/local/bin/cfssl*
部署containerd
下载二进制文件

下载带cri-containerd-cni开头的文件,这个tar包里面包含了containerd以及 crictl 管理工具和 cni 网络插件,下载后可以使用tar -tf <包名>,查看tar包的内容。

## 创建配置生成目录
mkdir -p /root/containerd/{app,bin,cnibin,config,service}
cd /root/containerd

## 下载二进制文件
wget https://github.com/containerd/containerd/releases/download/v1.6.1/cri-containerd-cni-1.6.1-linux-amd64.tar.gz -O app/containerd.tar.gz

## 解压
tar -xf app/containerd.tar.gz --strip-components=3 -C bin usr/local/bin/{containerd,containerd-shim*,crictl,ctr} 

tar -xf app/containerd.tar.gz --strip-components=3 -C cnibin opt/cni/bin/*

## 下载runc
wget https://github.com/opencontainers/runc/releases/download/v1.1.0/runc.amd64 -O bin/runc

## 添加执行权限
chmod +x bin/runc
生成配置文件及启动service文件

生成脚本containerd_config.sh

cat <<'EOF' | sudo tee containerd_config.sh
#!/bin/bash
## 创建service文件
cat > service/containerd.service <

执行脚本

bash containerd_config.sh

## 在service目录下生成
├── containerd.service
生成containerd的配置文件,并按需修改
## 创建配置
./bin/containerd config default > config/config.toml

## 由于k8s.gcr.io网站打不开,需要修改sandbox_image参数,如果这里不修改,也可以手动下载pause镜像,
## 然后修改镜像名称
## ctr -n k8s.io i tag  registry.cn-hangzhou.aliyuncs.com/kubernetes-kubespray/pause:3.6 k8s.gcr.io/pause:3.6
## root:容器存储路径,修改成磁盘空间充足的路径,
## bin_dir:containerd二进制文件
## conf_dir: cni 插件存储路径
## sandbox_image:pause镜像名称以及镜像tag,
vim config/config.toml
root = "/data/containerd"
    sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6"
    
       [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]            
            SystemdCgroup = true
分发二进制文件、配置及创建相关路径
for i in w01 w02; do \
ssh $i "mkdir -p /etc/containerd"; \
ssh $i "mkdir -p /opt/cni/bin"; \
ssh $i "mkdir -p /opt/containerd"; \
ssh $i "mkdir -p /etc/cni/net.d"; \
scp bin/* $i:/usr/local/bin/; \
scp cnibin/* $i:/opt/cni/bin/; \
scp service/containerd.service $i:/usr/lib/systemd/system/; \
scp config/config.toml $i:/etc/containerd/; \
scp config/crictl.yaml $i:/etc/; \
done
启动containerd服务
for i in w01 w02; do \
ssh $i "systemctl daemon-reload"; \
ssh $i "systemctl enable containerd"; \
ssh $i "systemctl restart containerd --no-block"; \
ssh $i "systemctl is-active containerd"; \
done
测试containerd
## 可以登陆w01,测试拉取busybox镜像,使用ctr拉取,镜像的路径要写全
ctr images pull docker.io/library/busybox:latest

## 拉取pause镜像
for i in w01 w02;do \
ssh $i "ctr images pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6";
done

## 查看镜像
## Containerd也有namespaces的概念,对于上层编排系统的支持,主要区分了3个命名空间分别是k8s.io
## moby和default,用crictl操作的均在k8s.io命名空间完成如查看镜像列表就需要加上-n参数
ctr -n k8s.io images list
ctr image list
配置crictl

使用除docker以外的CRI时,需要使用crictl来进行镜像管理,相当于docker命令行工具。

Containerd 只支持通过 CRI 拉取镜像的 mirror,也就是说,只有通过 crictl 或者 Kubernetes 调用时 ,mirror 才会生效,通过 ctr 拉取是不会生效的。crictl是k8s内部的镜像管理命令。

生成脚本

cat <<'EOF' | sudo tee crictl_config.sh
#!/bin/bash

## crictl是遵循CRI接口规范的一个命令行工具,通常用它来检查和管理kubelet节点上的容器运行时和镜像
## 使用cricti工具之前,需要先创建crictl的配置文件
## 注意runtime-endpoint和image-endpoint必须与/etc/containerd/config.toml中配置保持一致。
cat > config/crictl.yaml <

执行

bash crictl_config.sh

## 在config下生成
├── crictl.yaml
测试crictl

crictl的使用方法基本和docker用法相同

## 拉取镜像
crictl pull busybox
Image is up to date for sha256:2fb6fc2d97e10c79983aa10e013824cc7fc8bae50630e32159821197dda95fe3

## 列出所有cri容器镜像
crictl images
IMAGE                       TAG                 IMAGE ID            SIZE
docker.io/library/busybox   latest              2fb6fc2d97e10       777kB