两个节点部署Kubernetes集群完整指南(个人测试环境)

两个节点部署Kubernetes集群完整指南(个人测试环境)

一、核心结论

对于个人测试环境,两个节点(1个控制平面节点+1个工作节点)的Kubernetes集群部署需遵循以下核心原则:
• 硬件配置:控制平面节点建议4核CPU、8GB内存、100GB SSD;工作节点建议4核CPU、16GB内存、200GB SSD(均为推荐配置,最低可降至2核4G,但可能影响性能)。

• 操作系统:优先选择Ubuntu 22.04 LTS(Kubernetes官方推荐,兼容性好,社区支持完善);若偏好CentOS生态,可选择CentOS Stream 9(需自行处理维护问题)。

• 部署工具:使用kubeadm(Kubernetes官方工具,流程标准化,适合快速搭建)。

• 网络插件:推荐Calico(支持网络策略,性能稳定)或Flannel(配置简单,适合新手)。

二、详细部署步骤

  1. 环境准备(所有节点执行)

目标:统一所有节点的系统配置,确保网络互通,禁用不必要的服务。

1.1 操作系统初始化

• 设置主机名(每台节点唯一):

控制平面节点(例如)

hostnamectl set-hostname k8s-master

工作节点(例如)

hostnamectl set-hostname k8s-worker

• 配置/etc/hosts(解析所有节点IP,避免DNS依赖):

在两台节点的/etc/hosts中添加:
192.168.1.10 k8s-master # 控制平面节点IP
192.168.1.11 k8s-worker # 工作节点IP

1.2 关闭不必要服务

• 关闭防火墙(Kubernetes需要节点间自由通信):

• Ubuntu:systemctl stop ufw && systemctl disable ufw

• CentOS:systemctl stop firewalld && systemctl disable firewalld

• 关闭SELinux(避免权限问题):

• Ubuntu:默认无SELinux,无需操作。

• CentOS:setenforce 0 && sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

• 禁用Swap(Kubernetes强制要求,避免性能波动):
swapoff -a # 临时关闭
sed -i '/swap/s/^/#/' /etc/fstab # 永久关闭(注释/etc/fstab中的swap行)

1.3 配置内核参数(网络依赖)

• 加载overlay(容器存储)和br_netfilter(桥接网络)模块:
modprobe overlay
modprobe br_netfilter

• 配置内核网络参数(允许iptables检查桥接流量):

创建/etc/sysctl.d/k8s.conf,添加:
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1

• 生效配置:sysctl --system

  1. 安装容器运行时(所有节点执行)

目标:安装Kubernetes支持的容器运行时(此处以containerd为例,官方推荐)。

• 安装containerd:

• Ubuntu:
apt update && apt install -y containerd

• CentOS:
yum install -y containerd

• 配置containerd(使用systemd作为Cgroup驱动,与Kubernetes兼容):

生成默认配置:containerd config default > /etc/containerd/config.toml
修改/etc/containerd/config.toml,将SystemdCgroup设置为true:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true

• 重启containerd:systemctl restart containerd && systemctl enable containerd

  1. 安装Kubernetes核心组件(所有节点执行)

目标:安装kubeadm(集群初始化工具)、kubelet(节点代理)、kubectl(命令行工具)。

• 添加Kubernetes仓库:

• Ubuntu:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list

• CentOS:

创建/etc/yum.repos.d/kubernetes.repo,添加:  
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

• 安装组件(指定版本,避免自动升级):

• Ubuntu:
apt update && apt install -y kubelet=1.29.10-00 kubeadm=1.29.10-00 kubectl=1.29.10-00
apt-mark hold kubelet kubeadm kubectl # 锁定版本,防止意外升级

• CentOS:
yum install -y kubelet-1.29.10 kubeadm-1.29.10 kubectl-1.29.10
systemctl enable kubelet && systemctl start kubelet # 启动kubelet

  1. 初始化控制平面节点(k8s-master执行)

目标:初始化Kubernetes控制平面(API Server、Controller Manager、Scheduler等组件)。

• 执行kubeadm init:

替换<MASTER_IP>为控制平面节点的实际IP(例如192.168.1.10),--pod-network-cidr指定Pod网络范围(需与后续网络插件一致):
kubeadm init
--kubernetes-version v1.29.10
--pod-network-cidr=10.244.0.0/16
--service-cidr=10.96.0.0/12
--apiserver-advertise-address=<MASTER_IP>

输出说明:
初始化成功后,会输出kubeadm join命令(用于工作节点加入集群),需保存该命令(例如:kubeadm join 192.168.1.10:6443 --token abcdef.1234567890abcdef --discovery-token-ca-cert-hash sha256:xxxxxx)。

• 配置kubectl(控制平面节点):

复制配置文件到用户目录,设置权限:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u)😒(id -g) $HOME/.kube/config

  1. 部署网络插件(控制平面节点执行)

目标:安装网络插件,实现Pod间通信(以Calico为例)。

• 安装Calico:

执行以下命令(会自动下载并应用Calico的YAML配置):
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

验证:等待几分钟后,执行kubectl get pods -n kube-system,确保calico-node Pod处于Running状态。

  1. 工作节点加入集群(k8s-worker执行)

目标:将工作节点加入已初始化的Kubernetes集群。

• 执行kubeadm join:

使用控制平面节点输出的kubeadm join命令(例如):
kubeadm join 192.168.1.10:6443 --token abcdef.1234567890abcdef --discovery-token-ca-cert-hash sha256:xxxxxx

验证:在控制平面节点执行kubectl get nodes,若工作节点状态为Ready,则表示加入成功。

  1. 验证集群状态(控制平面节点执行)

目标:确认集群所有组件正常运行。

• 检查节点状态:
kubectl get nodes

输出示例(两节点均Ready):

NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 10m v1.29.10
k8s-worker Ready 5m v1.29.10

• 检查Pod状态:
kubectl get pods -n kube-system

输出应包含calico-node(网络插件)、coredns(DNS服务)等Pod,且状态均为Running。

三、优化配置(可选)

目标:提升集群性能和稳定性(适合长期使用)。

• 资源预留(避免控制平面组件被Pod抢占资源):

修改/var/lib/kubelet/config.yaml,添加:
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
reservedSystemCPUs: "0-1" # 保留前2个CPU核心给系统和控制平面组件
systemReserved:
cpu: "500m"
memory: "512Mi"

重启kubelet:systemctl restart kubelet。

• 持久化存储(使用本地存储):

创建工作节点本地目录(例如/mnt/data),创建PersistentVolume(PV):
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
spec:
capacity:
storage: 100Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /mnt/data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-worker # 工作节点主机名

应用配置:kubectl apply -f pv.yaml。

四、常见问题排查

• 节点状态NotReady:

• 检查网络插件是否正常运行(kubectl get pods -n kube-system)。

• 检查kubelet状态(systemctl status kubelet),查看日志(journalctl -xeu kubelet)。

• Pod无法调度:

• 检查节点资源(kubectl describe node k8s-worker),确认CPU/内存是否充足。

• 检查污点(kubectl describe node k8s-master | grep Taints),若有NoSchedule污点,需移除(kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane:NoSchedule-)。

五、总结

通过以上步骤,你可以在个人测试环境中快速搭建一个双节点Kubernetes集群。该集群具备基本的容器编排能力,可用于测试微服务、CI/CD流水线等场景。若需扩展集群,只需重复工作节点加入步骤即可。

注意:个人测试环境无需追求高可用(如多控制平面节点),但生产环境需考虑3个控制平面节点+负载均衡的高可用架构。