Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Kubernetes 初始化配置

初始 kubeadm 配置

apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 172.16.0.116
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  kubeletExtraArgs:
    fail-swap-on: "false"
  taints:
    - effect: PreferNoSchedule
      key: node-role.kubernetes.io/master
---
apiServer:
  extraArgs:
    service-node-port-range: "10000-50000"
apiVersion: kubeadm.k8s.io/v1beta4
# clusterName: kubernetes
controlPlaneEndpoint: 172.16.0.118:8443
etcd:
  external:
    endpoints:
      - http://172.16.0.113:2379
      - http://172.16.0.114:2379
      - http://172.16.0.115:2379
# imageRepository: registry.server.com
kind: ClusterConfiguration
kubernetesVersion: 1.33.3
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16
---
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
kind: KubeletConfiguration
failSwapOn: false
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
ipvs:
  strictARP: true

下面根据给出的初始 kubeadm 配置,按 Kubernetes 1.33 + Calico(推荐 eBPF + VXLAN)最佳实践 做了优化与补充,输出 可直接使用的 kubeadm YAML(保留你原有字段并补足必要安全/可用性项),并在后面给出逐段详解与注意事项,包含为什么这样配置、什么时候需要修改,以及与 Calico 的配套建议(eBPF / VXLAN / kube-proxy 处理等)。

注意:下面的 YAML 是用作 kubeadm init –config=… 或 kubeadm join –config=… 的配置文件片段(多段 YAML)。请根据你的实际 IP/域名/证书路径替换注释中标注的占位项(例如 external etcd TLS: CA、cert、key 路径)。如果你使用的是 Calico eBPF,请按文末说明替换或禁用 kube-proxy。

✅ 推荐的 kubeadm 初始化配置(已优化)

# ---------------------------
# 1) InitConfiguration: 本节点本地 API 及节点注册相关
# ---------------------------
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 172.16.0.116
  bindPort: 6443
nodeRegistration:
  name: master-172-16-0-116             # 节点名(可选但推荐,便于识别)
  criSocket: unix:///var/run/containerd/containerd.sock
  kubeletExtraArgs:
    fail-swap-on: "false"               # 允许 swap(如果你确实需要)。生产建议关闭 swap 并把 fail-swap-on: "true"
    node-ip: "172.16.0.116"             # 明确指定 node-ip,避免 kubelet 绑定到错误接口(VPN/tun0)
    # 如果使用 systemd cgroup driver,下面的参数可不必重复,KubeletConfiguration 中会设置
  taints:
    - key: node-role.kubernetes.io/master
      effect: PreferNoSchedule
# ---------------------------
# 2) ClusterConfiguration: API Server、控制平面、etcd、网络等
# ---------------------------
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.33.3
clusterName: kubernetes
controlPlaneEndpoint: "172.16.0.118:8443"   # 推荐改成 DNS(例如 api.k8s.example.com:6443)以便后续 HA/证书管理
imageRepository: "registry.server.com"       # 可选:私有镜像仓库(替换为你的镜像库)

# API Server 参数
apiServer:
  extraArgs:
    service-node-port-range: "10000-50000"  # 你的要求
    # 强烈建议显式设置 preferred-address-types(metrics 等会用)
    kubelet-preferred-address-types: "InternalIP,Hostname,ExternalIP"
  # 证书 SAN:确保所有会访问 apiserver 的 IP/域名都在此列表中
  certSANs:
    - "127.0.0.1"
    - "localhost"
    - "10.96.0.1"             # Service cluster IP(默认 service CIDR 首个IP)
    - "172.16.0.116"         # 本节点 advertiseAddress
    - "172.16.0.118"         # controlPlaneEndpoint IP(LB 或 VIP)
    # - "api.k8s.example.com" # 如果 controlPlaneEndpoint 是域名,请加入
  timeoutForControlPlane: 4m

# Controller manager 可选额外参数(示例:调整资源分配、leader-elect 等)
controllerManager:
  extraArgs:
    node-monitor-period: "6s"

# Scheduler 可选参数
scheduler:
  extraArgs:
    address: "127.0.0.1"

# 外部 etcd(建议使用 HTTPS/TLS 而非 http)
etcd:
  external:
    endpoints:
      - "https://172.16.0.113:2379"
      - "https://172.16.0.114:2379"
      - "https://172.16.0.115:2379"
    # TLS 证书/CA(必须提供,否则改回 http 并确认网络安全性)
    caFile: /etc/kubernetes/pki/etcd/ca.crt
    certFile: /etc/kubernetes/pki/etcd/client.crt
    keyFile: /etc/kubernetes/pki/etcd/client.key

# 网络配置:Service / Pod CIDR,需要与 Calico IPPool 保持一致
networking:
  dnsDomain: cluster.local
  serviceSubnet: "10.96.0.0/12"
  podSubnet: "10.244.0.0/16"    # 与 Calico IPPool 对齐(示例:默认 Flannel/Calico 兼容)
# ---------------------------
# 3) KubeletConfiguration:kubelet 运行时参数(适配 systemd + containerd)
# ---------------------------
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
failSwapOn: false
# 推荐增加的稳健性参数
systemReserved:
  cpu: "200m"
  memory: "256Mi"
kubeReserved:
  cpu: "200m"
  memory: "256Mi"
evictionHard:
  memory.available: "100Mi"

# kubelet 连接超时、证书刷新等
imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80
serializeImagePulls: false
# ---------------------------
# 4) KubeProxyConfiguration(默认 ipvs 模式,若使用 Calico eBPF,应移除或禁用 kube-proxy)
# ---------------------------
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
ipvs:
  strictARP: true
# 注意:如果你将使用 Calico BPF dataplane(推荐)请在 deploy Calico 时禁用 kube-proxy(或使用 kube-proxy mode=none)
# ---------------------------
# End of config
# ---------------------------

逐段说明与优化理由(逐项详解)

一、InitConfiguration / nodeRegistration

  • node-ip 显式指定:你先前遇到 OpenVPN/tun0 干扰的问题很常见,kubelet 如果自动选择接口可能会绑定到错误的 IP(tun0),导致 metrics/kubelet 与 apiserver 通信异常。node-ip: “172.16.0.116” 能强制 kubelet 使用正确的内网地址。

  • fail-swap-on: “false”:你之前设置为 false,保留。如果是生产建议把系统 swap 关闭并将 failSwapOn: true,保持 kubelet 行为一致。

  • taints 使用 PreferNoSchedule:你原来是 PreferNoSchedule。生产常见是 NoSchedule 或 node-role.kubernetes.io/control-plane:NoSchedule。PreferNoSchedule 允许临时容忍,但不保证不调度——根据你是否需要在控制平面运行业务调整。

二、ClusterConfiguration — apiServer / certSANs / controlPlaneEndpoint

  • certSANs 明确列出访问 apiserver 的 IP/DNS:原错误(x509 valid for A not B)就是因为证书缺少访问 IP。把 advertiseAddress、controlPlaneEndpoint 的 IP,以及 10.96.0.1(ServiceClusterIP)和 localhost 放进 certSANs,能避免 kubeconfig 或外部 LB 访问时证书校验失败。

  • controlPlaneEndpoint 建议使用域名(VIP/LB):你现在是 172.16.0.118:8443,可工作。但生产环境建议使用 api.example.com:6443 指向 Nginx/HAProxy/Keepalived VIP,以便后续扩容/证书管理更灵活。

  • service-node-port-range:你改为 10000-50000,确认防火墙/云安全组已放行这些端口。

三、etcd 外部配置(极其重要)

  • 你最开始用 http://,强烈建议使用 https:// + TLS client cert(上面示例给出了 caFile、certFile、keyFile 字段)。未加密的 etcd 流量会带来严重安全风险。

  • 如果 etcd 是外部独立集群,确保所有 control-plane 节点能解析并访问这些 IP(网络、路由、防火墙)。

四、networking: podSubnet 与 Calico

  • podSubnet: 10.244.0.0/16 保持常见默认(与许多 Calico/Flannel 示例兼容)。重要:Calico 的 IPPool 必须与此 CIDR 对齐,或你改用 Calico IPPool 自行管理 podCIDR(这时 kubeadm 不设 podSubnet)。

  • 若启用 Calico IPAM 管理全局网段、建议在 Calico IPPool 中统一定义,例如 10.10.0.0/16 分业务池。

五、KubeletConfiguration

  • cgroupDriver: systemd:与 containerd + systemd 推荐匹配,避免 OOM、QoS 问题。

  • failSwapOn: false:与你在 nodeRegistration 保持一致。再次强调:生产建议 swapoff -a 并开启 failSwapOn: true。

  • systemReserved / kubeReserved:为 host 和 kubelet 预留资源,保护系统稳定性,值需根据机器大小调整。

  • evictionHard:基础保护,避免内存耗尽导致整个节点不可用。

六、KubeProxyConfiguration(ipvs)

  • 你选择了 ipvs 并开启 strictARP: true,这在裸金属 / L2 LB 场景对 ARP 通告更稳定。

  • 但:如果计划使用 Calico eBPF dataplane(最佳实践推荐),你应当 移除/禁用 kube-proxy(或将其 DaemonSet scale 0 / 使用 mode none),因为 eBPF 将替代 kube-proxy 的功能。

  • 如果不使用 eBPF,则 ipvs 是高性能选择(记得安装 ipvs-modules 并调整 conntrack 参数)。

与 Calico(eBPF + VXLAN)配合的特别说明(必须读)

若你打算启用 Calico eBPF(推荐生产高性能):

  1. 在 Calico Operator/Installation CR 中设置:

    calicoNetwork:
    linuxDataplane: "BPF"
    encapMode: "VXLAN"     # 或 ipip,推荐 VXLAN for offload
    mtu: 1450
    
  2. 禁用 kube-proxy:将 kube-proxy DaemonSet scale 到 0 或 remove;Calico BPF 会处理 Service/IPVS 功能。

  3. 确保 Node kernel/内核模块支持 eBPF(Linux 5.x+ 推荐),并安装必要的 bpftool。

  4. 调整 conntrack、nf_conntrack_max、mtu 如上(提高 conntrack limit)。

若不使用 eBPF:保留 kube-proxy ipvs,但仍可使用 Calico 的 VXLAN 或 BGP 模式作为 Pod 网络。

证书与证书重生(常见流程)

  • 如果你修改了 certSANs,kubeadm init phase certs apiserver –config=cluster-config.yaml 不会覆盖已存在的证书,需先备份并删除 /etc/kubernetes/pki/apiserver.crt & apiserver.key,再运行 phase 命令,或在初次 kubeadm init 时传入此文件。

  • 若你是 HA,多 master 节点需要把生成的新证书分发到其它 control-plane 节点(或使用 kubeadm join –control-plane with certs)。

操作建议(实操步骤简要)

  1. 把上面 YAML 保存为 cluster-config.yaml(替换 etcd TLS 路径与 imageRepository 等)。

  2. (如果是新集群):

    kubeadm init --config=cluster-config.yaml
    
  3. (如果只想重签 apiserver 证书):

    备份并删除旧证书:

    cp /etc/kubernetes/pki/apiserver.crt /root/
    cp /etc/kubernetes/pki/apiserver.key /root/
    rm /etc/kubernetes/pki/apiserver.crt /etc/kubernetes/pki/apiserver.key
    kubeadm init phase certs apiserver --config=cluster-config.yaml
    kubeadm init phase kubeconfig all --config=cluster-config.yaml
    touch /etc/kubernetes/manifests/kube-apiserver.yaml  # 触发 kubelet reload
    

    分发新证书到其它 control-plane 节点(scp / rsync)。

  4. 安装 Calico:根据是否启用 eBPF 选择 manifest(Operator + Installation CR)。若使用 eBPF,请在 Calico CR 中关闭 kube-proxy 并确保内核支持。

常见校验 & 故障排查命令(给你快速检查清单)

检查 apiserver cert SAN:

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A2 "Subject Alternative Name"

检查 kubelet 使用的 node-ip:

ps -ef | grep kubelet
grep -i node-ip /var/lib/kubelet/kubeadm-flags.env || journalctl -u kubelet -n 200

检查 etcd 可达(HTTPS):

ETCDCTL_API=3 etcdctl --endpoints=https://172.16.0.113:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/client.crt --key=/etc/kubernetes/pki/etcd/client.key endpoint status

Calico 状态:

kubectl -n calico-system get pods
kubectl -n calico-system logs ds/calico-node

把上面 YAML 进一步生成两个版本:(A) Calico eBPF(推荐) 的完整 install-playbook 与 (B) Calico IPIP/VXLAN + kube-proxy(ipvs) 的保守版本,并给出一键部署命令(包括必要的内核模块、sysctl、conntrack 调整)

好 — 我把你要的 两个可直接执行的一键部署方案 都做出来了(A:Calico eBPF 推荐版;B:Calico VXLAN/IPIP + kube-proxy(ipvs) 保守版)。每个方案包含:

  • 节点预检与内核模块 / sysctl / conntrack 调整的一键脚本(在所有节点执行)
  • 在 Control Plane 上运行的「一键安装脚本」,会应用 Calico Operator + 对应的 Installation CR(已按推荐项配置)
  • 开启 / 关闭 kube-proxy 的安全建议与命令
  • 验证步骤与排查要点

说明:脚本以 Bash 编写,适用于 RHEL/AlmaLinux/CentOS/Ubuntu(有少量系统差异注记)。执行前请把 NODES 列表与 KUBECONFIG 环境变量(或 kubectl 可用)调整好。请在非生产环境先跑一次预检脚本并检查输出。

A. Calico eBPF(推荐) 一键安装 Playbook

说明:此方案以 eBPF dataplane + VXLAN encapsulation 为主(兼顾云与裸金属),最大化性能并替代 kube-proxy(需移除/禁用 kube-proxy)。如果你想保留 kube-proxy,请改用 B 方案。

先决条件(摘要)

  • Kernel >= 5.4 推荐(最好 5.10+)且启用了 eBPF 支持
  • containerd 或 CRI-O 正常运行
  • kubectl 可用并指向 control-plane(有 cluster-admin 权限)
  • 各 Node 能够访问网络、时间同步正常
  • 若集群用 external etcd,请保证 TLS 正确

1. 节点预检 + 内核 / sysctl / conntrack 调整(在每个 Node 上执行)

保存为 calico-ebpf-preflight.sh,在每个 node(或通过 SSH 循环)执行:

#!/usr/bin/env bash
set -euo pipefail
# Usage: sudo ./calico-ebpf-preflight.sh

echo "=== preflight: kernel & modules & sysctl for Calico eBPF ==="

# 1. basic check
echo "Kernel version: $(uname -r)"
if ! grep -qP '^5\.' /proc/version && ! grep -qP '^6\.' /proc/version ; then
  echo "WARN: kernel may be older than recommended (5.x/6.x). eBPF works best on 5.4+; continue at your risk."
fi

# 2. install bpftool if missing (try distro package; fallback to static)
if ! command -v bpftool >/dev/null 2>&1; then
  echo "bpftool not found. Installing..."
  if command -v dnf >/dev/null 2>&1; then
    sudo dnf install -y bpftool || true
  elif command -v apt-get >/dev/null 2>&1; then
    sudo apt-get update && sudo apt-get install -y bpftool || true
  fi
fi

# 3. enable required kernel modules (try load, ignore failures)
echo "Loading kernel modules..."
sudo modprobe -a ip_tables ip_set nf_conntrack nft_chain_nat nft_nat xt_conntrack || true

# 4. sysctl tuning (applies immediately)
echo "Applying sysctl tuning..."
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.bridge.bridge-nf-call-iptables=1
sudo sysctl -w net.bridge.bridge-nf-call-ip6tables=1
# conntrack tuning
sudo sysctl -w net.netfilter.nf_conntrack_max=2621440
sudo sysctl -w net.netfilter.nf_conntrack_buckets=655360
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=600

# ephemeral ports (optional)
sudo sysctl -w net.ipv4.ip_local_port_range="10000 65000"

# persist to /etc/sysctl.d/99-calico.conf
cat <<EOF | sudo tee /etc/sysctl.d/99-calico.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.netfilter.nf_conntrack_max = 2621440
net.netfilter.nf_conntrack_buckets = 655360
net.netfilter.nf_conntrack_tcp_timeout_established = 600
net.ipv4.ip_local_port_range = 10000 65000
EOF

sudo sysctl --system >/dev/null

echo "Preflight done. Recommended: ensure bpftool is available and kernel >=5.10 for best results."

2. 在 control-plane 上的一键安装脚本(应用 Calico Operator + Installation CR)

保存为 install-calico-ebpf.sh 并在 control-plane(kubectl 可用)运行:

#!/usr/bin/env bash
set -euo pipefail
# Usage: ./install-calico-ebpf.sh
# Ensure KUBECONFIG or kubectl context points to target cluster

CALICO_MANIFEST="https://docs.projectcalico.org/manifests/tigera-operator-manifests.yaml"

echo "1) Apply Calico operator manifest..."
kubectl apply -f ${CALICO_MANIFEST}

echo "Waiting for operator..."
kubectl -n tigera-operator rollout status deploy/tigera-operator --timeout=180s || true

echo "2) Create Installation CR for eBPF + VXLAN"
cat <<'EOF' | kubectl apply -f -
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  calicoNetwork:
    # Use BPF dataplane
    linuxDataplane: "BPF"
    # Encapsulation: VXLAN for cloud portability and offload
    encapsulation: "VXLAN"
    # set MTU according to underlying network (example 1450)
    mtu: 1450
    # cross-subnet NAT outgoing for external access
    natOutgoing: true
EOF

echo "Installation CR applied. Waiting for Calico components..."
kubectl -n tigera-operator get pods -w || true

echo "3) Disable kube-proxy (Calico eBPF handles Service dataplane)"
echo "NOTE: Disabling kube-proxy will remove ipvs/iptables rules. Do on all nodes once you're ready."
echo "To remove kube-proxy DaemonSet (execute when ready):"
echo "  kubectl -n kube-system delete ds kube-proxy"
echo ""
echo "Alternatively, you can patch to a benign configuration and then delete."
echo ""
echo "4) Verify calico-node & calico-kube-controllers status:"
kubectl -n calico-system get pods

echo "Done. Monitor logs: kubectl -n calico-system logs ds/calico-node"

重要说明 / 操作顺序建议(生产级)

  1. 在所有节点跑好 calico-ebpf-preflight.sh 并确认无错误。
  2. 在 control-plane 运行 install-calico-ebpf.sh。等待 calico-node、calico-kube-controllers 启动并 Ready。
  3. 验证:kubectl -n calico-system get ds、kubectl get pods -A | grep calico。
  4. 当 calico-node 的 BPF dataplane 已确认正常(查看 pod 日志),再在所有节点上安全移除 kube-proxy(kubectl -n kube-system delete ds kube-proxy)。先确认 Calico eBPF 能处理 Service 流量再删除 kube-proxy,否则短时间内会丢流量。

3. 验证步骤(安装完成后)

# calico pods ready
kubectl -n calico-system get pods
# calico node daemonset
kubectl -n calico-system get ds
# check calico-node logs for BPF status
kubectl -n calico-system logs ds/calico-node -c calico-node | tail -n 200
# test pod-to-pod connectivity
kubectl run -n default test1 --image=busybox --restart=Never --rm -it -- /bin/sh -c "sleep 3600" &
# create another busybox, exec ping etc.

B. Calico IPIP/VXLAN + kube-proxy(ipvs) 保守版(兼容性优先)

说明:如果你需要保留 kube-proxy(ipvs)或节点内核不适合 eBPF,使用此方案。默认使用 VXLAN(或 IPIP),并保留 kube-proxy 的 ipvs 模式。

1. 节点预检 + 内核模块 / sysctl / conntrack 调整(在每个 Node 执行)

保存为 calico-ipvs-preflight.sh:

#!/usr/bin/env bash
set -euo pipefail
# Usage: sudo ./calico-ipvs-preflight.sh

echo "=== preflight: ipvs modules & sysctl for Calico + kube-proxy(ipvs) ==="

# Load ipvs modules
sudo modprobe ip_vs
sudo modprobe ip_vs_rr
sudo modprobe ip_vs_wrr
sudo modprobe ip_vs_sh
sudo modprobe nf_conntrack
sudo modprobe nf_conntrack_ipv4 || true
sudo modprobe xt_conntrack || true

# sysctl tuning
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.bridge.bridge-nf-call-iptables=1
sudo sysctl -w net.bridge.bridge-nf-call-ip6tables=1

# conntrack
sudo sysctl -w net.netfilter.nf_conntrack_max=2621440
sudo sysctl -w net.netfilter.nf_conntrack_buckets=655360

# persist
cat <<EOF | sudo tee /etc/sysctl.d/99-calico-ipvs.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.netfilter.nf_conntrack_max = 2621440
net.netfilter.nf_conntrack_buckets = 655360
EOF

sudo sysctl --system >/dev/null

echo "Preflight done. IPVS modules loaded and sysctl set."

2. 在 control-plane 上的一键安装脚本(Calico + ipvs)

保存为 install-calico-ipvs.sh 并在 control-plane 上运行:

#!/usr/bin/env bash
set -euo pipefail
# Usage: ./install-calico-ipvs.sh

CALICO_MANIFEST="https://docs.projectcalico.org/manifests/tigera-operator-manifests.yaml"

echo "1) Apply Calico operator manifest..."
kubectl apply -f ${CALICO_MANIFEST}

echo "Waiting for operator..."
kubectl -n tigera-operator rollout status deploy/tigera-operator --timeout=180s || true

echo "2) Create Installation CR for VXLAN (or IPIP) with ipvs kube-proxy"
cat <<'EOF' | kubectl apply -f -
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  calicoNetwork:
    # Use linux dataplane (iptables/ipip/vxlan)
    linuxDataplane: "Kernel"
    # Choose encapsulation: "VXLAN" or "IPIP"
    encapsulation: "VXLAN"
    mtu: 1450
    natOutgoing: true
EOF

echo "3) Ensure kube-proxy is running in ipvs mode (DaemonSet should exist)"
kubectl -n kube-system get ds kube-proxy || echo "kube-proxy DS missing; ensure kube-proxy is installed in ipvs mode"

echo "If kube-proxy not in ipvs mode, run this on control plane (or via your kube-proxy manifest):"
echo "kubectl -n kube-system set env ds/kube-proxy --containers=kube-proxy mode=ipvs || patch daemonset with --proxy-mode=ipvs"

echo "4) Verify calico and kube-proxy"
kubectl -n calico-system get pods
kubectl -n kube-system get ds kube-proxy

echo "Done."

说明/注意

  • linuxDataplane: “Kernel” 指使用内核 dataplane(iptables/ipvs)。
  • Encapsulation 可改为 IPIP:把 encapsulation: “IPIP” 替换 VXLAN。IPIP 可在某些旧环境使用,但 VXLAN 更利于云/硬件 offload。
  • 确保 kube-proxy 已安装并配置 mode: ipvs(通常 kubeadm init 会自动部署 ipvs mode,如果主机内核模块可用)。若没有,请安装 kube-proxy 的正确 manifest。

3. 验证步骤(安装完成后)

# calico pods
kubectl -n calico-system get pods
# kube-proxy daemonset status
kubectl -n kube-system get ds kube-proxy
# check ipvs rules on a node
ssh node1 "sudo ipvsadm -Ln"
# check VXLAN interface
ssh node1 "ip -d link show vxlan.calico || ip -d link show tunl0"

常见操作/回滚与安全提示(两种方案共通)

  • 先做预检再删 kube-proxy(eBPF 方案):确认 calico-node 的 logs 没有错误并且 pod-to-pod、service-to-pod 测试都正常后再删除 kube-proxy。
  • 备份关键 manifest:kubectl -n kube-system get ds kube-proxy -o yaml > kube-proxy.backup.yaml。万一需要回滚,可以重新 apply。
  • 如果节点上有 OpenVPN/tun0:为 kubelet 明确 node-ip(见你之前配置),避免绑定错误接口。
  • MTU 调整:如果你在 cloud provider,确认 VPC MTU 与 VXLAN overhead(50 bytes)兼容,通常 1500 - 50 = 1450 是稳妥值。
  • conntrack:高 QPS 服务需把 nf_conntrack_max 提高到适配流量。观察 /proc/net/nf_conntrack 与 conntrack -L。
  • eBPF 依赖内核:某些老内核或 container runtimes 版本会有兼容性问题,先在测试环境跑完整流量压测再切生产。