- 创建特权容器:
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
- 容器内执行:
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
- 初始化集群:
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
- 部署网络插件:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 单节点解除调度限制:
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
验证:
kubectl get nodes
显示 Ready 状态即完成部署。
如何在Docker容器内使用kubeadm安装Kubernetes(k8s)集群?
在Docker容器内使用kubeadm部署Kubernetes集群的实践经验及挑战如下:
一、核心步骤
- 容器配置:使用
docker run --privileged
启动容器,挂载/sys/fs/cgroup
和/var/lib/kubelet
,建议选择Ubuntu 20.04或CentOS 7基础镜像 - 环境准备:
- 禁用swap:
swapoff -a && sed -i '/swap/d' /etc/fstab
- 设置cgroup驱动:在/etc/docker/daemon.json配置
"exec-opts": ["native.cgroupdriver=systemd"]
- 加载内核模块:modprobe overlay br_netfilter
- 禁用swap:
- 组件安装:
- 安装containerd并配置cgroup驱动
- 通过apt/yum安装指定版本的kubeadm/kubelet/kubectl(需严格对齐版本)
- 集群初始化:
kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=$(hostname -i)
- 网络部署:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
二、关键挑战
- 容器嵌套问题:
- 必须使用特权模式解决DeviceMapper权限问题
- 容器内systemd需通过
/sbin/init
启动(需基础镜像集成systemd)
- Cgroup配置冲突:
- 出现"detected cgroupfs as cgroup driver"警告时,需修改kubelet配置匹配容器运行时
- 网络隔离:
- 容器内kube-proxy与宿主机iptables规则冲突,需配置--node-ip参数
- 存储持久化:
- etcd数据需挂载volume防止容器重启丢失
- 资源限制:
- 至少分配4核CPU/8GB内存,否则controller-manager会出现OOM
三、优化方案
- 采用kind项目容器化方案替代原生部署
- 使用kubeadm config生成定制化配置文件
- 预加载镜像:
kubeadm config images pull
避免超时 - 日志收集:
journalctl -u kubelet -f -n 100
实时监控组件状态
注:该方案仅适用于开发测试环境,生产环境需考虑容器逃逸等安全隐患。
在Docker容器内直接使用kubeadm安装Kubernetes集群存在显著技术挑战且非标准实践。原因包括:1.容器隔离性导致kubelet等系统服务无法正常启动;2.容器内缺乏systemd等初始化系统;3.网络命名空间冲突;4.存储卷挂载复杂度高。建议采用以下替代方案:1.使用KIND(Kubernetes in Docker)工具实现容器化集群;2.在特权容器中预装systemd并手动配置kubelet;3.通过K3s轻量化方案部署。若坚持原生kubeadm,需容器配置--privileged、挂载/var/lib/kubelet等目录,但会引入安全隐患且维护成本极高,不建议生产环境使用。
在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方案。