如何在Docker容器内使用kubeadm安装Kubernetes(k8s)集群?

问题浏览数Icon
19
问题创建时间Icon
2025-05-28 15:00:00
回答 | 共 4 个
作者头像
shuiliang33
  1. 创建特权容器:
    docker run -it --privileged --name k8s-node -v /sys/fs/cgroup:/sys/fs/cgroup:ro --tmpfs /run --tmpfs /run/lock ubuntu:20.04 /bin/bash
  2. 容器内执行:
    apt update && apt install -y apt-transport-https curl
    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
    echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
    apt update && apt install -y kubelet kubeadm kubectl
    swapoff -a && sed -i '/swap/d' /etc/fstab
  3. 初始化集群:
    kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=all
    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  4. 部署网络插件:
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  5. 单节点解除调度限制:
    kubectl taint nodes --all node-role.kubernetes.io/control-plane-

    验证:kubectl get nodes 显示 Ready 状态即完成部署。

作者头像
baojian88

在Docker容器内使用kubeadm部署Kubernetes集群的实践经验及挑战如下:

一、核心步骤

  1. 容器配置:使用docker run --privileged启动容器,挂载/sys/fs/cgroup/var/lib/kubelet,建议选择Ubuntu 20.04或CentOS 7基础镜像
  2. 环境准备:
    • 禁用swap:swapoff -a && sed -i '/swap/d' /etc/fstab
    • 设置cgroup驱动:在/etc/docker/daemon.json配置"exec-opts": ["native.cgroupdriver=systemd"]
    • 加载内核模块:modprobe overlay br_netfilter
  3. 组件安装:
    • 安装containerd并配置cgroup驱动
    • 通过apt/yum安装指定版本的kubeadm/kubelet/kubectl(需严格对齐版本)
  4. 集群初始化: kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=$(hostname -i)
  5. 网络部署: kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

二、关键挑战

  1. 容器嵌套问题:
    • 必须使用特权模式解决DeviceMapper权限问题
    • 容器内systemd需通过/sbin/init启动(需基础镜像集成systemd)
  2. Cgroup配置冲突:
    • 出现"detected cgroupfs as cgroup driver"警告时,需修改kubelet配置匹配容器运行时
  3. 网络隔离:
    • 容器内kube-proxy与宿主机iptables规则冲突,需配置--node-ip参数
  4. 存储持久化:
    • etcd数据需挂载volume防止容器重启丢失
  5. 资源限制:
    • 至少分配4核CPU/8GB内存,否则controller-manager会出现OOM

三、优化方案

  1. 采用kind项目容器化方案替代原生部署
  2. 使用kubeadm config生成定制化配置文件
  3. 预加载镜像:kubeadm config images pull避免超时
  4. 日志收集: journalctl -u kubelet -f -n 100实时监控组件状态

注:该方案仅适用于开发测试环境,生产环境需考虑容器逃逸等安全隐患。

作者头像
cloudlong99

在Docker容器内直接使用kubeadm安装Kubernetes集群存在显著技术挑战且非标准实践。原因包括:1.容器隔离性导致kubelet等系统服务无法正常启动;2.容器内缺乏systemd等初始化系统;3.网络命名空间冲突;4.存储卷挂载复杂度高。建议采用以下替代方案:1.使用KIND(Kubernetes in Docker)工具实现容器化集群;2.在特权容器中预装systemd并手动配置kubelet;3.通过K3s轻量化方案部署。若坚持原生kubeadm,需容器配置--privileged、挂载/var/lib/kubelet等目录,但会引入安全隐患且维护成本极高,不建议生产环境使用。

作者头像
vmstar01

在Docker容器内使用kubeadm安装Kubernetes集群需谨慎,因其非标准场景且存在环境隔离挑战。核心步骤如下:1. 使用特权模式启动容器(--privileged),关闭swap并加载内核模块(如overlay、br_netfilter);2. 安装kubeadm/kubelet/kubectl,配置cgroup驱动与宿主机一致;3. 初始化集群时指定--cri-socket=unix:///var/run/containerd/containerd.sock(若使用containerd);4. 部署CNI插件(如Calico)解决容器间通信;5. 暴露6443端口实现节点加入。但需注意:容器内kubelet可能因权限不足导致异常,建议优先考虑基于System容器或直接宿主机部署。生产环境推荐使用Kubeadm的官方部署方式,容器化场景可评估Kind或K3s方案。