<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Network on 维克的博客</title><link>https://blogs.wuvikr.top/tags/network/</link><description>Recent content in Network on 维克的博客</description><generator>Hugo</generator><language>en</language><lastBuildDate>Wed, 16 Sep 2026 13:59:57 +0800</lastBuildDate><atom:link href="https://blogs.wuvikr.top/tags/network/index.xml" rel="self" type="application/rss+xml"/><item><title>K8s MetaLB 详解</title><link>https://blogs.wuvikr.top/posts/k8smetalb%E8%AF%A6%E8%A7%A3/</link><pubDate>Wed, 16 Sep 2026 13:59:57 +0800</pubDate><guid>https://blogs.wuvikr.top/posts/k8smetalb%E8%AF%A6%E8%A7%A3/</guid><description>&lt;p>在 Kubernetes 集群中，Service 是核心资源之一，其中 LoadBalancer 类型服务是业务对外暴露的核心方式。但原生 K8s 仅为公有云集群（AWS、阿里云、腾讯云等）提供 LoadBalancer 实现，裸金属、本地机房、私有部署的 K8s 集群默认不支持 LoadBalancer 类型 Service，只能依赖 NodePort、Ingress 实现流量暴露，存在端口散乱、运维复杂、无统一入口、负载均衡能力薄弱等问题。&lt;/p>
&lt;p>&lt;a href="https://metallb.io/">MetalLB&lt;/a> 正是这样一款专为私有/裸金属K8s集群设计的开源负载均衡组件，完全开源免费、轻量无侵入，完美补齐了私有 K8s 集群无原生 LoadBalancer 的短板，是本地机房 K8s 生产集群的标配组件。&lt;/p>
&lt;hr>
&lt;h1 id="1-项目介绍">1. 项目介绍&lt;/h1>
&lt;h2 id="11-项目定位与核心作用">1.1 项目定位与核心作用&lt;/h2>
&lt;p>MetalLB 是 Kubernetes官方认可的负载均衡解决方案，专为非云环境（裸金属服务器、虚拟机、本地私有集群）设计。其核心作用是：为集群内 LoadBalancer 类型的 Service 自动分配外部静态 IP，实现四层流量负载均衡，替代原生 NodePort 的低效暴露方式，让私有集群拥有与公有云一致的 Service 负载均衡能力。&lt;/p>
&lt;p>&lt;strong>核心价值：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>统一业务暴露方式：与公有云 K8s 开发规范对齐，无需适配 NodePort 特殊逻辑。&lt;/li>
&lt;li>稳定四层负载均衡：支持 TCP/UDP 协议，适配后端服务、数据库、中间件等各类业务。&lt;/li>
&lt;li>简化运维：固定服务外部 IP，无需节点端口映射，流量入口统一可控。&lt;/li>
&lt;li>轻量高性能：无复杂依赖，资源占用极低，不侵入 K8s 核心组件。&lt;/li>
&lt;/ul>
&lt;h2 id="12-架构原理">1.2 架构原理&lt;/h2>
&lt;p>MetalLB 采用控制器 + 转发节点的分布式架构，整体由两大核心组件组成，全部运行在集群内部，以 Pod 形式部署。&lt;/p>
&lt;h3 id="121-controller控制器组件">1.2.1 Controller（控制器组件）&lt;/h3>
&lt;p>全局唯一的调度组件，默认单副本部署，核心职责：&lt;/p>
&lt;ul>
&lt;li>监听集群内所有 LoadBalancer 类型的 Service 资源变更。&lt;/li>
&lt;li>维护 IP 地址池，为新的 LoadBalancer Service 自动分配可用外部 IP。&lt;/li>
&lt;li>回收废弃 Service 的 IP 资源，避免 IP 泄露与占用。&lt;/li>
&lt;li>校验 IP 分配合法性，保证全局唯一性。&lt;/li>
&lt;/ul>
&lt;h3 id="122-speaker转发组件">1.2.2 Speaker（转发组件）&lt;/h3>
&lt;p>集群节点级组件，默认每个集群节点部署一个Pod（DaemonSet部署），核心职责：&lt;/p></description></item><item><title>Pod 网络故障排查</title><link>https://blogs.wuvikr.top/posts/pod%E7%BD%91%E7%BB%9C%E6%95%85%E9%9A%9C%E6%8E%92%E6%9F%A5/</link><pubDate>Sat, 12 Sep 2026 15:51:54 +0800</pubDate><guid>https://blogs.wuvikr.top/posts/pod%E7%BD%91%E7%BB%9C%E6%95%85%E9%9A%9C%E6%8E%92%E6%9F%A5/</guid><description>&lt;p>Kubernetes 的网络是一个多层虚拟网络体系，流量从客户端到后端 Pod 的路径涉及多个组件。排查网络问题时，如果&amp;quot;东戳一下西戳一下&amp;quot;没有章法，可能需要耗费大量时间。如何最快的定位网络问题的根源？记住常见的具体现象和应对办法，遵循&lt;strong>从内到外&lt;/strong>的原则（先确认&amp;quot;自己没问题&amp;quot;，再确认&amp;quot;中间没问题&amp;quot;，最后确认&amp;quot;外面没问题&amp;quot;）或许能够帮你节约大量的时间，。&lt;/p>
&lt;p>下面按照从&lt;strong>具体访问现象&lt;/strong>出发的思路，由浅入深展开。&lt;/p>
&lt;hr>
&lt;h1 id="1-第一层pod-自身状态确认">1. 第一层：Pod 自身状态确认&lt;/h1>
&lt;p>&lt;strong>现象：Pod 完全无法访问，任何请求都无响应&lt;/strong>
这是最基础的一层。在排查任何网络问题之前，先确认 Pod 本身是否健康运行。&lt;/p>
&lt;h2 id="11-检查-pod-状态">1.1 检查 Pod 状态&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl get pods -o wide
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>关注以下状态：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>状态&lt;/th>
&lt;th>含义&lt;/th>
&lt;th>可能原因&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Running&lt;/code>&lt;/td>
&lt;td>正常运行&lt;/td>
&lt;td>正常&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Pending&lt;/code>&lt;/td>
&lt;td>等待调度&lt;/td>
&lt;td>资源不足、节点亲和性不匹配&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>CrashLoopBackOff&lt;/code>&lt;/td>
&lt;td>反复崩溃重启&lt;/td>
&lt;td>应用启动失败、配置错误&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>OOMKilled&lt;/code>&lt;/td>
&lt;td>内存超限被杀&lt;/td>
&lt;td>&lt;code>resources.limits.memory&lt;/code> 设置过低&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>ImagePullBackOff&lt;/code>&lt;/td>
&lt;td>镜像拉取失败&lt;/td>
&lt;td>镜像名错误、仓库认证失败&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>ContainerCreating&lt;/code>&lt;/td>
&lt;td>容器创建中&lt;/td>
&lt;td>CNI 插件分配 IP 失败、存储卷挂载失败&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>如果 Pod 不在 &lt;code>Running&lt;/code> 状态，网络问题只是表象，根因在 Pod 本身：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看 Pod 详细事件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl describe pod &amp;lt;pod-name&amp;gt; -n &amp;lt;namespace&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看容器日志（如果容器曾启动过）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl logs &amp;lt;pod-name&amp;gt; -n &amp;lt;namespace&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看前一个崩溃容器的日志&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl logs &amp;lt;pod-name&amp;gt; -n &amp;lt;namespace&amp;gt; --previous
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="12-确认-pod-有-ip-地址">1.2 确认 Pod 有 IP 地址&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl get pods -o wide
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果 Pod 状态是 &lt;code>Running&lt;/code> 但 &lt;strong>IP 为空&lt;/strong>，说明 CNI 插件没有成功分配 IP。此时需要检查：&lt;/p></description></item></channel></rss>