Kubernetes 1.29 零线网环境 kubeadm + Docker 部署步骤 部分一:联网环境下的准备操作 一、环境设置 1. 主机配置 例:
Master IP: 192.168.0.10
Node1 IP: 192.168.0.11
私有 Docker Registry: 192.168.0.100:5000
2. 版本信息
Kubernetes: v1.29.0
Docker 作为 container runtime(需配合额外组件 cri-dockerd)
二、网络环境下操作 1. 使用 yum 下载 kubeadm、kubelet、kubectl 到指定位置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 sudo mkdir -p /data/k8s-rpmssudo cp /etc/yum.repos.d /data/k8s-rpms/ -rcat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/ enabled=1 gpgcheck=1 gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni EOF sudo yum install --downloadonly --downloaddir=/data/k8s-rpms kubelet kubeadm kubectl --disableexcludes=kubernetes
2. 下载 Docker 和 cri-dockerd RPM 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 yum install -y yum-utils --downloadonly --downloaddir=./docker_rpms yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yumdownloader --resolve --destdir=./docker_rpms docker-ce docker-ce-cli containerd.io wget https://github.com/containernetworking/plugins/releases/download/v1.4.0/cni-plugins-linux-amd64-v1.4.0.tgz tar -czvf docker_rpms.tar.gz ./docker_rpms
3. 参照下面的安装步骤先安装docker和kubeadm 1 2 docker pull registry:2 docker save -o registry.tar registry:2
4. 下载 Kubernetes 所需镜像 1 kubeadm config images list --kubernetes-version=v1.29.0
镜像清单:
1 2 3 4 5 6 7 registry.k8s.io/kube-apiserver:v1.29.0 registry.k8s.io/kube-controller-manager:v1.29.0 registry.k8s.io/kube-scheduler:v1.29.0 registry.k8s.io/kube-proxy:v1.29.0 registry.k8s.io/pause:3.9 registry.k8s.io/etcd:3.5.9-0 registry.k8s.io/coredns/coredns:v1.11.1
5. 下载镜像并推送到私有仓库 生成脚本 images-download-push.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #!/bin/bash REGISTRY=192.168.0.100:5000 K8S_VERSION=v1.29.0 IMAGES=( kube-apiserver:$K8S_VERSION kube-controller-manager:$K8S_VERSION kube-scheduler:$K8S_VERSION kube-proxy:$K8S_VERSION pause:3.9 etcd:3.5.9-0 coredns/coredns:v1.11.1 ) mkdir -p ./imagesfor image in ${IMAGES[@]} ; do docker pull registry.k8s.io/$image local_image=$REGISTRY /$(basename $image ) docker tag registry.k8s.io/$image $local_image docker save -o ./images/$(basename $image ).tar $local_image done
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 cd ../imagesfor img in $(kubeadm config images list); do filename=$(echo "$img " | sed 's/\//_/g' | sed 's/:/_/g' ) echo "拉取镜像: $img " docker pull "$img " echo "保存镜像到: ./$filename .tar" docker save -o "./$filename .tar" "$img " done echo "所有镜像处理完成。"
6. 下载 Flannel 网络插件 1 2 3 4 5 6 7 8 9 cd ../manifestswget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml sed -i 's|quay.io/coreos/flannel|192.168.0.10:5000/flannel|g' docker pull flannel/flannel:v0.24.2 docker tag flannel/flannel:v0.24.2 192.168.10.11:5000/flannel:v0.24.2 docker save -o flannel.tar 192.168.10.11:5000/flannel:v0.24.2
7. 打包离线安装包 1 2 3 4 5 6 7 8 9 10 11 12 13 k8s-offline-package/ ├── rpms/ │ ├── kubeadm-*.rpm │ ├── kubelet-*.rpm │ ├── kubectl-*.rpm │ ├── docker*.rpm │ └── cri-dockerd*.rpm ├── images/ │ ├── kube-apiserver.tar │ ├── ... ├── kubeadm-config.yaml ├── kube-flannel.yml ├── install-guide.txt
部分二:离线环境下的部署步骤 一、基础环境配置 1. 关闭 swap/selinux/firewalld 1 2 3 sudo swapoff -a && sudo sed -i '/swap/d' /etc/fstabsudo setenforce 0 && sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/configsudo systemctl disable firewalld --now
2. 添加内核参数 1 2 3 4 5 6 7 8 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sudo modprobe br_netfiltersudo sysctl --system
3. 设置主机名 1 2 3 4 5 6 7 8 cat >> /etc/hosts <<EOF 192.168.0.10 k8s-master 192.168.0.11 k8s-node1 192.168.0.12 k8s-node2 EOF hostnamectl set-hostname k8s-master
二、安装 Docker 和 cri-dockerd 1 2 3 4 5 6 7 8 9 10 cd rpms && sudo rpm -ivh docker*.rpmsudo systemctl enable docker --nowcat <<EOF | sudo tee /etc/docker/daemon.json { "insecure-registries": ["192.168.0.100:5000"] } EOF sudo systemctl restart docker
记得创建docker用户组
1. 创建 docker 用户组(如果还没有)
如果提示 “group already exists”,说明该组已经存在,可以跳过这一步。
2. 将当前用户加入 docker 组 1 sudo usermod -aG docker $USER
$USER 是当前用户名的环境变量。你也可以直接替换为具体用户名,如:
1 sudo usermod -aG docker kaixinbu
3. 重新登录或刷新组成员身份 要使组变更生效,有两种方式:
登出并重新登录系统(推荐)
或使用以下命令刷新当前 shell 的组信息:
4. 验证是否生效
或者:
如果没有 permission denied,说明配置成功,可以正常使用 Docker 命令。
❗ 补充说明
默认情况下,Docker 守护进程(dockerd)是以 root 身份运行的;非 root 用户如果想访问 Docker socket(通常是 /var/run/docker.sock),就必须加入 docker 用户组。
使用 docker 组等同于拥有 root 权限,请谨慎授予该组权限。
创建私有 Docker Registry 1 2 docker run -d -p 5000:5000 --restart=always --name registry \ -v /opt/registry:/var/lib/registry registry:2
配置各节点信任 Registry 在所有节点 /etc/docker/daemon.json:
1 { "insecure-registries" : ["192.168.0.10:5000" ] }
然后重启:
1 2 systemctl daemon-reexec systemctl restart docker
安装cri-dockerd
1 2 3 4 5 sudo rpm -ivh cri-dockerd*.rpmsudo systemctl daemon-reexecsudo systemctl daemon-reloadsudo systemctl enable cri-docker --now
方式二 使用二进制压缩包安装,将cri-docker 放到/usr/bin/下,配置cri-docker.service和cri-docker.socket 先启动socket,
1 /usr/bin/cri-dockerd --pod-infra-container-image=10.x.x.x:5000/pause:3.9 --container-runtime-endpoint fd://
注意:指定私有仓库的时候要在配置文件中指定, cri-dockerd 中 pause 镜像版本硬编码
1 2 3 4 const ( defaultPodSandboxImageName = "registry.k8s.io/pause" defaultPodSandboxImageVersion = "3.10" )
https://github.com/Mirantis/cri-dockerd/issues/97 https://docs.k0sproject.io/v1.32.1+k0s.0/runtime/
后面使用kubelet 遇到拉取默认pause,则创建/etc/cri-dockerd/config.toml
1 sandbox_image = "10.x.x.x:5000/pause:3.9"
三、安装 kubeadm/kubelet/kubectl 1 2 cd rpms && sudo rpm -ivh kubelet-*.rpm kubeadm-*.rpm kubectl-*.rpmsudo systemctl enable kubelet
四、导入镜像 1 2 cd imagesfor img in *.tar; do sudo docker load -i $img ; done
可以让ai批量生成修改成自己当前注册地址并上传
五、初始化 Master 1. 配置 kubeadm 模板 kubeadm-config.yaml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168 .0 .10 bindPort: 6443 nodeRegistration: criSocket: unix:///var/run/cri-dockerd.sock --- apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: v1.29.0 imageRepository: 192.168 .0 .100 :5000 networking: podSubnet: 10.244 .0 .0 /16 serviceSubnet: 10.96 .0 .0 /12 --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: iptables
2. 初始化 1 sudo kubeadm init --config kubeadm-config.yaml --upload-certs
3. 配置 kubectl 用户 1 2 3 mkdir -p $HOME /.kubesudo cp /etc/kubernetes/admin.conf $HOME /.kube/configsudo chown $(id -u):$(id -g) $HOME /.kube/config
六、部署 Flannel 网络 1 kubectl apply -f kube-flannel.yml
七、Node 节点加入 在 Node 节点执行 Master 初始化时输出的 join 指令:
1 2 3 sudo kubeadm join 192.168.0.10:6443 --token xxx \ --discovery-token-ca-cert-hash sha256:xxxx \ --cri-socket unix:///var/run/cri-dockerd.sock
确保每个节点都导入了需要镜像,且 docker 配置了信任私有仓库,同时已安装并启动 cri-dockerd
八、校验状态 1 2 kubectl get nodes kubectl get pods -A
注意事项
Kubernetes 1.24+ 开始弃用 Dockershim,1.29 如继续使用 Docker 需安装 cri-dockerd。
私有 registry 必须是可访问的 IP + 端口。
Docker 必须配置 insecure-registries。
镜像名称必须和 kubeadm 配置一致。
如果不想使用私有仓库,需把镜像 tag 成 registry.k8s.io/格式名称。
如使用非 root 用户安装:
必须具有 sudo 权限,确保能安装软件包、配置 systemd 和访问 /etc 等目录。
.kube/config 拷贝后需执行 chown,确保普通用户能使用 kubectl。
建议用 sudo tee 和 sudo systemctl 替代直接写入配置或启用服务命令。