找回密码
 立即注册
首页 业界区 业界 Debian 13基于kubeadm和containerd部署单节点kubernetes ...

Debian 13基于kubeadm和containerd部署单节点kubernetes

桂册 昨天 18:25
前言

在本地虚拟机环境中使用 kubeadm 搭建 Kubernetes 集群是学习和实验的理想选择。考虑到实际应用场景中可能存在的网络限制以及镜像构建需求,本文详细记录了在完全离线环境下部署单节点 Kubernetes 集群的完整过程。通过集成 Harbor 私有镜像仓库,所有 Kubernetes 组件镜像均从本地 Harbor 实例拉取,确保部署过程的可靠性和可重复性。
本指南适用于希望在受限网络环境中快速搭建 Kubernetes 实验环境的技术人员,涵盖了从系统初始化到 Cilium 网络插件配置的全流程。
环境和版本信息

基础环境配置


  • 操作系统:Debian 13 (代号 "Trixie")
  • 硬件规格:4 核 CPU / 4GB 内存 / 40GB 存储空间
  • 网络拓扑:单节点部署(Control Plane + Worker 合一)
软件版本清单

组件版本说明Kubernetesv1.33.7容器编排平台containerd2.2.1容器运行时runc1.4.0OCI 运行时规范实现CNI Plugins1.9.0容器网络接口插件Harborv2.14.2企业级容器镜像仓库Ciliumv1.18.6eBPF 驱动的网络和安全解决方案Helm3.19.5Kubernetes 包管理器网络规划

IP 地址主机名角色192.168.0.22deb13-k8s-node1Kubernetes 节点192.168.0.42deb13-harborHarbor 镜像仓库
注意:本文档假设两台主机位于同一内网环境中,且网络连通性已验证。
系统初始化

在开始 Kubernetes 组件安装之前,需要对系统进行必要的初始化配置,以满足 Kubernetes 的运行要求。
1. 安装 IPVS 相关工具包

IPVS(IP Virtual Server)是 Linux 内核的负载均衡实现,Kubernetes 在 IPVS 模式下运行 kube-proxy 时需要相关工具支持。
  1. # 仅在 Kubernetes 节点执行
  2. sudo apt update
  3. sudo apt install -y ipvsadm ipset
复制代码
2. 配置主机名

为便于管理和识别,建议为每台主机设置有意义的主机名。
  1. # Harbor 服务器
  2. hostnamectl set-hostname deb13-harbor
  3. # Kubernetes 节点
  4. hostnamectl set-hostname deb13-k8s-node1
复制代码
3. 配置本地 DNS 解析

编辑 /etc/hosts 文件,添加主机名与 IP 地址的映射关系:
  1. cat >> /etc/hosts << EOF
  2. 192.168.0.22 deb13-k8s-node1
  3. 192.168.0.42 deb13-harbor
  4. EOF
复制代码
关键配置修改:
  1. # 创建模块加载配置文件
  2. cat << EOF > /etc/modules-load.d/containerd.conf
  3. overlay
  4. br_netfilter
  5. EOF
  6. # 立即加载模块
  7. sudo modprobe overlay
  8. sudo modprobe br_netfilter
  9. # 验证模块加载状态
  10. lsmod | grep -E "(overlay|br_netfilter)"
复制代码
6. 配置 systemd 服务

从 官方仓库 获取 service 文件:
  1. cat > /etc/sysctl.d/k8s.conf << EOF
  2. net.ipv4.ip_forward=1
  3. net.bridge.bridge-nf-call-ip6tables = 1
  4. net.bridge.bridge-nf-call-iptables = 1
  5. vm.swappiness = 0
  6. EOF
  7. # 应用配置
  8. sudo sysctl --system
复制代码
7. 启动 containerd 服务
  1. sudo swapoff -a
  2. # 永久关闭需注释 /etc/fstab 中的 swap 相关行
复制代码
Kubernetes 组件部署

1. 安装 Kubernetes 二进制文件

从 Kubernetes GitHub Releases 下载 kubernetes-server-linux-amd64.tar.gz,提取核心组件:
  1. # 创建证书目录
  2. mkdir -p ~/apps/harbor/certs
  3. cd ~/apps/harbor/certs
  4. # 创建证书生成脚本
  5. cat > gen-harbor-crt.sh << 'EOF'
  6. #!/bin/bash
  7. # --- 配置参数 ---
  8. DOMAIN="deb13-harbor"       # Harbor 域名
  9. IP="192.168.0.42"           # Harbor 服务器内网 IP
  10. DAYS=3650                   # 有效期 10 年
  11. # 1. 生成私钥 (无密码)
  12. openssl genrsa -out harbor.key 2048
  13. # 2. 创建 OpenSSL 配置文件以包含 SAN
  14. cat > harbor.conf << CONF_EOF
  15. [req]
  16. distinguished_name = req_distinguished_name
  17. x509_extensions = v3_req
  18. prompt = no
  19. [req_distinguished_name]
  20. CN = ${DOMAIN}
  21. [v3_req]
  22. keyUsage = critical, digitalSignature, keyEncipherment
  23. extendedKeyUsage = serverAuth
  24. subjectAltName = @alt_names
  25. [alt_names]
  26. DNS.1 = ${DOMAIN}
  27. IP.1 = ${IP}
  28. CONF_EOF
  29. # 3. 生成自签名证书
  30. openssl req -x509 -nodes -days ${DAYS} -key harbor.key -out harbor.crt -config harbor.conf -extensions v3_req
  31. # 4. 验证证书(查看是否有 Subject Alternative Name 字段)
  32. echo "--------------------------------------------------"
  33. echo "证书信息验证:"
  34. openssl x509 -in harbor.crt -text -noout | grep -A 1 "Subject Alternative Name"
  35. echo "--------------------------------------------------"
  36. echo "生成成功!"
  37. echo "服务端使用: harbor.crt, harbor.key"
  38. echo "客户端 (K8s 节点) 使用: harbor.crt"
  39. EOF
  40. # 执行证书生成
  41. chmod +x gen-harbor-crt.sh
  42. ./gen-harbor-crt.sh
复制代码
将列出的所有镜像(包括 pause、coredns、etcd 等)从官方源拉取后重新打标签并推送到 Harbor 的 google_containers 项目中。
2. 配置 kubelet systemd 服务

创建主服务文件 /usr/lib/systemd/system/kubelet.service:
  1. # 复制配置模板
  2. cp harbor.yml.tmpl harbor.yml
  3. # 修改关键配置项
复制代码
3. 创建 kubeadm 配置目录
  1. # Harbor 访问地址
  2. hostname: 192.168.0.42
  3. # HTTPS 配置
  4. https:
  5.   port: 443
  6.   certificate: /home/rainux/apps/harbor/certs/harbor.crt
  7.   private_key: /home/rainux/apps/harbor/certs/harbor.key
  8. # 管理员密码(请设置强密码)
  9. harbor_admin_password: your-harbor-password
  10. # 数据库密码
  11. database:
  12.   password: your-db-password
  13. # 数据存储路径
  14. data_volume: /home/rainux/apps/harbor/data
  15. # 日志配置
  16. log:
  17.   location: /home/rainux/apps/harbor/logs
  18. # 启用指标监控
  19. metric:
  20.   enabled: true
  21.   port: 9090
  22.   path: /metrics
复制代码
4. 配置 kubeadm drop-in 文件

创建 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf:
  1. cd ~/apps/harbor
  2. sudo ./install.sh
复制代码
5. 启动 kubelet 服务
  1. sudo ./prepare
  2. docker-compose down -v
  3. sudo docker-compose up -d
复制代码
集群初始化

1. 创建 kubeadm 配置文件

创建 kubeadm-config.yaml 配置文件:
  1. # 注意:原文中的文件名可能存在笔误,应为 runc.amd64
  2. chmod +x runc.amd64
  3. sudo mv runc.amd64 /usr/local/bin/runc
复制代码
2. 执行集群初始化
  1. sudo mkdir -p /opt/cni/bin/
  2. sudo tar xf cni-plugins-linux-amd64-v1.9.0.tgz -C /opt/cni/bin/
复制代码
3. 清理 kube-proxy(使用 Cilium 替代)

由于我们将使用 Cilium 作为网络解决方案,可以移除 kube-proxy:
  1. sudo tar xf containerd-2.2.1-linux-amd64.tar.gz
  2. sudo mv bin/* /usr/local/bin/
复制代码
4. 验证初始化状态

初始化完成后,配置 kubectl 并检查集群状态:
  1. # 创建 Harbor 证书目录
  2. sudo mkdir -p /etc/containerd/certs.d/192.168.0.42/
  3. # 生成默认配置
  4. sudo containerd config default > /etc/containerd/config.toml
  5. # 复制 Harbor 证书
  6. sudo cp ~/apps/harbor/certs/harbor.crt /etc/containerd/certs.d/192.168.0.42/ca.crt
复制代码
Cilium 网络插件部署

Cilium 基于 eBPF 技术提供高性能的网络、安全和可观测性功能。
1. 安装 cilium-cli

从 Cilium CLI Releases 下载并安装命令行工具。
2. 准备 Cilium 镜像

将 Cilium 所需的镜像推送到 Harbor 仓库:
  1. # 设置 Pod 沙箱镜像源
  2. [plugins.'io.containerd.cri.v1.images'.pinned_images]
  3.   sandbox = '192.168.0.42/google_containers/pause:3.10'
  4. # 配置私有镜像仓库
  5. [plugins.'io.containerd.cri.v1.images'.registry]
  6.   config_path = '/etc/containerd/certs.d'
  7. # 启用 systemd cgroup 驱动
  8. [plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options]
  9.   SystemdCgroup = true
复制代码
3. 获取 Helm Chart
  1. sudo curl -o /usr/lib/systemd/system/containerd.service https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
复制代码
4. 配置 Chart Values

首先替换所有镜像源地址:
  1. sudo systemctl daemon-reload
  2. sudo systemctl enable --now containerd
复制代码
关键配置项调整:
  1. # 解压并安装核心组件
  2. tar xf kubernetes-server-linux-amd64.tar.gz
  3. sudo cp kubernetes/server/bin/{kubeadm,kubelet,kubectl} /usr/local/bin/
  4. # 验证所需镜像列表
  5. kubeadm config images list --kubernetes-version v1.33.7
复制代码
镜像 Digest 注意事项:通过 docker pull 再 push 的方式可能导致镜像 digest 发生变化。如遇镜像拉取失败,可将 values.yaml 中的 useDigest 设置为 false。
5. 安装 Cilium
  1. [Unit]
  2. Description=kubelet: The Kubernetes Node Agent
  3. Documentation=https://kubernetes.io/docs/
  4. Wants=network-online.target
  5. After=network-online.target
  6. [Service]
  7. ExecStart=/usr/local/bin/kubelet
  8. Restart=always
  9. StartLimitInterval=0
  10. RestartSec=10
  11. [Install]
  12. WantedBy=multi-user.target
复制代码
6. 验证集群状态

等待所有 Pod 正常运行后,验证集群就绪状态:
  1. sudo mkdir -p /usr/lib/systemd/system/kubelet.service.d/
复制代码
添加工作节点(扩展部署)

完成单节点集群部署后,如需扩展为多节点集群,可在新节点上执行以下步骤:
在新节点上需要先完成上面的系统初始化、Containerd配置、kube组件配置
1. 生成节点加入令牌

在 Control Plane 节点上生成 24 小时有效的加入令牌:
  1. # Note: This dropin only works with kubeadm and kubelet v1.11+
  2. [Service]
  3. Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
  4. Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
  5. # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
  6. EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
  7. # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
  8. # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
  9. EnvironmentFile=-/etc/sysconfig/kubelet
  10. ExecStart=
  11. ExecStart=/usr/local/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
复制代码
该命令将输出类似以下格式的加入命令:
  1. sudo systemctl daemon-reload
  2. sudo systemctl enable --now kubelet
复制代码
2. 在新节点执行加入命令

在新节点上执行上述命令,并忽略镜像预检错误:
  1. apiVersion: kubeadm.k8s.io/v1beta4
  2. kind: ClusterConfiguration
  3. kubernetesVersion: v1.33.7
  4. imageRepository: 192.168.0.42/google_containers  # 指向本地 Harbor 仓库
  5. networking:
  6.   podSubnet: "10.10.0.0/16"   # Cilium 默认 Pod 网段
  7.   serviceSubnet: "10.96.0.0/12"
  8. ---
  9. apiVersion: kubelet.config.k8s.io/v1beta1
  10. kind: KubeletConfiguration
  11. cgroupDriver: systemd
  12. imageGCHighThresholdPercent: 70   # 磁盘使用率超过 70% 时开始清理镜像
  13. imageGCLowThresholdPercent: 60    # 清理至磁盘使用率 60% 时停止
  14. ---
  15. apiVersion: kubeproxy.config.k8s.io/v1alpha1
  16. kind: KubeProxyConfiguration
  17. mode: "ipvs"  # 虽然后续会使用 Cilium 替代 kube-proxy,但初始化阶段仍需配置
复制代码
3. 验证节点加入状态
  1. sudo kubeadm init --config kubeadm-config.yaml --ignore-preflight-errors=ImagePull
复制代码
Cilium 会自动在新节点上部署代理 Pod,确保网络连通性。
私有镜像仓库认证配置

对于 Harbor 中非公开项目的镜像拉取,需要配置相应的认证机制。
方式一:Pod 级别 imagePullSecrets(推荐)

适用于需要精细化控制镜像拉取权限的场景。
1. 创建 Docker Registry Secret
  1. # 删除 kube-proxy DaemonSet
  2. kubectl delete ds kube-proxy -n kube-system
  3. # 在所有节点清理 iptables 规则残留
  4. sudo kube-proxy --cleanup
复制代码
2. 在 Pod 定义中引用 Secret
  1. # 配置 kubectl
  2. mkdir -p $HOME/.kube
  3. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  4. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  5. # 检查节点状态(此时应显示 NotReady,因为 CNI 尚未安装)
  6. kubectl get nodes
  7. kubectl get namespaces
复制代码
方式二:ServiceAccount 绑定(便捷方案)

适用于命名空间内所有 Pod 都需要访问私有镜像仓库的场景。
  1. #!/bin/bash
  2. set -euo pipefail
  3. images=(
  4.     cilium/cilium:v1.18.6
  5.     cilium/hubble-relay:v1.18.6
  6.     cilium/hubble-ui-backend:v0.13.3
  7.     cilium/hubble-ui:v0.13.3
  8.     cilium/cilium-envoy:v1.35.9-1767794330-db497dd19e346b39d81d7b5c0dedf6c812bcc5c9
  9.     cilium/certgen:v0.3.1
  10.     cilium/startup-script:1755531540-60ee83e
  11. )
  12. src_registry="quay.io"
  13. target_registry="192.168.0.42"
  14. for image in "${images[@]}"; do
  15.     echo "Processing image: ${image}"
  16.     docker pull "${src_registry}/${image}"
  17.     docker tag "${src_registry}/${image}" "${target_registry}/${image}"
  18.     docker push "${target_registry}/${image}"
  19. done
复制代码
此配置将使该命名空间下所有新建的 Pod 自动继承镜像拉取权限。
方式三:Containerd 全局认证(实验环境适用)

在 Containerd 层面配置全局认证,适用于个人实验环境。
编辑 /etc/containerd/config.toml:
  1. helm repo add cilium https://helm.cilium.io/
  2. helm pull cilium/cilium --version 1.18.6
  3. tar xf cilium-1.18.6.tgz
  4. mv cilium cilium-chart
复制代码
安全提醒:方式三将凭据明文存储在配置文件中,不建议在生产环境中使用。
补充

相较于使用二进制方式部署,用kubeadm起码省去了手动维护证书的操作,后续添加节点也更简单些。有空整个ansible让添加节点更方便。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册