掌握這些容器網路技術,輕鬆拿下30K運維崗
1. 引言
2. 容器網路基礎概念
2.1 容器網路模型概述
-
• 容器間通訊:同一主機上的容器如何相互通訊 -
• 跨主機通訊:不同主機上的容器如何建立連線 -
• 容器與外部網路通訊:容器如何訪問外部服務和被外部訪問 -
• 網路隔離:如何實現多租戶環境下的網路安全隔離
2.2 Linux 網路名稱空間
-
• 網路介面(Network Interface) -
• 路由表(Routing Table) -
• 防火牆規則(Firewall Rules) -
• 網路統計資訊
2.3 虛擬網路裝置
-
• veth pair:虛擬乙太網裝置對,連線容器和主機網路 -
• bridge:虛擬網橋,實現同主機容器間通訊 -
• tun/tap:虛擬網路裝置,用於VPN和overlay網路 -
• macvlan/ipvlan:提供容器直接訪問物理網路的能力
3. Docker 網路模式詳解
3.1 Bridge 網路模式
# 建立自定義bridge網路
docker network create --driver bridge my-bridge-network
# 啟動容器並連線到指定網路
docker run -d --name web --network my-bridge-network nginx
# 檢視網路詳細資訊
docker network inspect my-bridge-network
-
1. Docker守護程序建立預設的docker0網橋 -
2. 為每個容器建立veth pair -
3. 一端連線到容器內部,另一端連線到docker0網橋 -
4. 透過iptables規則實現NAT轉發
3.2 Host 網路模式
# 使用host網路啟動容器
docker run -d --name web-host --network host nginx
# 容器直接使用宿主機網路介面
docker exec web-host ip addr show
-
• 對網路效能要求極高的應用 -
• 需要繫結宿主機特定埠的服務 -
• 網路監控和診斷工具
3.3 Container 網路模式
# 建立網路容器
docker run -d --name network-container alpine sleep 3600
# 共享網路名稱空間
docker run -d --name app --network container:network-container nginx
3.4 None 網路模式
# 建立無網路連線的容器
docker run -d --name isolated --network none alpine sleep 3600
# 手動配置網路(如果需要)
docker exec isolated ip linkset lo up
4. Kubernetes 網路架構
4.1 Kubernetes 網路模型
-
1. 每個Pod都有唯一的IP地址 -
2. Pod間可以直接通訊,無需NAT -
3. 節點與Pod間可以直接通訊 -
4. Pod看到的自己的IP就是其他Pod看到的IP
4.2 CNI(Container Network Interface)
# CNI配置示例
{
"cniVersion":"0.3.1",
"name":"mynet",
"type":"bridge",
"bridge":"mynet0",
"isDefaultGateway":true,
"ipMasq":true,
"ipam": {
"type":"host-local",
"subnet":"10.22.0.0/16",
"routes": [
{ "dst":"0.0.0.0/0" }
]
}
}
4.3 Service 網路
# ClusterIP Service
apiVersion:v1
kind:Service
metadata:
name:my-service
spec:
selector:
app:my-app
ports:
-protocol:TCP
port:80
targetPort:8080
type:ClusterIP
---
# NodePort Service
apiVersion:v1
kind:Service
metadata:
name:my-nodeport-service
spec:
selector:
app:my-app
ports:
-protocol:TCP
port:80
targetPort:8080
nodePort:30000
type:NodePort
---
# LoadBalancer Service
apiVersion:v1
kind:Service
metadata:
name:my-lb-service
spec:
selector:
app:my-app
ports:
-protocol:TCP
port:80
targetPort:8080
type:LoadBalancer
4.4 Ingress 網路
apiVersion:networking.k8s.io/v1
kind:Ingress
metadata:
name:my-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target:/
spec:
rules:
-host:api.example.com
http:
paths:
-path:/
pathType:Prefix
backend:
service:
name:api-service
port:
number:80
-host:web.example.com
http:
paths:
-path:/
pathType:Prefix
backend:
service:
name:web-service
port:
number:80
5. 主流 CNI 外掛對比
5.1 Flannel
-
• 配置簡單,易於部署 -
• 支援多種後端(VXLAN、host-gw、UDP) -
• 網路效能一般,功能相對簡單
# Flannel配置示例
apiVersion:v1
kind:ConfigMap
metadata:
name:kube-flannel-cfg
namespace:kube-system
data:
cni-conf.json:|
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
}
]
}
net-conf.json:|
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
5.2 Calico
-
• 基於BGP路由,效能優異 -
• 內建網路策略支援 -
• 支援多種資料平面(Linux kernel、eBPF、VPP)
# Calico網路策略示例
apiVersion:projectcalico.org/v3
kind:NetworkPolicy
metadata:
name:deny-all
namespace:production
spec:
selector:all()
types:
-Ingress
-Egress
egress:
-action:Allow
destination:
selector:app=="database"
protocol:TCP
destination:
ports: [5432]
5.3 Weave Net
-
• 自動發現和連線節點 -
• 內建DNS服務發現 -
• 支援網路加密
# 部署Weave Net
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
# 檢視Weave狀態
kubectl exec -n kube-system weave-net-xxx -- /home/weave/weave --local status
5.4 Cilium
-
• 基於eBPF,效能卓越 -
• 提供7層網路策略 -
• 支援服務網格功能
# Cilium網路策略示例
apiVersion:"cilium.io/v2"
kind:CiliumNetworkPolicy
metadata:
name:"l3-l4-policy"
spec:
endpointSelector:
matchLabels:
app:web
ingress:
-fromEndpoints:
-matchLabels:
app:frontend
toPorts:
-ports:
-port:"80"
protocol:TCP
6. 容器網路安全
6.1 網路策略(Network Policy)
# 基礎網路策略示例
apiVersion:networking.k8s.io/v1
kind:NetworkPolicy
metadata:
name:web-netpol
namespace:default
spec:
podSelector:
matchLabels:
app:web
policyTypes:
-Ingress
-Egress
ingress:
-from:
-podSelector:
matchLabels:
app:frontend
ports:
-protocol:TCP
port:8080
egress:
-to:
-podSelector:
matchLabels:
app:database
ports:
-protocol:TCP
port:3306
6.2 網路隔離策略
# 名稱空間級別隔離
apiVersion:networking.k8s.io/v1
kind:NetworkPolicy
metadata:
name:deny-all-ingress
namespace:production
spec:
podSelector: {}
policyTypes:
-Ingress
---
# 允許特定名稱空間訪問
apiVersion:networking.k8s.io/v1
kind:NetworkPolicy
metadata:
name:allow-specific-namespace
namespace:production
spec:
podSelector:
matchLabels:
app:api
policyTypes:
-Ingress
ingress:
-from:
-namespaceSelector:
matchLabels:
name:frontend
6.3 容器網路加密
# Calico IPSec配置
apiVersion:projectcalico.org/v3
kind:FelixConfiguration
metadata:
name:default
spec:
wireguardEnabled:true
wireguardInterfaceName:wg0
7. 服務發現與負載均衡
7.1 DNS 服務發現
# CoreDNS配置
apiVersion:v1
kind:ConfigMap
metadata:
name:coredns
namespace:kube-system
data:
Corefile:|
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
7.2 Service Mesh
# Istio VirtualService
apiVersion:networking.istio.io/v1beta1
kind:VirtualService
metadata:
name:productpage
spec:
http:
-match:
-headers:
end-user:
exact:jason
route:
-destination:
host:reviews
subset:v2
-route:
-destination:
host:reviews
subset:v1
7.3 負載均衡策略
# IPVS負載均衡配置
apiVersion:v1
kind:ConfigMap
metadata:
name:kube-proxy
namespace:kube-system
data:
config.conf:|
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
scheduler: "rr" # rr, lc, dh, sh, sed, nq
syncPeriod: 30s
minSyncPeriod: 5s
8. 容器網路監控
8.1 網路效能監控
# 網路監控指標收集
apiVersion:v1
kind:ServiceMonitor
metadata:
name:container-network-monitor
spec:
selector:
matchLabels:
app:network-exporter
endpoints:
-port:metrics
interval:30s
path:/metrics
8.2 網路流量分析
# 使用bpftrace分析網路延遲
bpftrace -e '
kprobe:tcp_sendmsg {
@send_start[tid] = nsecs;
}
kretprobe:tcp_sendmsg /@send_start[tid]/ {
@send_latency = hist(nsecs - @send_start[tid]);
delete(@send_start[tid]);
}
'
8.3 故障檢測和告警
# PrometheusRule for network monitoring
apiVersion:monitoring.coreos.com/v1
kind:PrometheusRule
metadata:
name:network-monitoring
spec:
groups:
-name:network.rules
rules:
-alert:HighNetworkLatency
expr:histogram_quantile(0.99,rate(container_network_receive_bytes_total[5m]))>1000
for:10m
labels:
severity:warning
annotations:
summary:"High network latency detected"
description:"Network latency is above 1000ms for {{ $labels.instance }}"
9. 故障排查與最佳化
9.1 常見網路問題診斷
# 檢查Pod網路連線性
kubectl exec -it pod-name -- ping target-ip
# 檢查DNS解析
kubectl exec -it pod-name -- nslookup service-name
# 檢查埠連通性
kubectl exec -it pod-name -- telnet service-name port
# 檢查網路策略
kubectl describe networkpolicy policy-name
# 檢查CoreDNS狀態
kubectl get pods -n kube-system -l k8s-app=kube-dns
# 檢查DNS配置
kubectl exec -it pod-name -- cat /etc/resolv.conf
# 測試DNS解析
kubectl exec -it pod-name -- dig @coredns-service-ip domain-name
9.2 網路效能最佳化
# 最佳化網路緩衝區
echo'net.core.rmem_max = 134217728' >> /etc/sysctl.conf
echo'net.core.wmem_max = 134217728' >> /etc/sysctl.conf
echo'net.ipv4.tcp_rmem = 4096 87380 134217728' >> /etc/sysctl.conf
echo'net.ipv4.tcp_wmem = 4096 65536 134217728' >> /etc/sysctl.conf
# 最佳化連線跟蹤
echo'net.netfilter.nf_conntrack_max = 1000000' >> /etc/sysctl.conf
echo'net.netfilter.nf_conntrack_buckets = 250000' >> /etc/sysctl.conf
# 應用配置
sysctl -p
# Calico效能最佳化配置
apiVersion:projectcalico.org/v3
kind:FelixConfiguration
metadata:
name:default
spec:
bpfEnabled:true
bpfLogLevel:"info"
bpfDataIfacePattern:"^(en|eth|ens|eno|enp|enx|em|wlan|wlp|wlx|ww|sl|bond|team|br|docker|veth|lo|tunl|vxlan|cilium|lxc|cni|flannel|kube|dummy|virbr|vnet|ptp|ipvlan|macvlan|tap|p2p|erspan|gre|sit|ip6gre|ip6tnl|ip6gretap|isatap|vti|nlmon|ipip|ip_vti|ip6_vti)"
9.3 網路故障恢復
# 網路健康檢查
apiVersion:v1
kind:Pod
metadata:
name:network-health-check
spec:
containers:
-name:health-check
image:busybox
command: ["/bin/sh"]
args: ["-c", "while true; do ping -c 1 8.8.8.8 && echo 'Network OK' || echo 'Network Failed'; sleep 30; done"]
livenessProbe:
exec:
command:
-/bin/sh
--c
-"ping -c 1 8.8.8.8"
initialDelaySeconds:30
periodSeconds:30
readinessProbe:
exec:
command:
-/bin/sh
--c
-"ping -c 1 8.8.8.8"
initialDelaySeconds:5
periodSeconds:10
10. 最佳實踐與建議
10.1 網路架構設計原則
-
1. 分層設計:將網路功能分為不同層次,便於管理和擴充套件 -
2. 冗餘設計:避免單點故障,提供網路高可用性 -
3. 安全優先:實施最小許可權原則,預設拒絕所有流量 -
4. 監控完備:建立全面的網路監控和告警機制
10.2 容器網路安全最佳實踐
# 安全配置示例
apiVersion:v1
kind:Pod
metadata:
name:secure-pod
spec:
securityContext:
runAsNonRoot:true
runAsUser:1000
fsGroup:2000
containers:
-name:app
image:myapp:latest
securityContext:
allowPrivilegeEscalation:false
readOnlyRootFilesystem:true
capabilities:
drop:
-ALL
resources:
limits:
cpu:500m
memory:512Mi
requests:
cpu:100m
memory:128Mi
10.3 效能最佳化建議
-
1. 選擇合適的CNI外掛:根據環境需求選擇最適合的網路外掛 -
2. 合理配置資源限制:避免網路資源競爭 -
3. 最佳化DNS配置:減少DNS查詢延遲 -
4. 使用本地化儲存:減少網路I/O開銷
10.4 運維自動化
#!/bin/bash
# 網路狀態自動檢查指令碼
check_network_health() {
echo"Checking network connectivity..."
# 檢查Pod網路連通性
kubectl get pods --all-namespaces -o wide | grep -v Running | grep -v Completed
# 檢查Service狀態
kubectl get svc --all-namespaces
# 檢查DNS解析
kubectl exec -n kube-system -it $(kubectl get pods -n kube-system -l k8s-app=kube-dns -o name | head -1) -- nslookup kubernetes.default.svc.cluster.local
# 檢查網路策略
kubectl get networkpolicies --all-namespaces
}
# 網路效能測試
network_performance_test() {
echo"Running network performance test..."
# 建立測試Pod
kubectl run netperf-server --image=networkstatic/netperf --restart=Never -- netserver
kubectl run netperf-client --image=networkstatic/netperf --restart=Never -- netperf -H netperf-server
# 清理測試資源
kubectl delete pod netperf-server netperf-client
}
# 執行檢查
check_network_health
network_performance_test
11. 未來發展趨勢
11.1 eBPF技術應用
11.2 Service Mesh整合
11.3 邊緣計算支援
11.4 安全增強
12. 總結








