一. Service的类型

先来看看《kubernetes权威指南》中对Service类型的介绍:

  • ClusterIP:kubernetes默认会自动设置Service的虚拟IP地址,仅可被集群内部的客户端应用访问。
  • NodePort:将Service的端口号映射到每个node的一个端口号上,这样集群中的任意Node都可以作为Service的访问入口地址,即:NodeIP:NodePort。
  • LoadBalance:将Service映射到一个已存在的负载均衡器的IP地址上,通常在公有云环境中使用。
  • ExternalName:将Service映射为一个外部域名地址,通过ExternalName字段进行设置。
在权威指南中介绍到ClusterIP是供集群内部访问的,但有天我发现我环境里的ServiceIP在服务器上是能ping通的,那这难道是书上面写的有问题?
[root@k8s-master test-namespace]# kubectl get svc -n test
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
nginx-app-svc   ClusterIP   10.96.240.115   <none>        8090/TCP   14d
[root@k8s-master test-namespace]# ping 10.96.240.115
PING 10.96.240.115 (10.96.240.115) 56(84) bytes of data.
64 bytes from 10.96.240.115: icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from 10.96.240.115: icmp_seq=2 ttl=64 time=0.035 ms
^C
--- 10.96.240.115 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.035/0.040/0.045/0.005 ms

翻阅大量资料后发现,跟KubeProxy的代理模式有很大关系,接下来我们再看看KubeProxy的介绍

二. KubeProxy介绍

kube-proxy 是集群中每个节点(node)上所运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。kube-proxy 维护节点上的一些网络规则, 这些网络规则会允许从集群内部或外部的网络会话与 Pod 进行网络通信。如果操作系统提供了可用的数据包过滤层,则 kube-proxy 会通过它来实现网络规则。 否则,kube-proxy 仅做流量转发。
kubeproxy提供以下几种代理模式:

  • userspace模式:用户空间模式,有kube-proxy完成代理的实现,效率最低,不在推荐使用。
  • iptables模式:kube-proxy通过设置Linux
    Kernel的iptables规则,实现从Service到后端Endpoint列表的负载分发规则,效率很高。但是,如果某个后端Endpoint在转发时不可用,此次客户端请求就会得到失败的响应。这是KubeProxy的默认模式
  • ipvs模式:kube-proxy通过设置Linux Kernel的netlink接口设置ipvs规则,转发效率和支持的吞吐率最高,IPVS模式要求Linux Kernel启用IPVS模块,如果系统未启用IPVS内核模块,kube-proxy会自动切换至iptables模式。
  • kernelspace:Windows Server上的代理模式。
这里我们可以看出kubeproxy默认是iptables模式,我的环境是ipvs模式,那在具体实现上面有什么区别?

iptables:clusterIP 只是 iptables 中的规则,只会处理 ip:port 四层数据包,reject 了icmp。不能 ping 通。
IPVS:clusterIP 会绑定到虚拟网卡 kube-ipvs0,配置了 route路由到回环网卡,icmp 包是 lo 网卡回复的。可以 ping 通。

由此理解了我环境的clusterIP为什么能ping通了,在测试环境也找到了kube-ipvs0的虚拟网卡和虚拟IP地址

[root@k8s-master test-namespace]# ifconfig kube-ipvs0
kube-ipvs0: flags=130<BROADCAST,NOARP>  mtu 1500inet 10.106.125.71  netmask 255.255.255.255  broadcast 0.0.0.0ether e2:09:df:13:ae:7e  txqueuelen 0  (Ethernet)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@k8s-master test-namespace]# ip add
11: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group defaultlink/ether e2:09:df:13:ae:7e brd ff:ff:ff:ff:ff:ffinet 10.106.125.71/32 scope global kube-ipvs0valid_lft forever preferred_lft foreverinet 10.110.143.22/32 scope global kube-ipvs0valid_lft forever preferred_lft foreverinet 10.97.55.252/32 scope global kube-ipvs0valid_lft forever preferred_lft foreverinet 10.104.10.78/32 scope global kube-ipvs0valid_lft forever preferred_lft foreverinet 10.99.137.44/32 scope global kube-ipvs0valid_lft forever preferred_lft foreverinet 10.108.95.38/32 scope global kube-ipvs0valid_lft forever preferred_lft foreverinet 10.111.108.30/32 scope global kube-ipvs0valid_lft forever preferred_lft foreverinet 10.108.242.176/32 scope global kube-ipvs0valid_lft forever preferred_lft foreverinet 10.96.0.10/32 scope global kube-ipvs0valid_lft forever preferred_lft foreverinet 10.108.233.252/32 scope global kube-ipvs0valid_lft forever preferred_lft foreverinet 10.111.66.62/32 scope global kube-ipvs0valid_lft forever preferred_lft foreverinet 10.97.43.250/32 scope global kube-ipvs0valid_lft forever preferred_lft foreverinet 10.103.174.59/32 scope global kube-ipvs0valid_lft forever preferred_lft foreverinet 10.96.0.1/32 scope global kube-ipvs0valid_lft forever preferred_lft foreverinet 10.96.240.115/32 scope global kube-ipvs0valid_lft forever preferred_lft foreverinet 10.98.130.231/32 scope global kube-ipvs0valid_lft forever preferred_lft foreverinet 10.104.208.98/32 scope global kube-ipvs0valid_lft forever preferred_lft forever

另外,kube-ipvs0虚拟网卡上面绑定的IP地址个数和k8s service的个数相等

[root@k8s-master test-namespace]# ip add | grep -c 'inet 10'
18
[root@k8s-master test-namespace]# kubectl get svc -A | grep -v None  |wc -l
18

三.KubeProxy模式修改

我的环境是ipvs模式,刚开始创建集群的时候修改过,修改方式如下

[root@k8s-master test-namespace]# kubectl get cm -n kube-system
NAME                                 DATA   AGE
calico-config                        4      22d
coredns                              1      22d
extension-apiserver-authentication   6      22d
kube-proxy                           2      22d
kube-root-ca.crt                     1      22d
kubeadm-config                       2      22d
kubelet-config-1.20                  1      22d
[root@k8s-master test-namespace]# kubectl edit cm kube-proxy -n kube-system...detectLocalMode: ""enableProfiling: falsehealthzBindAddress: ""hostnameOverride: ""iptables:masqueradeAll: falsemasqueradeBit: nullminSyncPeriod: 0ssyncPeriod: 0sipvs:excludeCIDRs: nullminSyncPeriod: 0sscheduler: ""strictARP: falsesyncPeriod: 0stcpFinTimeout: 0stcpTimeout: 0sudpTimeout: 0skind: KubeProxyConfigurationmetricsBindAddress: ""mode: "ipvs"              ##默认这里是空值,需要修改为ipvs...```
**修改完kubeproxy的配置文件,需要重启kubeproxy的pod,逐一删除即可**

查看系统是否开启ipvs模块

[root@iZ8vb05skym8uiglcfnnslZ ~]# lsmod | grep ip_vs
ip_vs_sh               12688  0
ip_vs_wrr              12697  0
ip_vs_rr               12600  0
ip_vs                 145458  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          139264  10 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_nat_masquerade_ipv4,nf_nat_masquerade_ipv6,nf_conntrack_netlink,nf_conntrack_ipv4,nf_conntrack_ipv6
libcrc32c              12644  3 ip_vs,nf_nat,nf_conntrack

安装ipvsadm来管理ipvs规则

[root@k8s-master test-namespace]# yum -y install ipvsadm
[root@k8s-master test-namespace]# ipvsadm -L -n --stats | grep -A 2 10.96.240.115
TCP  10.96.240.115:8090                  2        8        4      432      224-> 10.244.36.79:80                     1        4        2      216      112-> 10.244.36.80:80                     1        4        2      216      112

参考链接:https://segmentfault.com/a/1190000039349716

k8s中Service ClusterIP ping不通?相关推荐

  1. k8s中service类型

    Kubernetes Kubernetes Pods是有生命周期的.他们可以被创建,而且销毁不会再启动. 如果您使用Deployment来运行您的应用程序,则它可以动态创建和销毁 Pod. 一个Kub ...

  2. K8S中service与controller(控制器)通过标签选择器(selector)匹配pod

    文章目录 1.1 当前k8s的环境 1.2 创建sc名称空间 1.3 通过实践理解 1.4 deployment控制器部署pc-erp-frontend 项目 1.5 daemonset控制器部署m- ...

  3. 【运维面试】k8s中service和ingress的区别

    serivce是如何被设计的: 在pod中运行的容器在动态,弹性的变化(比如容器的重启IP地址会变化),为了给pod提供一个固定的,统一访问的接口,以及负载均衡的能力,并借助DNS系统实现服务发现功能 ...

  4. 记一次k8s中service端口限制在30000-32767问题排查

    问题 今天利用service暴露nodePort端口80报以下错误 he Service "webapp" is invalid: spec.ports[0].nodePort: ...

  5. Ubuntu中连不上网,百度 ping 不通

    Ubuntu中,baidu ping 不通. 解决方法: 1.检查是否有IP信息,若无IP信息,下图: ifconfig 解决办法: sudo /sbin/dhclient 如下图所示,则说明IP信息 ...

  6. # hadoop/Linux环境准备和搭建(在Windows11下)——创建虚拟机中ping后网络不可达ping不通的处理方法

    文章目录 介绍 一.软件准备 二.操作步骤 1.新建虚拟机 2.安装系统(CentOS 7) 3.VMware的网络编辑 4.修改 windows 的主机映射文件(hosts 文件) 5. 结果显示 ...

  7. 同一个局域网中,ping不通其他电脑

    今天工作中碰到的一个问题,与同事同在一个公司局域网中,但是ping不通他的电脑. 原因: 因为windows防火墙默认设置的是不让别人ping通的,所以方法就是,修改防火墙相关设置. 步骤:控制面板 ...

  8. 关于 Kubernetes中Service使用Metallb实现LoadBalancer的一个Demo

    写在前面 学习K8s中Service遇到,单独整理分享给小伙伴 博文内容涉及: Metallb的创建 LoadBalancer类型的Service的创建 有些人心如花木,皆向阳而生 --烽火戏诸侯&l ...

  9. 社死,客户现场网络一直ping不通咋办?

    网络ping不通是网络中出现频率最高的故障之一,同时也是最让人抓狂的故障,基本上大部分人都遇到过了,如果在项目中出现网络ping不通,没有一个有序的方法去排除解决,那么很难入手,也是讨论最多的问题之一 ...

最新文章

  1. MongoDB获得短暂的
  2. 利用OpenCV读取和写入视频
  3. WPF画N角芒星,正N角星
  4. feign session 调用_springboot使用feign调用session传递失效解决方案
  5. mysql数据库五大对象_数据库的三大范式以及五大约束
  6. 【LeetCode笔记】19.删除链表的倒数第N个结点(Java、快慢指针)
  7. 几本人工智能入门书籍
  8. ajax json 封装,Ajax--json(Ajax调用返回json封装代码、格式及注意事项)
  9. Fiddler-学习笔记-远程抓包
  10. VScode找不到C++万能头文件<bits/stdc++.h>解决办法
  11. java 批量删除_mybatis批量插入、批量更新和批量删除
  12. 独家下载!《Java工程师成神之路(基础篇)》
  13. Tensorflow详解 命令行参数flags
  14. idm 2019 中文版下载
  15. 利用zabbix监控网宿cdn的流量
  16. 新版曝光骗子公示PHP系统源码+云黑系统
  17. js实现鼠标跟随效果
  18. Python 音频随机播放器脚本
  19. LED灯光偏色的原因
  20. python生成格雷码

热门文章

  1. 信奥中的数学学习:小学、初高中数学 视频集
  2. 任时光匆匆流走。。。。
  3. 网卡清空缓存命令_怎么清除dns缓存 查看与刷新本地DNS缓存方法 (全文)
  4. Python Web开发: 教你如何解放路由管理
  5. adb打开网页_adb 常用命令
  6. sata3.0 linux内核,编译Linux内核3.0系统出现的警告信息
  7. 二元运算符重载 must take either zero or one argument
  8. Python 实现常见的坐标系之间的转换
  9. 程序猿生存指南-16 农村青年
  10. 以太网2出现两个ip地址-解决办法