Debian上Kubernetes网络配置指南
在Debian系统上配置Kubernetes网络需完成基础环境准备、集群初始化、网络插件部署及验证等关键步骤,以下是详细流程:
Kubelet要求节点关闭swap,否则无法正常运行。执行以下命令:
sudo swapoff -a # 临时关闭swap
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 永久禁用swap(注释fstab中的swap行)
编辑/etc/network/interfaces(Debian传统方式)或使用Netplan(Debian 10+推荐)设置静态IP(集群节点需固定IP):
auto eth0
iface eth0 inet static
address 192.168.1.100 # 节点IP
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 8.8.8.8 8.8.4.4
/etc/netplan/01-netcfg.yaml:network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
addresses: [192.168.1.100/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
应用配置:sudo netplan applyKubernetes推荐使用containerd作为容器运行时。执行以下命令:
sudo apt update
sudo apt install -y containerd
# 加载必要内核模块
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 配置sysctl参数(允许桥接流量)
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system
# 启动并启用containerd
sudo systemctl enable --now containerd
导入GPG密钥并添加Kubernetes APT源:
sudo apt update
sudo apt install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
安装kubelet、kubeadm、kubectl并锁定版本(避免自动升级):
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl # 锁定版本
在主节点上执行kubeadm init命令,指定集群参数(如API服务器地址、Pod网络CIDR):
sudo kubeadm init \
--apiserver-advertise-address=192.168.1.100 \ # 主节点IP
--pod-network-cidr=10.244.0.0/16 \ # Pod网络CIDR(需与网络插件匹配)
--service-cidr=10.96.0.0/12 \ # Service网络CIDR(默认)
--image-repository registry.aliyuncs.com/google_containers \ # 国内镜像加速
--kubernetes-version v1.28.0 # 指定Kubernetes版本
初始化完成后,会输出kubeadm join命令(用于工作节点加入集群),请妥善保存。
将主节点的admin.conf复制到当前用户的.kube目录,用于管理集群:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Kubernetes需要网络插件实现Pod间通信,常见插件及部署步骤如下:
Flannel通过VXLAN技术实现跨节点Pod通信,适合小型集群:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
验证插件状态:
kubectl get pods -n kube-system # 查看flannel相关Pod是否处于Running状态
Calico提供更丰富的网络功能(如网络策略、BGP路由),适合生产环境:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
若需调整配置(如启用IP-in-IP模式),可修改Calico的ConfigMap:
kubectl edit cm -n calico-system calico-config
Weave Net无需额外配置,自动发现节点:
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
检查节点状态:
kubectl get nodes
所有节点应处于Ready状态。
测试Pod网络连通性: 创建测试Pod并访问外部网络:
kubectl run nginx --image=nginx --restart=Never --rm -it -- /bin/sh
# 在Pod内执行
apk add --no-cache curl # Debian基础镜像可能无curl,需安装
curl http://www.google.com # 验证是否能访问外部网络
测试Pod间通信: 创建两个Pod并互相访问:
kubectl run pod1 --image=busybox --restart=Never -- /bin/sh -c "while true; do sleep 3600; done"
kubectl run pod2 --image=busybox --restart=Never -- /bin/sh -c "while true; do sleep 3600; done"
# 获取Pod IP
POD1_IP=$(kubectl get pod pod1 -o jsonpath='{.status.podIP}')
POD2_IP=$(kubectl get pod pod2 -o jsonpath='{.status.podIP}')
# 在pod1中ping pod2
kubectl exec -it pod1 -- ping $POD2_IP
若系统启用了ufw(Uncomplicated Firewall),需允许Kubernetes相关端口:
sudo ufw allow 6443/tcp # Kubernetes API服务器
sudo ufw allow 10250/tcp # kubelet API
sudo ufw allow 10255/tcp # kubelet只读API
sudo ufw allow 2379:2380/tcp # etcd集群通信
sudo ufw allow 179/tcp # Calico BGP(若使用Calico)
sudo ufw allow 4789/udp # Calico VXLAN
sudo ufw reload
通过以上步骤,即可在Debian系统上完成Kubernetes网络配置。需根据实际需求选择网络插件,并参考插件官方文档调整高级配置(如Calico的BGP、Flannel的性能优化)。