kubernetes(k8s)容器内无法连接同所绑定的Service ClusterIP问题记录

news2024/11/22 15:42:51

kubernetes(k8s)容器内无法连接同所绑定的Service ClusterIP问题记录

1. k8s环境

k8s使用kubernetes-server-linux-amd64_1.19.10.tar.gz 二进制bin 的方式手动部署

k8s 版本:

[root@master ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.10", GitCommit:"98d5dc5d36d34a7ee13368a7893dcb400ec4e566", GitTreeState:"clean", BuildDate:"2021-04-15T03:28:42Z", GoVersion:"go1.15.10", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.10", GitCommit:"98d5dc5d36d34a7ee13368a7893dcb400ec4e566", GitTreeState:"clean", BuildDate:"2021-04-15T03:20:25Z", GoVersion:"go1.15.10", Compiler:"gc", Platform:"linux/amd64"}
2. 测试nginx-busybox应用

2.1 构建nginx测试镜像Dockerfile

# 基于官方 Nginx 镜像
FROM nginx

# 安装 Busybox
RUN apt-get update && apt-get install -y busybox

# 复制 Nginx 配置文件
# COPY nginx.conf /etc/nginx/nginx.conf

# 复制自定义 HTML 文件(可选)
COPY index.html /usr/share/nginx/html/

# 在容器启动时执行的命令
CMD ["nginx", "-g", "daemon off;"]
echo "hello world" > index.html
docker build . -t nginx-busybox:v1.0

2.2 创建k8s 测试资源nbusybox_deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nbusybox-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nbusybox
  template:
    metadata:
      labels:
        app: nbusybox
    spec:
      containers:
        - name: nbusybox
          image: nginx-busybox:v1.0
          ports:
            - containerPort: 80


---
apiVersion: v1
kind: Service
metadata:
  annotations: {}
  labels:
    k8s.kuboard.cn/name: nbusybox-service-v1
  name: nbusybox-service
spec:
  clusterIP: 10.233.0.45
  ports:
    - name: mrmsqs
      nodePort: 30233
      port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: nbusybox
  sessionAffinity: None
  type: NodePort

kubectl create -f nbusybox_deployment.yaml

2.3 ping service 测试

[root@master ~]# docker ps | grep nbusybox
975b550531df   3740b49d5078           "/docker-entrypoint.…"   31 minutes ago   Up 31 minutes             k8s_nbusybox_nbusybox-deployment-6b48bb8f65-mpnhg_default_1a60a955-c5fa-4e08-b8f3-7461edd9ea48_0
6d4a77f60cee   k8s.gcr.io/pause:3.2   "/pause"                 31 minutes ago   Up 31 minutes             k8s_POD_nbusybox-deployment-6b48bb8f65-mpnhg_default_1a60a955-c5fa-4e08-b8f3-7461edd9ea48_0

进入容器:

 docker exec -it 975b550531df  /bin/bash

http get 所在的service clusterIP 发现不通:

root@nbusybox-deployment-6b48bb8f65-mpnhg:/# busybox wget nbusybox-service.default.svc.cluster.local
Connecting to nbusybox-service.default.svc.cluster.local (10.233.0.45:80)

而在http get 其他的service clusterIP 发现可通:

root@nbusybox-deployment-6b48bb8f65-mpnhg:/# busybox wget nginxbusybox-service.default.svc.cluster.local
Connecting to nginxbusybox-service.default.svc.cluster.local (10.233.0.62:80)
saving to 'index.html'
index.html           100% |*******************************************************************************************************************************|    11  0:00:00 ETA
'index.html' saved

以为是kube-proxy 在iptables 的转发模式所致, 尝试更改 kube-proxy 的代理模式为ipvs

./kube-proxy --logtostderr=true --v=4 --hostname-override=192.168.0.251 --master=http://192.168.0.250:8080 --proxy-mode=ipvs

发现问题仍然存在。

kube-proxy 在iptables 和 ipvs 模式下,不会处理ip 包的转发,而是交由linux 网络协议栈处理。猜测是linux 网络协议栈的处理问题。尝试在宿主机对docker0 网卡抓包:
在这里插入图片描述

发现 nbusybox-service.default.svc.cluster.local 这个service 可以正常连接了。
在这里插入图片描述

当一但关掉 wireshark, nbusybox-service.default.svc.cluster.local 这个service 就连接不了。

在wireshark 的抓包记录中,发现一条 从 10.0.9.2(容器ip) 发往 10.0.9.2 的http 响应,似乎构成了回环。

询问chatgpt:

linux 网络协议栈,对于源IP, 源MAC 跟目标IP, 目标MAC一样的IP包,能正常发送吗?

在 Linux 网络协议栈中,对于源 IP 地址(Source IP)和源 MAC 地址(Source MAC)与目标 IP 地址(Destination IP)和目标 MAC 地址(Destination MAC)完全相同的 IP 包,通常是无法正常发送的。

这是因为在以太网(Ethernet)协议中,源 MAC 和目标 MAC 是用于网络中的数据链路层寻址和交换的重要字段。当一个主机发送一个 IP 包时,它会填充源 IP 和源 MAC 字段,同时指定目标 IP 和目标 MAC 字段。当数据包通过网络进行传输时,数据链路层设备(如交换机)会根据目标 MAC 地址将数据包转发到正确的目的地。

如果源 IP 和源 MAC 与目标 IP 和目标 MAC 完全相同,这意味着数据包将被送回到自身,形成了一个循环。为了避免这种无限循环的情况发生,Linux 网络协议栈通常会阻止发送这样的数据包。

当尝试发送源 IP 和源 MAC 与目标 IP 和目标 MAC 完全相同的数据包时,Linux 网络协议栈通常会丢弃这些数据包或者不进行发送。这是为了确保网络的正常运行和防止数据包的无限循环。

需要注意的是,这种行为可能会因操作系统和网络配置而有所不同,但在大多数常见的 Linux 发行版和网络环境中,源 IP 和源 MAC 与目标 IP 和目标 MAC 完全相同的 IP 包通常无法正常发送。

关掉 wireshark 的混杂模式
在这里插入图片描述

再次开启wireshark 对docker0 抓包, 容器内对 nbusybox-service.default.svc.cluster.local service 就连接不了。

问题已初步定位,当启用了 docker0 的混杂模式,容器内对 nbusybox-service.default.svc.cluster.local service 就可以连接。

再次验证, 手动对docker0 启用混杂模式

ifconfig docker0 promisc

测试:
在这里插入图片描述

发现 容器内对 nbusybox-service.default.svc.cluster.local service 就可以连接。

3. 结论

当在容器内(10.0.9.2)访问 service, 而这个service 经负载均衡后,找回这个容器自身(10.0.9.2),这时tcp 连接就无法建立,这时开启docker0网卡的混杂模式,tcp连接就可以建立。 但笔者在使用v1.23.17 的k8s 版本在某云厂商的云服务器上部署,是可以在容器内访问自身的Service 的,因此该结论可能还跟操作系统或k8s的版本配置有关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1274018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

掌握区块链技术将推进2024年市场发展脚步

1.高收入潜力 精通区块链的人才通常享有超过全国平均水平的薪酬,这也反映了对于专业技能的需求正在迅速增长。无论你选择成为这个领域哪一块业务的人员,掌握区块链技能均可以显著提升你的收入。 2.职业多样性 无论你目前从事什么职业,都可…

前端项目环境的搭建

一、下载并且安装Node(不安装node,就安装nvm。nvm安装教程): 1.官网下载Node:https://nodejs.org/en/ 2.测试nodejs安装是否成功: 在windows powerShell中输入node -v 和 npm -v,看到版本号就…

WordPress批量上传文章和自动发布文章的方法

专业介绍:WordPress批量上传文章技术解析 在现代数字时代,内容创作是网络存在的驱动力之一。对于博客作者、新闻编辑和内容管理员而言,高效地批量上传文章至WordPress平台是提高工作效率的一个关键方面。WordPress作为最受欢迎的内容管理系统…

福德植保无人机:农业科技的未来已来

一、引言 随着科技的不断进步,无人机技术已经深入到各个领域。而在农业领域,福德植保无人机更是引领了科技潮流,为农业生产带来了革命性的改变。今天,让我们一起来了解福德植保无人机的魅力所在。 二、福德植保无人机的优势 高效作…

无人机助力电力设备螺母缺销智能检测识别,python基于YOLOv7开发构建电力设备螺母缺销高分辨率图像小目标检测系统

传统作业场景下电力设备的运维和维护都是人工来完成的,随着现代技术科技手段的不断发展,基于无人机航拍飞行的自动智能化电力设备问题检测成为了一种可行的手段,本文的核心内容就是基于YOLOv7来开发构建电力设备螺母缺销检测识别系统&#xf…

gromacs学习及使用(2)

命令解释参考GROMACS基本教程 整个流程参考分子动力学模拟Gromacs一般使用步骤(空蛋白) 从gromacs 5.0版本开始,所有的工具都是“gmx”的子模块。可以通过下面的命令获得任何一个模块的帮助信息: gmx help (module) 或者 gmx (mo…

人主机辅与机主人辅

人主机辅和机主人辅的时机和地点一般取决于具体的应用场景和技术发展,具体而言: 人主机辅: 在较为复杂和需要专业知识的工作中,人类主持机器辅助的需求较为常见。例如,在医疗领域中,人类专家可能会利用机器…

【2023CANN训练营第二季】——Ascend C算子调用及实验演示

自定义算子调用方式 完成自定义算子的开发部署后,可以通过单算子调用的方式来验证单算子的功能。单算子调用有API执行和模型执行两种方式: 单算子API执行:基于C语言的API执行算子,无需提供单算子描述文件进行离线模型的转换&…

docker buildx跨架构构建笔记(x86_64构建下构建aarch64镜像)

docker buildx跨架构构建(x86_64构建aarch64镜像) 文章目录 docker buildx跨架构构建(x86_64构建aarch64镜像)简介第一步 先交叉编译一个aarch64的HelloWorld程序。准备一个用于跨架构的Dockerfile文件使用docker buildx命令构建aarch64架构的镜像。查看镜像具体详细信息&#…

LeetCode Hot100 438.找到字符串中所有字母异位词

题目: 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 代码: class Solution …

【shell】shell脚本编程作业

1 编写bash脚本,要求用户输入源目录和目标目录(绝对路径),然后列出源目录下所有的文件,并将这些文件拷贝到目标目录,并在文件名后面加上时间戳。(提交源代码和运行截图) if [ -d $1 ] || [ -d…

类和对象——(3)再识对象

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 你说那里有你的梦想,…

国产linux单用户模式破解无密码登陆 (麒麟系统用户登录密码遗忘解决办法)

笔者手里有一批国产linu系统,目前开始用在日常的工作生产环境中,我这个老程序猿勉为其难的充当运维的或网管的角色。 国产linux系统常见的为麒麟Linux,统信UOS等,基本都是基于debian再开发的linux。 问题描述: 因为…

centos7下执行yum命令报错

前言 在Linux系统中,安装nginx时候,需要先安装环境。 Nginx是使用C语言开发,安装nginx需要先从官网上将源码下载,然后编译,编译需要gcc环境,但是在安装gcc环境的时候,执行命令报错。 yum install –y gcc-…

【稳定检索|投稿优惠】2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024)

2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024) 2024 International Conference on Biological Neuroengineering and Health Big Data(ICBNHBD) 一、【会议简介】 2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024),这场科学盛宴,会议在中…

训练自己的个性化Stable diffusion模型,LORA

一、背景 需要训练自己的LORA模型 二、分析 1、有sd-webui有训练插件功能 2、有单独的LORA训练开源web界面 两个开源训练界面 1、秋叶写的SD-Trainer https://github.com/Akegarasu/lora-scripts/ 没成功,主要也是cudnn和nvidia-smi中的CUDA版本不一致退出 2…

操作系统背景知识

一、程序分类 程序按其运行环境分为: 裸机程序:直接运行在对应硬件上的程序 应用程序:只能运行在对应操作系统上的程序 二、计算机系统的层次结构 计算机系统两种层次结构: 2.1 无操作系统的简单的两层结构 2.2 有操作系统的…

SpringBoot中的部分注解

1.SpringBoot/spring SpringBootApplication: 包含Configuration、EnableAutoConfiguration、ComponentScan通常用在主类上; Repository: 用于标注数据访问组件,即DAO组件; Service: 用于标注业务层组件; RestController: 用…

使用ApexSQLLog工具恢复数据库

目录 前言 一、ApexSQLLog是什么? 二、使用步骤 1.连接你要恢复的数据库 2.选择你要恢复的时间点的数据 3.恢复指定操作的数据 4.恢复指定的表 5.输出结果方式 6.输出结果方式 7.生成还原的sql语句 总结 前言 我们在操作数据库的时候可能误操作把数据修…

Ps:用好钢笔工具

使用钢笔工具时,应随时注意鼠标指针的形状。 ◆ ◆ ◆ 基本操作方法 1、绘制闭合路径 路径绘制结束时回到起点即可创建闭合路径。 2、绘制开放路径 想结束绘制时,按住 Ctrl 键点击画布空白处,或者,直接按 Esc 键,即可…