Kubeadm实战生产级Kubernetes集群部署与网络调优全解析环境规划与系统调优在开始部署Kubernetes集群之前合理的环境规划是避免后续问题的关键。许多初次接触K8s的工程师常因忽略基础环境配置而陷入各种坑中。我们先从硬件和网络层面开始梳理。服务器配置建议控制节点至少2核CPU/4GB内存/50GB磁盘工作节点根据业务需求调整建议4核CPU/8GB内存起所有节点千兆网络互联SSD存储优先提示虚拟机环境下务必开启CPU虚拟化支持并分配固定资源避免资源争抢导致集群不稳定内核参数是K8s稳定运行的基石以下是必须配置的关键参数# 加载br_netfilter模块 modprobe br_netfilter # 持久化配置 cat /etc/sysctl.d/k8s.conf EOF net.bridge.bridge-nf-call-ip6tables1 net.bridge.bridge-nf-call-iptables1 net.ipv4.ip_forward1 vm.swappiness0 EOF sysctl -p /etc/sysctl.d/k8s.conf网络规划避坑指南网络类型推荐网段冲突检查要点物理网络192.168.0.0/16避免与云服务商VPC重叠Pod网络10.244.0.0/16确保不与Service网段重叠Service网络10.96.0.0/12预留足够IP供服务扩展常见错误配置使用172.17.0.0/16作为Pod网段与Docker默认网桥冲突Service网段过小导致ClusterIP不足未预留IP地址供后续扩展容器运行时与K8s组件安装Containerd已成为K8s官方推荐的容器运行时其配置比Docker更为轻量。以下是优化后的安装流程# 安装Containerd yum install -y containerd.io-1.6.6 # 生成默认配置并修改关键参数 containerd config default /etc/containerd/config.toml sed -i s/SystemdCgroup false/SystemdCgroup true/g /etc/containerd/config.toml sed -i s|k8s.gcr.io/pause|registry.aliyuncs.com/google_containers/pause|g /etc/containerd/config.toml # 配置镜像加速器 mkdir -p /etc/containerd/certs.d/docker.io cat /etc/containerd/certs.d/docker.io/hosts.toml EOF [host.https://registry-mirror.example.com] capabilities [pull, push] EOF systemctl restart containerdKubeadm定制化配置创建kubeadm-config.yaml文件时需要特别注意以下参数apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: 1.27.0 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers networking: podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12 controllerManager: extraArgs: bind-address: 0.0.0.0 scheduler: extraArgs: bind-address: 0.0.0.0 apiServer: extraArgs: service-account-issuer: kubernetes.default.svc service-account-signing-key-file: /etc/kubernetes/pki/sa.key初始化集群时建议添加--upload-certs参数方便后续节点加入kubeadm init --configkubeadm-config.yaml --upload-certsCalico网络插件深度配置Calico作为生产环境首选网络方案其性能调优至关重要。以下是经过验证的配置模板# calico.yaml关键配置段 apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: calicoNetwork: ipPools: - blockSize: 26 cidr: 10.244.0.0/16 encapsulation: VXLANCrossSubnet natOutgoing: true nodeAddressAutodetectionV4: interface: ens.*|eth.* flexVolumePath: /usr/libexec/kubernetes/kubelet-plugins/volume/exec nodeMetricsPort: 9091 typhaMetricsPort: 9093常见网络问题排查命令# 检查Calico节点状态 calicoctl node status # 查看IP地址分配情况 calicoctl ipam show # 测试网络策略生效情况 kubectl run -it --rm --restartNever net-tool --imagenicolaka/netshoot -- ping 10.244.1.3 # 抓包分析网络流量 kubectl exec -it pod-name -- tcpdump -i eth0 -w /tmp/dump.pcap集群运维关键技巧证书管理 Kubeadm默认生成的证书有效期为1年使用以下命令检查有效期openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A2 Validity推荐使用自动化续期方案# 使用kubeadm证书续期需v1.15 kubeadm certs renew all # 重启控制平面组件 docker ps | grep kube-apiserver | awk {print $1} | xargs docker restart节点维护操作操作类型命令示例注意事项安全驱逐Podkubectl drain node --ignore-daemonsets会触发Pod重新调度节点维护模式kubectl cordon node禁止新Pod调度到该节点节点恢复kubectl uncordon node恢复节点调度能力关键监控指标# 查看节点资源使用情况 kubectl top nodes # 检查集群事件 kubectl get events --sort-by.metadata.creationTimestamp # 诊断API响应延迟 kubectl get --raw/metrics | grep apiserver_request_duration_seconds生产环境验证方案完整的集群验收应该包括以下测试用例基础连通性测试kubectl run test-nginx --imagenginx:alpine kubectl exec -it test-nginx -- curl -I localhostDNS解析验证kubectl run -it --rm --restartNever dns-test --imagebusybox:1.28 -- nslookup kubernetes.default跨节点网络测试# 在节点1创建测试Pod kubectl run node1-pod --imagealpine --overrides{spec: {nodeName: node1}} -- sleep 3600 # 在节点2创建测试Pod kubectl run node2-pod --imagealpine --overrides{spec: {nodeName: node2}} -- sleep 3600 # 测试跨节点通信 kubectl exec node1-pod -- ping node2-pod-ip服务发现验证kubectl create deployment web --imagenginx:alpine kubectl expose deployment web --port80 kubectl run -it --rm --restartNever svc-test --imagebusybox:1.28 -- wget -qO- web.default.svc.cluster.local在完成所有测试后建议运行Sonobuoy进行一致性测试# 下载并运行测试套件 sonobuoy run --modecertified-conformance sonobuoy retrieve sonobuoy results tar.gz遇到Calico节点NotReady时我通常会先检查以下日志journalctl -u kubelet -n 100 --no-pager kubectl logs -n kube-system -l k8s-appcalico-node大多数情况下问题出在IP地址冲突或网络策略配置错误。通过逐步隔离排查总能找到那个被忽略的配置参数。
Kubeadm安装K8s集群避坑指南:从网络规划到Calico配置全流程
Kubeadm实战生产级Kubernetes集群部署与网络调优全解析环境规划与系统调优在开始部署Kubernetes集群之前合理的环境规划是避免后续问题的关键。许多初次接触K8s的工程师常因忽略基础环境配置而陷入各种坑中。我们先从硬件和网络层面开始梳理。服务器配置建议控制节点至少2核CPU/4GB内存/50GB磁盘工作节点根据业务需求调整建议4核CPU/8GB内存起所有节点千兆网络互联SSD存储优先提示虚拟机环境下务必开启CPU虚拟化支持并分配固定资源避免资源争抢导致集群不稳定内核参数是K8s稳定运行的基石以下是必须配置的关键参数# 加载br_netfilter模块 modprobe br_netfilter # 持久化配置 cat /etc/sysctl.d/k8s.conf EOF net.bridge.bridge-nf-call-ip6tables1 net.bridge.bridge-nf-call-iptables1 net.ipv4.ip_forward1 vm.swappiness0 EOF sysctl -p /etc/sysctl.d/k8s.conf网络规划避坑指南网络类型推荐网段冲突检查要点物理网络192.168.0.0/16避免与云服务商VPC重叠Pod网络10.244.0.0/16确保不与Service网段重叠Service网络10.96.0.0/12预留足够IP供服务扩展常见错误配置使用172.17.0.0/16作为Pod网段与Docker默认网桥冲突Service网段过小导致ClusterIP不足未预留IP地址供后续扩展容器运行时与K8s组件安装Containerd已成为K8s官方推荐的容器运行时其配置比Docker更为轻量。以下是优化后的安装流程# 安装Containerd yum install -y containerd.io-1.6.6 # 生成默认配置并修改关键参数 containerd config default /etc/containerd/config.toml sed -i s/SystemdCgroup false/SystemdCgroup true/g /etc/containerd/config.toml sed -i s|k8s.gcr.io/pause|registry.aliyuncs.com/google_containers/pause|g /etc/containerd/config.toml # 配置镜像加速器 mkdir -p /etc/containerd/certs.d/docker.io cat /etc/containerd/certs.d/docker.io/hosts.toml EOF [host.https://registry-mirror.example.com] capabilities [pull, push] EOF systemctl restart containerdKubeadm定制化配置创建kubeadm-config.yaml文件时需要特别注意以下参数apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: 1.27.0 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers networking: podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12 controllerManager: extraArgs: bind-address: 0.0.0.0 scheduler: extraArgs: bind-address: 0.0.0.0 apiServer: extraArgs: service-account-issuer: kubernetes.default.svc service-account-signing-key-file: /etc/kubernetes/pki/sa.key初始化集群时建议添加--upload-certs参数方便后续节点加入kubeadm init --configkubeadm-config.yaml --upload-certsCalico网络插件深度配置Calico作为生产环境首选网络方案其性能调优至关重要。以下是经过验证的配置模板# calico.yaml关键配置段 apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: calicoNetwork: ipPools: - blockSize: 26 cidr: 10.244.0.0/16 encapsulation: VXLANCrossSubnet natOutgoing: true nodeAddressAutodetectionV4: interface: ens.*|eth.* flexVolumePath: /usr/libexec/kubernetes/kubelet-plugins/volume/exec nodeMetricsPort: 9091 typhaMetricsPort: 9093常见网络问题排查命令# 检查Calico节点状态 calicoctl node status # 查看IP地址分配情况 calicoctl ipam show # 测试网络策略生效情况 kubectl run -it --rm --restartNever net-tool --imagenicolaka/netshoot -- ping 10.244.1.3 # 抓包分析网络流量 kubectl exec -it pod-name -- tcpdump -i eth0 -w /tmp/dump.pcap集群运维关键技巧证书管理 Kubeadm默认生成的证书有效期为1年使用以下命令检查有效期openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A2 Validity推荐使用自动化续期方案# 使用kubeadm证书续期需v1.15 kubeadm certs renew all # 重启控制平面组件 docker ps | grep kube-apiserver | awk {print $1} | xargs docker restart节点维护操作操作类型命令示例注意事项安全驱逐Podkubectl drain node --ignore-daemonsets会触发Pod重新调度节点维护模式kubectl cordon node禁止新Pod调度到该节点节点恢复kubectl uncordon node恢复节点调度能力关键监控指标# 查看节点资源使用情况 kubectl top nodes # 检查集群事件 kubectl get events --sort-by.metadata.creationTimestamp # 诊断API响应延迟 kubectl get --raw/metrics | grep apiserver_request_duration_seconds生产环境验证方案完整的集群验收应该包括以下测试用例基础连通性测试kubectl run test-nginx --imagenginx:alpine kubectl exec -it test-nginx -- curl -I localhostDNS解析验证kubectl run -it --rm --restartNever dns-test --imagebusybox:1.28 -- nslookup kubernetes.default跨节点网络测试# 在节点1创建测试Pod kubectl run node1-pod --imagealpine --overrides{spec: {nodeName: node1}} -- sleep 3600 # 在节点2创建测试Pod kubectl run node2-pod --imagealpine --overrides{spec: {nodeName: node2}} -- sleep 3600 # 测试跨节点通信 kubectl exec node1-pod -- ping node2-pod-ip服务发现验证kubectl create deployment web --imagenginx:alpine kubectl expose deployment web --port80 kubectl run -it --rm --restartNever svc-test --imagebusybox:1.28 -- wget -qO- web.default.svc.cluster.local在完成所有测试后建议运行Sonobuoy进行一致性测试# 下载并运行测试套件 sonobuoy run --modecertified-conformance sonobuoy retrieve sonobuoy results tar.gz遇到Calico节点NotReady时我通常会先检查以下日志journalctl -u kubelet -n 100 --no-pager kubectl logs -n kube-system -l k8s-appcalico-node大多数情况下问题出在IP地址冲突或网络策略配置错误。通过逐步隔离排查总能找到那个被忽略的配置参数。