k8s骚操作 Pod服务通过IP对外访问&k8s指定IP创建Pod

k8s Pod服务通过IP对外访问

前言

k8s v1.14.2版本提供了5种访问Pod的方式(hostNetwork,hostPort,NodePort,LoadBalancer和Ingress),但都不符合通过PodIp直接访问容器的需求,这边的需求是直接访问Pod的Ip,并指定Ip创建Pod

外部访问逻辑

指定k8s生成PodIp范围关闭calico默认隧道模式(IPIP),添加路由器路由(PodIP范围内的ip跳转到k8s-master节点),允许k8s-master节点转发并添加iptables转发规则,指定Ip创建Pod(可选,看需求)

操作

以下步骤需要重新搭建

1、修改calico配置文件

修改calico.yaml文件配置

vim calico.yaml

把默认IPIP禁用掉,这一步是因为我们访问是通过传统的BGP模式,而calico默认设置为IPIP模式,这一步是为了统一路由协议,能够正确的转发数据包。修改完成后,k8s会在k8s集群内自动添加内部BGP路由。

# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
  value: "Off"

同时修改value生成范围(与–pod-network-cidr参数一致,这里的192.168.128.0/17范围为192.168.128.0到192.168.255.255)确保k8s的节点不在这个IP范围内,不然会导致很多不可预知的问题。比如coredns启动失败或calico-kube-controllers启动失败,报错(Get https://10.96.0.1:443/api/v1/services?resourceVersion

<think>嗯,用户遇到了Kubernetes集群中ClusterIP无法访问Pod的问题,这确实是Kubernetes网络排查的典型场景。从用户提供的引用内容来看,ta应该已经掌握了一些基础排查命令,但需要更系统的故障树分析。 用户可能是个中级运维工程师,正在处理线上服务不可用的问题,情绪可能比较焦虑。ta的深层需求其实是快速恢复服务,而不仅仅是理论分析。引用中提到的临时容器调试和Endpoint检查都是关键点,但需要补充更完整的链路追踪思路。 从技术角度看,这个问题可以拆解为六个层面:网络策略层、服务路由层、Pod健康层、容器配置层、节点网络层和集群状态层。每个层面都需要特定的排查命令: 网络策略层要优先确认,因为Calico或Cilium的策略会直接阻断流量。引用[1]提到的kubectl get命令可以快速检查策略,但需要补充namespace过滤的细节。服务路由层的关键在于Endpoint状态,引用[3]提到的svc查看命令很有用,但需要强调READY字段的数值含义。 Pod健康层要特别注意多容器场景,引用[2]展示的多容器Pod崩溃就是典型例子。容器配置层则需要进入容器验证,引用[4]的debug命令比常规exec更安全。节点网络层容易被忽视,但引用[5]提到的跨节点不通问题其实很常见。 最后要提醒用户注意服务类型差异,比如NodePort和ClusterIP访问路径完全不同。给出的命令都加了具体参数示例,比如--selector这种容易遗漏的关键参数。还补充了tcpdump这种高阶工具,虽然命令复杂但能定位深层次问题。 考虑到用户可能急需解决方案,把最可能的原因放在前面:Endpoint异常和网络策略拦截占了线上80%的案例。最后用流程图总结也很必要,毕竟文本描述再清晰也不如图示直观。</think>以下是 Kubernetes 中 ClusterIP 无法访问 Pod 的常见原因及系统化排查方法,结合了引用内容和标准实践: --- ### **一、核心排查流程** #### 1. **确认 Service 状态** ```bash kubectl get svc -n <命名空间> # 检查 ClusterIP 和端口 kubectl describe svc <Service名称> -n <命名空间> # 查看 Endpoints 是否关联 Pod ``` * **关键点**: - 检查 `Endpoints` 列表是否包含目标 Pod IP(若为空,说明标签选择器未匹配 Pod)[^1][^3] - 确认 `Port` 定义是否正确(`targetPort` 必须与 Pod 容器端口一致) #### 2. **检查 Pod 状态与标签** ```bash kubectl get pods -n <命名空间> --show-labels # 查看 Pod 标签与就绪状态 kubectl describe pod <Pod名称> -n <命名空间> # 检查事件(Events)和容器状态 ``` * **关键点**: - Pod 需处于 `Running` 状态且 `READY` 为 `1/1`(多容器需全部就绪) - 确认 Pod 的 `Labels` 是否匹配 Service 的 `selector`[^2][^3] - 查看 `Events` 是否有异常(如镜像拉取失败、CrashLoopBackOff) #### 3. **验证容器端口与网络策略** ```bash kubectl exec -it <Pod名称> -n <命名空间> -- netstat -tuln | grep <端口> # 确认容器内进程监听 kubectl get networkpolicy -n <命名空间> # 检查网络策略是否拦截流量 ``` * **关键点**: - 容器内服务必须在 `targetPort` 上监听(**0.0.0.0** 而非 127.0.0.1) - 若存在 `NetworkPolicy`,需允许来自 `kube-proxy` 或 ClusterIP 网段的流量 #### 4. **检查 Endpoints 对象** ```bash kubectl get endpoints <Service名称> -n <命名空间> # 手动验证 Endpoints ``` * **预期输出**: ```bash NAME ENDPOINTS AGE my-service 10.244.1.2:80,10.244.1.3:80 5m ``` * 若 `ENDPOINTS` 为空或无目标 Pod IP,说明 Service 与 Pod 未关联[^1][^3] #### 5. **节点级网络排查** ```bash kubectl get nodes -o wide # 检查节点状态 kubectl debug node/<节点名> -it --image=busybox # 在节点执行命令 ``` * **在调试容器中测试**: ```bash curl <ClusterIP>:<Port> # 测试从节点访问 ClusterIP telnet <Pod_IP> <Container_Port> # 绕过 Service 直连 Pod ``` - 若直连 Pod 通但 ClusterIP 不通,问题在 `kube-proxy` 或网络插件[^5] #### 6. **诊断 kube-proxy 与网络插件** ```bash # 检查 kube-proxy 日志 kubectl logs -n kube-system -l k8s-app=kube-proxy --tail=100 # 验证 iptables 规则(节点上执行) iptables-save | grep <Service_IP> ``` * **关键点**: - 确认存在将 ClusterIP 转发到 Pod IPiptables/ipvs 规则 - 检查网络插件(Calico/Flannel 等)是否正常运行(Pod 跨节点通信依赖此) --- ### **二、常见原因总结** | **问题类型** | **具体原因** | |----------------------|-----------------------------------------------------------------------------| | **Service 配置错误** | 标签选择器与 Pod 不匹配、`targetPort` 错误、协议类型错误 | | **Pod 状态异常** | 容器未就绪、端口未监听、多容器 Pod 部分崩溃[^2] | | **网络策略拦截** | NetworkPolicy 阻止了 ClusterIPPod 的流量 | | **Endpoint 缺失** | Service 未关联到 Pod(通常因标签或命名空间错误) | | **kube-proxy 故障** | iptables/ipvs 规则未生成、kube-proxy 进程异常 | | **CNI 插件问题** | 跨节点 Pod 网络不通、MTU 不匹配、路由表错误[^5]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值