Ubuntu上Kubernetes網絡配置實現指南
在Ubuntu上配置Kubernetes網絡需完成基礎集群部署、網絡插件安裝、網絡策略配置及連通性驗證四大核心步驟,以下是詳細操作流程:
更新系統包
執行sudo apt update && sudo apt upgrade -y
,確保系統軟件包為最新版本。
安裝Docker容器運行時
Kubernetes依賴容器運行時,推薦使用Docker(也可選擇containerd):
sudo apt install -y docker.io
sudo systemctl enable --now docker # 啟用并啟動Docker服務
安裝Kubernetes核心組件
添加Kubernetes官方APT倉庫并安裝kubeadm
(集群初始化工具)、kubelet
(節點代理)、kubectl
(命令行工具):
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
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl # 鎖定組件版本,避免意外升級
初始化集群
使用kubeadm
初始化Master節點,必須指定--pod-network-cidr
參數(與后續網絡插件的Pod網段一致,常見值為10.244.0.0/16
或192.168.0.0/16
):
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
初始化完成后,會輸出kubeadm join
命令(用于Worker節點加入集群),請妥善保存。
配置kubectl
將集群管理員配置復制到用戶目錄,使當前用戶具備集群操作權限:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
驗證Master節點狀態
執行kubectl get nodes
,此時Master節點應處于NotReady
狀態(需等待網絡插件部署后變為Ready
)。
Kubernetes需通過網絡插件實現Pod跨節點通信,以下是主流插件的安裝指南:
Calico是基于BGP的三層網絡插件,適用于中大規模生產環境,支持精細的Pod網絡策略控制。
curl -O https://docs.projectcalico.org/v3.26/manifests/calico.yaml
(可選)修改Pod網段:若集群Pod網段非默認的192.168.0.0/16
,需編輯calico.yaml
,搜索CALICO_IPV4POOL_CIDR
并修改為集群實際網段(如10.244.0.0/16
)。kubectl apply -f calico.yaml
kubectl get pods -n calico-system
,所有Pod應為Running
狀態。Flannel是入門級網絡插件,配置簡單,適合中小規模集群或開發測試環境,采用Overlay網絡(VXLAN/Host-GW)實現通信。
curl -O https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml
(可選)切換為Host-GW后端(提升同局域網性能):編輯kube-flannel.yml
,搜索net-conf.json
,將Backend.Type
從vxlan
改為host-gw
。kubectl apply -f kube-flannel.yml
kubectl get pods -n kube-flannel
,所有Pod應為Running
狀態。Cilium基于eBPF技術,提供極致網絡性能(如百萬級Pod并發),支持高級安全策略(如L7流量過濾),適合大規?;蚋咝阅軋鼍埃ㄈ绺哳l交易、大流量電商)。
rp_filter
(避免eBPF流量被攔截):echo "net.ipv4.conf.all.rp_filter=0" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.conf.default.rp_filter=0" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
添加Cilium Helm倉庫并更新:helm repo add cilium https://helm.cilium.io/
helm repo update
部署Cilium組件:helm install cilium cilium/cilium --namespace kube-system \
--set k8sServiceHost=<K8S_API_SERVER_IP> \ # 替換為集群API Server IP
--set k8sServicePort=6443 # 默認6443
kubectl get pods -n kube-system -l k8s-app=cilium
,所有Pod應為Running
狀態;執行kubectl exec -n kube-system cilium-xxxx -- cilium status
,輸出應顯示Status: ready
且EBPF: enabled
。創建測試Pod
部署一個Nginx Pod作為測試目標:
kubectl run nginx --image=nginx --port=80 --rm -it --restart=Never
執行ip a
查看Pod IP(如10.244.1.2
),退出Pod(輸入exit
)。
跨節點Pod通信
在另一個節點創建Busybox Pod,嘗試訪問Nginx Pod的IP:
kubectl run test-pod --image=busybox --rm -it --restart=Never -- wget -qO- http://<Nginx_Pod_IP>
若返回Nginx歡迎頁面(如<!DOCTYPE html>
),則說明網絡連通性正常。
網絡策略用于控制Pod之間的通信(如限制某命名空間的Pod只能訪問特定端口),以Calico為例:
創建網絡策略
以下策略允許default
命名空間內所有Pod互相訪問,拒絕外部訪問:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: default
spec:
podSelector: {} # 匹配所有Pod
policyTypes:
- Ingress # 控制入站流量
- Egress # 控制出站流量
ingress: [] # 禁止所有入站流量
egress: [] # 禁止所有出站流量
應用策略:kubectl apply -f network-policy.yaml
。
測試策略效果
嘗試從default
命名空間外的Pod訪問default
命名空間內的Pod,應無法訪問;若需允許特定流量,可修改ingress
/egress
字段(如允許來自kube-system
命名空間的流量)。
通過以上步驟,即可在Ubuntu上完成Kubernetes網絡配置,實現Pod跨節點通信及安全策略控制。需根據實際場景選擇合適的網絡插件(如生產環境推薦Calico/Cilium,開發測試推薦Flannel)。