【Kubernetes】K8s 1.35 配置 Docker 作为容器运行时

Kubernetes 1.24 移除了对 Docker 的直接支持,并且新版 K8s 主推更轻量的 Containerd,但 Docker 凭借其强大的生态依然是许多人的首选。本文将通过 cri-dockerd 这个 '适配器',让 Kubernetes 中重新用上 Docker!

  • 操作系统:Ubuntu 24.04.2 LTS
  • Docker:29.1.3
  • cri-dockerd:0.3.14.3
  • Kubernetes:1.35.0
  • 下方仅一个主节点为例(其中主节点 hostname 为 master,可根据实际情况修改)

1、准备工作

1.1、查看操作系统版本

bash 复制代码
# 查看操作系统版本
cat /etc/os-release

1.2、关闭防火墙

  • 若有防火墙需要关闭

1.3、关闭 swap 分区

bash 复制代码
# 查看 swap 分区是否存在
free -h
# 关闭当前会话的 swap,重启后无效
swapoff -a
# 永久关闭 swap ,需重启
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 查看 swap 分区已关闭
free -h

1.4、配置内核

bash 复制代码
# 加载内核模块
modprobe overlay
modprobe br_netfilter
 
# 配置 sysctl 参数
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
 
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
 
# 应用配置
sysctl --system

1.5、安装必要工具

bash 复制代码
# 安装必要工具
apt install -y apt-transport-https ca-certificates curl gnupg lsb-release

2、安装 Docker

bash 复制代码
# 信任 Docker 的 GPG 公钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
 
# 写入软件源信息
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 docker-ce
apt update
apt install -y docker-ce docker-ce-cli containerd.io

# 创建 Docker 配置文件
mkdir -p /etc/docker

# 配置 Docker 使用 systemd 作为 cgroup 驱动
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn"
  ]
}
EOF

# 启动 Docker
systemctl enable docker
systemctl start docker

# 验证 Docker 安装
docker version

3、安装 cri-dockerd

bash 复制代码
# 下载
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.21/cri-dockerd_0.3.21.3-0.ubuntu-jammy_amd64.deb

# 安装
dpkg -i cri-dockerd_0.3.21.3-0.ubuntu-jammy_amd64.deb

# 新版本的 cri-dockerd 包通常会自动配置好 systemd 服务
systemctl status cri-docker.service

# 如果服务未运行或未启用,请手动启动
systemctl daemon-reload
systemctl enable cri-docker.service
systemctl enable --now cri-docker.socket

4、安装 Kubernetes

4.1、配置阿里云仓库进行安装

bash 复制代码
# 添加 Kubernetes GPG 密钥
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 添加 Kubernetes 仓库
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
# 安装 kubelet、kubeadm、kubectl
apt-get update
apt-get install -y kubelet kubeadm kubectl
# 锁定版本,防止被自动更新破坏
apt-mark hold kubelet kubeadm kubectl

4.2、配置 kubelet 使用 cri-dockerd

bash 复制代码
sudo tee /etc/default/kubelet <<-'EOF'
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock"
EOF
# 重启 kubelet
systemctl daemon-reload
systemctl restart kubelet

4.3、查看/下载所需的镜像

bash 复制代码
# 查看/下载所需的镜像
kubeadm config images list --kubernetes-version=v1.35.0 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
# 使用参数 --cri-socket 指定使用 cri-dockerd
kubeadm config images pull --kubernetes-version=v1.35.0 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --cri-socket unix:///var/run/cri-dockerd.sock

4.4、初始化 master

bash 复制代码
# 初始化集群时配置参数 --cri-socket 指定使用 cri-dockerd
kubeadm init --apiserver-advertise-address=172.16.15.105 --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version=v1.35.0 --service-cidr=10.96.0.0/16 --pod-network-cidr=10.244.0.0/16 --cri-socket unix:///var/run/cri-dockerd.sock

# 根据日志信息提示操作,执行下方命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf

4.5、部署 Calico 网络插件

bash 复制代码
# 安装 Calico
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.30.3/manifests/calico.yaml

4.6、创建测试 pod

bash 复制代码
# 测试运行 pod
kubectl run nginx-pod --image=nginx:latest --port=80
kubectl get pod
kubectl describe pod nginx-pod

# 报错:0/1 nodes are available: 1 node(s) had untolerated taint(s). no new claims to deallocate, preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.
# 原因:当前仅一个 master 节点,需要去掉污点/配置容忍才能调度

# 允许 Master 节点调度 Pod
kubectl taint nodes master node-role.kubernetes.io/control-plane-

4.7、工作节点

  • 工作节点部署同主节点类似,步骤 4.3 及以后无需执行,使用 "kubeadm join xxx" 命令加入主节点即可
  • 在 Worker 节点上执行 join 命令,同样需要加上 --cri-socket 参数
相关推荐
梁萌2 小时前
Jenkins自动化部署(docker)
docker·自动化·jenkins·流水线·cicd·smartadmin
勇气要爆发3 小时前
Kubernetes (K8S):云时代的“超级舵手”
云原生·容器·kubernetes
java_logo3 小时前
MinerU Docker 部署指南:PDF 结构化解析服务实践
docker·容器·pdf·mineru·mineru部署·mineru部署文档·mineru部署教程
大新新大浩浩3 小时前
ubuntu2204 + k8s 1.32.5 +GPU-Operator 24.9.2搭建GPU-k8s平台
云原生·容器·kubernetes
❀͜͡傀儡师3 小时前
Docker打造全能媒体中心Plex
docker·容器·媒体
懒鸟一枚3 小时前
k8s 之minikube安装看k8s
云原生·容器·kubernetes
qq_4557608516 小时前
docker - 镜像、存储卷和网络深入理解
运维·docker·容器
一只废狗狗狗狗狗狗狗狗狗17 小时前
基于docker desktop的hadoop集群结点启动失败问题
hadoop·docker·docker desktop
木童66218 小时前
Ruo-Yi 项目 CICD 完整部署文档(含命令详解)
ci/cd·docker·容器