Kubernetes节点运行时从Docker切换到Containerd

        由于k8s将于1.24版本弃用dockershim,所以最近在升级前把本地的k8s切换到了Containerd运行时,目前我的k8s版本是1.22.5,一个master,二个Node的配置,以下做为一个操作记录日志整理,其它可以参考官网文档。

在Master节点使用cordon命令将node标记为不可调度,执行drain命令,将该Node上运行的pod平滑的赶到其他节点上(对于只有一个Master节点的集群也是一样的操作,只是在维护过程中Master会停止服务)。

sudo kubectl cordon <node_name>
sudo kubectl drain <node_name>

停止kubelet和Docker,并删除Dockers相关

sudo systemctl stop kubelet
sudo systemctl stop docker && sudo systemctl disable docker.service --now

sudo yum remove docker \
      docker-client \
      docker-client-latest \
      docker-common \
      docker-latest \
      docker-latest-logrotate \
      docker-logrotate \
      docker-engine
sudo yum remove docker-ce docker-ce-cli
rm -rf /var/run/docker && rm -rf /var/run/dockershim.sock

配置一些环境变量

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter

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


cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sudo sysctl --system

安装并配置Containerd

sudo yum install -y containerd.io

mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml

修改  /etc/containerd/config.toml 文件中 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] 的 SystemdCgroup = true,以使 runc 使用 systemd cgroup 驱动

重启containerd服务

sudo systemctl daemon-reload
sudo systemctl restart containerd

修改/var/lib/kubelet/kubeadm-flags.env文件修改并添加以启动变量

--cgroup-driver=systemd --container-runtime=remote --container-runtime-endpoint=/run/containerd/containerd.sock

修改 /var/lib/kubelet/config.yaml, 将 cgroupDriver 由 cgroupfs 修改为 systemd

重启kubelet服务

systemctl daemon-reload
systemctl start kubelet

恢复节点,注意操作后需要一点时间来启动容器,日志出现报错可暂时忽略,大概几分钟到10几分钟,可以通过crictl ps命令来查看各容器启动的情况。

kubectl uncordon <node_name>

以下是一些维护过程中可能会用到的命令,以供备用。

#通过以下指令查看上面设置已生效
lsmod | grep br_netfilter
lsmod | grep overlay
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward


#显示日志
journalctl --no-pager -xe  -u containerd


#重新加入节点
kubeadm join 172.16.1.111:6443 --token xxx \
    --discovery-token-ca-cert-hash sha256:xxx

#查看systemd管理的进程
systemd-cgls


#配置crictl只读取containerd容器运行时
vi /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false

#查看容器启动情况
crictl ps

### 如何在 Ubuntu 22.04 上安装 DockerKubernetes 的最佳实践 #### 安装 Docker 为了在 Ubuntu 22.04 上成功部署 Kubernetes,首先需要安装 Docker。以下是推荐的最佳实践: 1. 更新系统的包索引并安装必要的依赖项: ```bash sudo apt update && sudo apt install -y curl gnupg2 software-properties-common ``` 2. 添加官方的 Docker GPG 密钥以及仓库: ```bash curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null ``` 3. 安装最新版本的 Docker Engine 并启动服务: ```bash sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io sudo systemctl start docker && sudo systemctl enable docker ``` 完成上述步骤后,Docker 就已成功安装。 --- #### 配置 Container Runtime Interface (CRI) Kubernetes 使用 CRI 来管理容器运行环境,默认支持 Docker 或其他兼容工具(如 containerd)。如果使用的是 Docker,则无需额外操作;但如果切换containerd,则需调整配置文件以适配 Kubernetes[^1]。 --- #### 安装 Kubernetes 组件 接下来,在 Ubuntu 22.04 上安装 Kubernetes 所需的核心组件,包括 `kubelet`、`kubeadm` 和 `kubectl`。 1. 添加 Kubernetes APT 存储库密钥及其源列表: ```bash curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list ``` 2. 安装指定版本的 Kubernetes 工具集: ```bash sudo apt update && sudo apt install -y kubelet=1.28.7-00 kubeadm=1.28.7-00 kubectl=1.28.7-00 sudo apt-mark hold kubelet kubeadm kubectl ``` 通过固定版本号的方式可以避免因自动更新而导致不兼容问题的发生。 --- #### 初始化主节点 初始化 Kubernetes节点之前,先确认系统满足必要条件,例如关闭 swap 文件交换功能: ```bash sudo swapoff -a ``` 随后执行以下命令创建初始集群结构: ```bash sudo kubeadm init \ --pod-network-cidr=10.244.0.0/16 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.28.7 \ --cri-socket unix:///run/containerd/containerd.sock ``` 此过程会下载所需镜像并将它们加载到本地存储中[^3]。 完成后记录提示中的加入工作节点所需的令牌信息以便后续扩展规模。 --- #### 设置网络插件 为使 Pod 能够相互通信,必须应用合适的 CNI 插件方案。这里选用 Flannel 实现跨主机通信能力。 1. 下载对应平台架构下的二进制压缩包: ```bash wget https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz -P ~/ tar zxvf ~/cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin/ ``` 2. 应用 Flannel YAML 清单文档定义资源对象模型: ```bash kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ``` 验证所有 Pods 是否处于正常运行状态即可证明基础架构搭建完毕[^4]。 --- #### 总结 以上流程涵盖了从零开始构建基于 Ubuntu 22.04 的现代化容器化服务平台的关键环节。遵循这些指导原则能够显著提升效率同减少潜在错误风险。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值