K8S Service 常见问题

Service 问题排查

为了演示需要部署以下服务。

apiVersion: apps/v1
kind: Deployment
metadata:name: busyboxnamespace: appslabels:app: busybox
spec:replicas: 1selector:matchLabels:app: busyboxtemplate:metadata:labels:app: busyboxspec:containers:- name: busyboximage: busybox:1.28command: ["sh","-c","sleep 113600"]ports:- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: hostnamesname: hostnamesnamespace: apps
spec:selector:matchLabels:app: hostnamesreplicas: 3template:metadata:labels:app: hostnamesspec:containers:- name: hostnamesimage: mirrorgooglecontainers/serve_hostname

部署成功以后查看状态如下

[root@master01 yaml]# kubectl get po -n apps 
NAME                         READY   STATUS    RESTARTS   AGE
busybox-6c8989b4f7-pmwkd     1/1     Running   0          5m36s
hostnames-6ff7c698bc-j2d7s   1/1     Running   0          5s
hostnames-6ff7c698bc-pzk2x   1/1     Running   0          5s
hostnames-6ff7c698bc-wlxsn   1/1     Running   0          5s

确认 Pod 是否正常

kubectl get pods -n apps -l app=hostnames -o go-template='{{range .items}}{{.status.podIP}}{{"\n"}}{{end}}'

输出结果如下:

172.29.55.26
172.21.231.191
172.31.112.138

测试部署的 hostnames 是否可以正常访问

在 busybox 容器内访问或者在主机上访问都可以,端口是9376。

for i in 172.29.55.26:9376 172.21.231.191:9376 172.31.112.138:9376;do wget -qO- $i ;done

输出结果如下:

hostnames-6ff7c698bc-j2d7s
hostnames-6ff7c698bc-pzk2x
hostnames-6ff7c698bc-wlxsn

如果输出和我这个不一样 你的 Pod 肯定那块出问题了

给 hostname 服务创建 Service

kubectl expose deployment hostnames --port=80 --target-port=9376 -n apps

测试 Service 是否可通过 DNS 名字访问

通过 busybox Pod 中访问 Service 名字:

nslookup hostnames
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local # 这个是DNS服务地址Name:      hostnames
Address 1: 10.110.220.210 hostnames.apps.svc.cluster.local   # 这个是咱们测试的服务地址

如果不通的话有可能不是同一个命名空间,可以添加命名空间在测试。
apps 是我测试的命名空间,需要修改成自己的。

nslookup hostnames.apps.svc.cluster.local

注意这里的后缀:“apps.svc.cluster.local”。“apps” 是我们正在操作的命名空间。 “svc” 表示这是一个 Service。“cluster.local” 是你的集群域,在你自己的集群中可能会有所不同。

如果不能通过DNS域名访问,则需要检查你 Pod 中的 /etc/resolv.conf 文件是否正确。在 Pod 中运行以下命令:(10.96.0.10 这个是DNS 服务的域名)

/ # cat /etc/resolv.conf 
search apps.svc.cluster.local svc.cluster.local cluster.local openstacklocal
nameserver 10.96.0.10
options ndots:5

如果还是失败 就需要查看 kube-proxy 服务是否异常。

测试 Service 能否通过 IP访问

假设 DNS 工作正常,那么接下来要测试 Service 能否通过它的 IP 访问。 从集群中的一个 Pod,尝试访问 Service 的 IP(从上面的 kubectl get 命令获取)。

Service IP查看方法:

[root@master01 ~]# kubectl get svc -n apps -owide
NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE   SELECTOR
hostnames   ClusterIP   10.110.220.210   <none>        80/TCP    46h   app=hostnames

尝试通过 IP地址访问

for i in $(seq 1 3); do wget -qO- 10.110.220.210:80
done

输出应该类似这样:

hostnames-632524106-bbpiw
hostnames-632524106-ly40y
hostnames-632524106-tlaok

查看 Service 的配置是否正确

kubectl get svc -n apps  hostnames -oyaml
apiVersion: v1
kind: Service
metadata:labels:app: hostnamesname: hostnamesnamespace: apps
spec:clusterIP: 10.110.220.210clusterIPs:- 10.110.220.210internalTrafficPolicy: ClusteripFamilies:- IPv4ipFamilyPolicy: SingleStackports:- port: 80protocol: TCPtargetPort: 9376selector:app: hostnamessessionAffinity: Nonetype: ClusterIP
  • 你想要访问的 Service 端口是否在 spec.ports[] 中列出?
  • targetPort 对你的 Pod 的端口是否正确
  • selector 标签是否写错了
  • 端口类型是数字类型(9376)的还是字符串类型(“9376”)
  • 如果使用名称型端口,那么你的 Pod 是否暴露了一个同名端口?
  • 端口的协议 protocol 和 Pod 的是否对应?

查看Service 是否有 Endpoints

kubectl get endpoints -n apps hostnames 
NAME        ENDPOINTS                                                   AGE
hostnames   172.21.231.191:9376,172.29.55.26:9376,172.31.112.138:9376   46h

这证实 Endpoints 控制器已经为你的 Service 找到了正确的 Pods。 如果 ENDPOINTS 列的值为 ,则应检查 Service 的 spec.selector 字段, 以及你实际想选择的 Pod 的 metadata.labels 的值。 常见的错误是输入错误或其他错误,例如 Service 想选择 app=hostnames,但是 Deployment 指定的是 run=hostnames。在 1.18之前的版本中 kubectl run 也可以被用来创建 Deployment。

查看 kube-proxy 工作是否正常

如果到这里,则说明 Service 正在运行,拥有 Endpoints,Pod 真正在提供服务。 此时,整个 Service 代理机制是可疑的,也就是 proxy 服务又可能有问题。

Service 的默认实现(在大多数集群上应用的)是 kube-proxy。 这是一个在每个节点上运行的程序,负责配置用于提供 Service 抽象的机制之一。 如果你的集群不使用 kube-proxy,则以下各节将不适用,你将必须检查你正在使用的 Service 的实现方式。

查看kube-proxy 状态

systemctl status kube-proxy
● kube-proxy.service - Kubernetes Kube ProxyLoaded: loaded (/usr/lib/systemd/system/kube-proxy.service; enabled; vendor preset: disabled)Active: active (running) since Mon 2024-04-15 16:47:57 CST; 1 weeks 1 days agoDocs: https://github.com/kubernetes/kubernetesMain PID: 205214 (kube-proxy)Tasks: 13Memory: 22.4MCGroup: /system.slice/kube-proxy.service└─205214 /usr/local/bin/kube-proxy --config=/etc/kubernetes/kube-proxy.yaml --v=2Apr 15 16:47:57 master01 kube-proxy[205214]: I0415 16:47:57.081959  205214 shared_informer.go:270] Waiting for caches to sync for node config
Apr 15 16:47:57 master01 kube-proxy[205214]: I0415 16:47:57.084942  205214 proxier.go:1023] "Not syncing ipvs rules until Services and Endpoints have been received from master"
Apr 15 16:47:57 master01 kube-proxy[205214]: I0415 16:47:57.084944  205214 proxier.go:1023] "Not syncing ipvs rules until Services and Endpoints have been received from master"
Apr 15 16:47:57 master01 kube-proxy[205214]: I0415 16:47:57.180586  205214 shared_informer.go:277] Caches are synced for endpoint slice config
Apr 15 16:47:57 master01 kube-proxy[205214]: I0415 16:47:57.180645  205214 proxier.go:1023] "Not syncing ipvs rules until Services and Endpoints have been received from master"
Apr 15 16:47:57 master01 kube-proxy[205214]: I0415 16:47:57.180656  205214 proxier.go:1023] "Not syncing ipvs rules until Services and Endpoints have been received from master"
Apr 15 16:47:57 master01 kube-proxy[205214]: I0415 16:47:57.182189  205214 shared_informer.go:277] Caches are synced for node config
Apr 15 16:47:57 master01 kube-proxy[205214]: I0415 16:47:57.182212  205214 shared_informer.go:277] Caches are synced for service config
Apr 15 16:47:57 master01 kube-proxy[205214]: I0415 16:47:57.182436  205214 proxier.go:1050] "Stale service" protocol="udp" servicePortName="kube-system/kube-dns:dns...10.96.0.10"
Apr 15 16:49:57 master01 kube-proxy[205214]: I0415 16:49:57.075394  205214 graceful_termination.go:102] "Removed real server from graceful delete real server list" ...2.139:3300"
Hint: Some lines were ellipsized, use -l to show in full.

或者:

[root@master01 ~]# ps -efl|grep kube-proxy
4 S root     205214      1  0  80   0 - 318565 futex_ Apr15 ?       00:15:56 /usr/local/bin/kube-proxy --config=/etc/kubernetes/kube-proxy.yaml --v=2
0 S root     206389 144305  0  80   0 - 28180 pipe_r 15:40 pts/1    00:00:00 grep --color=auto kube-proxy

查看日志有没有明显报错

# 查看 kube-proxy 服务的日志
journalctl -u kube-proxy# 查看最近的 kube-proxy 日志(最近的 100 行)
journalctl -u kube-proxy -n 100# 实时查看 kube-proxy 日志
journalctl -u kube-proxy -f

查看 kube-proxy 运行模式

验证Kube-Proxy模式

curl 127.0.0.1:10249/proxyMode

根据自己的那个模式查看

Iptables 模式

我的是 ipvs 模式 这个事我在别的地方粘贴的。

在 “iptables” 模式中, 你应该可以在节点上看到如下输出:

iptables-save | grep hostnames
-A KUBE-SEP-57KPRZ3JQVENLNBR -s 10.244.3.6/32 -m comment --comment "default/hostnames:" -j MARK --set-xmark 0x00004000/0x00004000
-A KUBE-SEP-57KPRZ3JQVENLNBR -p tcp -m comment --comment "default/hostnames:" -m tcp -j DNAT --to-destination 10.244.3.6:9376
-A KUBE-SEP-WNBA2IHDGP2BOBGZ -s 10.244.1.7/32 -m comment --comment "default/hostnames:" -j MARK --set-xmark 0x00004000/0x00004000
-A KUBE-SEP-WNBA2IHDGP2BOBGZ -p tcp -m comment --comment "default/hostnames:" -m tcp -j DNAT --to-destination 10.244.1.7:9376
-A KUBE-SEP-X3P2623AGDH6CDF3 -s 10.244.2.3/32 -m comment --comment "default/hostnames:" -j MARK --set-xmark 0x00004000/0x00004000
-A KUBE-SEP-X3P2623AGDH6CDF3 -p tcp -m comment --comment "default/hostnames:" -m tcp -j DNAT --to-destination 10.244.2.3:9376
-A KUBE-SERVICES -d 10.0.1.175/32 -p tcp -m comment --comment "default/hostnames: cluster IP" -m tcp --dport 80 -j KUBE-SVC-NWV5X2332I4OT4T3
-A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-WNBA2IHDGP2BOBGZ
-A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-X3P2623AGDH6CDF3
-A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -j KUBE-SEP-57KPRZ3JQVENLNBR

对于每个 Service 的每个端口,应有 1 条 KUBE-SERVICES 规则、一个 KUBE-SVC- 链。 对于每个 Pod 末端,在那个 KUBE-SVC- 链中应该有一些规则与之对应,还应该 有一个 KUBE-SEP- 链与之对应,其中包含为数不多的几条规则。 实际的规则数量可能会根据你实际的配置(包括 NodePort 和 LoadBalancer 服务)有所不同。

IPVS 模式

在 “ipvs” 模式中, 你应该在节点下看到如下输出:

## 正常情况里面会有好多条目 我只是贴出来一部分,要不我那个太多了。
ipvsadm -ln
TCP  10.110.220.210:80 rr    ## 这个是svc 地址加端口,下面三个是Pod ip地址。-> 172.21.231.191:9376          Masq    1      0          0         -> 172.29.55.26:9376            Masq    1      0          0         -> 172.31.112.138:9376          Masq    1      0          0 

对于每个 Service 的每个端口,还有 NodePort,External IP 和 LoadBalancer 类型服务 的 IP,kube-proxy 将创建一个虚拟服务器。 对于每个 Pod 末端,它将创建相应的真实服务器。 在此示例中,服务主机名(10.110.220.210:80)拥有 3 个末端(172.21.231.191:9376、 172.29.55.26:9376 和 172.31.112.138:9376)。

测试 kube-proxy 是否可以代理

curl 10.110.220.210

输出如下:

hostnames-6ff7c698bc-wlxsn

如果这步操作仍然失败,请查看 kube-proxy 日志中的特定行,如:

Setting endpoints for default/hostnames:default to [172.21.231.191:9376 172.29.55.26:9376 172.31.112.138:9376]

如果没有看到这些,请尝试将 -v 标志设置为 4 并重新启动 kube-proxy,然后再查看日志。

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

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

相关文章

案例分享:使用RabbitMQ消息队列和Redis缓存优化Spring Boot秒杀功能

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c…

golang垃圾回收

4.29 Golang中GC回收机制三色标记与混合写屏障 第14讲-总结哔哩哔哩bilibili 三个阶段 gc垃圾回收 早期是 GO1.3 标记清除  之前的标记清除&#xff1a;开始标记找到可达对象&#xff0c;并标记&#xff0c;标记完后清楚未标记的 较长时间的STW&#xff0c;使程序暂停…

抄表自动化的实现与优势

1.界定与简述 抄表自动化是一种当代关键技术&#xff0c;致力于取代传统的手动式抄表方法&#xff0c;通过远程数据数据采集解决&#xff0c;完成电力工程、水、气等公用事业电力仪表的全自动载入。这一系统利用先进的感应器、物联网技术(IoT)设备及数据数据分析工具&#xff…

Centos7安装K8S集群环境

一、系统设置 1、关闭swap 临时关闭swap swapoff -a 永久关闭 注释掉 /etc/fstab 中的下面配置 #/dev/mapper/centos-swap swap swap defaults 0 0 2、 关闭SELinux kubelet不支持SELinux, 这里需要将SELinux设置为permissive模式 setenforce 0 sed -i s/^SELINUXenfo…

如何制作一个后台管理页面的路由以及功能实现

后台 文章目录 后台一、RESFUL API二、各模块路由处理1、分类模块1.1、GET /list 分类列表1.2、POST / 新增|编辑分类1.3、DELETE / 删除分类1.4、GET /option 分类选项列表 2、评论模块2.1、GET /list 评论列表2.2、DELETE / 删除评论2.3、PUT /review 修改评论审核 3、留言模…

企业私服中使用Maven,标准的setting.xml文件

Maven Maven是一个项目管理和理解工具。它主要服务于以下几个方面: 构建管理:Maven可用于构建和管理任何基于Java平台的项目。 依赖管理:Maven有一个中央仓库,用于保存大量常用的库文件。当进行项目构建时,Maven会自动下载所需的库文件到本地仓库,这极大地简化了库文件…

Linux基础IO(下)

目录 1. 缓冲区 1.1 定义 1.2 理解缓冲区 1.2.1 为什么要有缓冲区 1.2.2 缓冲区的工作原理 缓冲区什么时候写入&#xff0c;什么时候刷新&#xff1f; 2. 文件系统 2.1 什么是文件系统&#xff1f; 2.2 为什么要有文件系统&#xff1f; 2.3 认识文件的管理结构 2.…

机器学习:深入解析SVM的核心概念(问题与解答篇)【二、对偶问题】

对偶问题 **问题一&#xff1a;什么叫做凸二次优化问题&#xff1f;而且为什么符合凸二次优化问题&#xff1f;**为什么约束条件也是凸的半空间&#xff08;Half-Space&#xff09;凸集&#xff08;Convex Set&#xff09;半空间是凸集的例子SVM 约束定义的半空间总结 **问题二…

Flutter创建自定义的软键盘

参考代码&#xff1a; Flutter - Create Custom Keyboard Examples 本文贴出的代码实现了一个输入十六进制数据的键盘&#xff1a; &#xff08;1&#xff09;支持长按退格键连续删除字符&#xff1b; &#xff08;2&#xff09;可通过退格键删除选中的文字&#xff1b; &…

React 模板选择标准

在决定开发过程中采用哪个React模板时&#xff0c;这确实是一个需要考虑多方面因素的挑战。因为这不仅关乎应用程序的初始构建&#xff0c;更涉及其后续的扩展性、可维护性和整体性能。那么&#xff0c;面对众多现成的模板&#xff0c;我们如何挑选出最适合的解决方案呢&#x…

Spark-机器学习(8)分类学习之随机森林

在之前的文章中&#xff0c;我们学习了分类学习之支持向量机决策树支持向量机&#xff0c;并带来简单案例&#xff0c;学习用法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&a…

【论文阅读——基于拍卖的水平联邦学习后付款激励机制设计与声誉和贡献度测量】

1.原文名称 Auction-Based Ex-Post-Payment Incentive Mechanism Design for Horizontal Federated Learning with Reputation and Contribution Measurement 2.本文的贡献 我们提出了一种贡献度测量方法。我们建立了一个声誉系统。声誉易于下降&#xff0c;难以提高。结合声…

第6篇:创建Nios II工程之控制LED<一>

Q&#xff1a;还记得第1篇吗&#xff1f;设计简单的逻辑电路&#xff0c;控制DE2-115开发板上LED的亮与熄灭&#xff0c;一行Verilog HDL的assign赋值语句即可实现。本期开始创建Nios II工程&#xff0c;用C语言代码控制DE2-115开发板上的LED实现流水灯效果。 A&#xff1a;在…

Windows编译OpenCV及扩展模块

OpenCV官网只提供了OpenCV Windows 64位动态库且不包括扩展模块&#xff0c;如果需要32位动态库&#xff0c;或者需要扩展模块的功能&#xff0c;则需要下载源码进行编译。 1. 版本说明与下载地址 OpenCV下载 https://github.com/opencv/opencv/releases/tag/4.9.0 OpenCV扩展模…

企业选择内外网文件摆渡平台的常见三大误区

网络隔离技术现在已经广泛应用于企业安全管理中&#xff0c;企业使用逻辑隔离或物理隔离的方式将网络隔离为内外网进而隔绝外部有害网络攻击&#xff0c;保护内部重要数据资产&#xff0c;但网络隔离后企业仍存在数据交换的需求&#xff0c;此时就需要内外网文件摆渡平台来承担…

学习100个Unity Shader (16) --- 程序纹理简述

文章目录 理解参考 理解 程序纹理顾名思义&#xff0c;就是通过代码生成的纹理&#xff0c;然后传入材质&#xff0c;生成图像。 假设&#xff0c;给一个模型添加了材质&#xff0c;并赋予了一个shader。shader中有一个纹理属性叫_MainTex。 程序纹理简单来说就是&#xff0c;…

Mybatis 实现数据加密

Mybatis 实现数据加密 背景解决方案案例AesEncryptHandler使用 背景 在我们业务开发中会保存一些用户的敏感信息&#xff0c;比如&#xff1a;手机号、银行卡等信息&#xff0c;如果这些信息以明文的方式保存&#xff0c;那么是不安全的。假如&#xff1a;黑客黑进了数据库&am…

Python 点云体积计算(网格积分法)

点云体积计算 一、介绍二、代码示例三、结果展示一、介绍 网格积分法,是一种简单快速的估计点云体积的方法。其核心思想是将三维点云数据映射至二维平面上,随后将平面划分为多个规则格网。在每个格网内,统计点云数据的最高点与最低点之间的垂直距离,即高度差。接着,将高度…

人工智能_大模型044_模型微调004_随机梯度下降优化_常见损失计算算法_手写简单神经网络_实现手写体识别---人工智能工作笔记0179

然后对于,梯度下降,为了让训练的速度更好,更快的下降,又做了很多算法,可以看到 这里要知道Transformer中最常用的Adam 和 AdamW这两种算法. 当然,这些算法都是用于优化神经网络中的参数,以最小化损失函数。下面我会尽量以通俗易懂的方式解释它们的原理和适用场景。 1. **L-…

selenium设置元素隐藏和显示

常见元素隐藏情况 在HTML中&#xff0c;由于页面美化和用户交互的需求&#xff0c;元素隐藏的使用非常常见&#xff0c;比如下拉菜单、内容折叠、对话框以及上传文件框等。隐藏常见有以下几种表现形式&#xff1a; hidden&#xff1a;占据空间&#xff0c;无法点击 style"…