1. 环境准备与规划
在Debian 12上部署Kubernetes集群前,合理的硬件规划和网络配置是成功的基础。我建议采用1个控制平面节点(Master)搭配2个工作节点(Worker)的架构,这种配置既能满足学习需求,也适合中小规模生产环境。
1.1 硬件需求建议
控制平面节点建议配置:
- 至少2核CPU(4核更佳)
- 4GB内存(8GB更佳)
- 50GB存储空间
- 稳定的网络连接
工作节点建议配置:
- 根据工作负载调整
- 基础学习环境可2核/4GB
- 生产环境建议4核/8GB起
重要提示:所有节点应位于同一局域网内,确保节点间延迟低于5ms。跨机房部署需要考虑额外的网络配置。
1.2 网络规划要点
-
节点IP分配:
- 为每个节点分配固定内网IP
- 建议使用192.168.1.0/24或10.0.0.0/16等私有地址段
- 通过
ip a命令确认网卡名称和IP地址
-
端口开放清单:
- 控制平面:6443(API Server)
- etcd:2379-2380
- Kubelet:10250
- 其他:10257(kube-controller-manager)、10259(kube-scheduler)
- NodePort服务范围:30000-32767
-
网络插件选择:
- Flannel:简单易用,适合初学者
- Calico:功能丰富,支持网络策略
- Cilium:基于eBPF,性能优异
2. 系统配置与优化
2.1 基础系统配置
所有节点需要执行以下配置步骤:
bash复制# 设置主机名(分别在各自节点执行)
hostnamectl set-hostname k8s-master # 在Master节点执行
hostnamectl set-hostname k8s-worker1 # 在Worker1执行
hostnamectl set-hostname k8s-worker2 # 在Worker2执行
# 配置/etc/hosts(所有节点相同配置)
cat >> /etc/hosts <<EOF
192.168.1.242 k8s-master
192.168.1.112 k8s-worker1
192.168.1.39 k8s-worker2
EOF
2.2 内核参数优化
Kubernetes对Linux内核有一些特殊要求,需要进行以下优化:
bash复制# 关闭Swap(临时+永久)
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 加载必要内核模块
cat > /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
# 配置网络参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
经验分享:在生产环境中,建议额外调整以下参数:
- vm.swappiness = 0
- vm.overcommit_memory = 1
- net.ipv4.tcp_tw_reuse = 1
3. 容器运行时安装与配置
3.1 Containerd安装
Containerd是Kubernetes推荐的容器运行时,安装步骤如下:
bash复制# 安装containerd
apt update
apt install -y containerd
# 生成默认配置
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# 修改关键配置
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 重启服务
systemctl restart containerd
systemctl enable containerd
3.2 配置镜像加速
对于国内用户,建议配置镜像加速:
bash复制# 编辑/etc/containerd/config.toml
# 在[plugins."io.containerd.grpc.v1.cri".registry.mirrors]下添加:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry-1.docker.io"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
endpoint = ["https://k8s.gcr.io"]
4. Kubernetes组件安装
4.1 添加Kubernetes仓库
bash复制# 安装必要工具
apt update
apt install -y curl gpg apt-transport-https
# 添加GPG密钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 添加软件源
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
4.2 安装Kubernetes组件
bash复制# 查看可用版本
apt update
apt-cache madison kubelet
# 安装指定版本(示例使用1.31.5)
apt install -y kubelet=1.31.5-1.1 kubeadm=1.31.5-1.1 kubectl=1.31.5-1.1
# 锁定版本防止意外升级
apt-mark hold kubelet kubeadm kubectl
# 启用kubelet
systemctl enable --now kubelet
版本选择建议:生产环境应使用稳定版本,而非最新版本。奇数版本(如1.31.x)是稳定版,偶数版本(如1.32.x)是开发版。
5. 集群初始化
5.1 准备初始化配置文件
在Master节点上创建kubeadm-init.yaml:
yaml复制apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.1.242 # Master节点IP
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
name: k8s-master
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.31.5
controlPlaneEndpoint: "192.168.1.242:6443"
networking:
podSubnet: "10.244.0.0/16" # Flannel默认网段
serviceSubnet: "10.96.0.0/12"
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
5.2 执行集群初始化
bash复制kubeadm init --config=kubeadm-init.yaml --upload-certs
初始化成功后,会输出加入集群的命令,类似:
bash复制kubeadm join 192.168.1.242:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
5.3 配置kubectl
bash复制mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
6. 网络插件安装
6.1 Flannel安装(简单方案)
bash复制kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
6.2 Calico安装(生产推荐)
bash复制curl https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml -O
kubectl apply -f calico.yaml
网络插件选择建议:
- 学习环境:Flannel简单易用
- 生产环境:Calico提供网络策略等高级功能
- 高性能需求:Cilium基于eBPF技术
7. 工作节点加入
在每个Worker节点上执行Master初始化时输出的join命令:
bash复制kubeadm join 192.168.1.242:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
如果忘记join命令,可以在Master节点上重新生成:
bash复制kubeadm token create --print-join-command
8. 集群验证与测试
8.1 基础状态检查
bash复制# 查看节点状态
kubectl get nodes
# 查看系统Pod状态
kubectl get pods -n kube-system
# 查看集群信息
kubectl cluster-info
8.2 部署测试应用
bash复制# 部署Nginx测试
kubectl create deployment nginx --image=nginx
# 暴露服务
kubectl expose deployment nginx --port=80 --type=NodePort
# 获取服务信息
kubectl get svc nginx
9. 常见问题排查
9.1 节点NotReady问题
可能原因及解决方案:
-
网络插件未正确安装
- 检查kube-system命名空间下的Pod状态
- 重新应用网络插件YAML
-
容器运行时问题
- 检查containerd状态:
systemctl status containerd - 查看日志:
journalctl -u containerd -f
- 检查containerd状态:
-
网络连接问题
- 检查节点间网络连通性
- 确认防火墙规则
9.2 Pod卡在Pending状态
排查步骤:
- 查看Pod详情:
kubectl describe pod <pod-name> - 检查资源配额:
kubectl describe nodes - 查看事件日志:
kubectl get events --sort-by=.metadata.creationTimestamp
9.3 镜像拉取失败
解决方案:
- 配置containerd镜像加速
- 手动拉取镜像:
crictl pull <image> - 检查代理配置
10. 生产环境优化建议
-
高可用控制平面:
- 部署多个Master节点
- 使用负载均衡器暴露API Server
-
节点自动扩展:
- 配置Cluster Autoscaler
- 设置合理的资源请求和限制
-
监控与日志:
- 部署Prometheus + Grafana
- 配置EFK日志系统
-
安全加固:
- 启用RBAC
- 配置Pod安全策略
- 定期轮换证书
-
备份策略:
- 定期备份etcd数据
- 备份关键资源定义
在实际部署过程中,我发现最常遇到的问题往往是网络配置不当导致的节点间通信问题。建议在正式部署前,先用简单的测试验证节点间的网络连通性。另外,版本兼容性也是需要特别注意的点,确保Kubernetes版本、容器运行时版本和网络插件版本相互兼容。