一、为什么Servcie能定位到Pod

因为Pod的IP是不固定的,所以Kubernetes需要Service,除此之外它还可以在多个Pod间负载均衡

Service的访问入口,其实是宿主机的kube-proxy生成的iptables规则 ,及kube-dns生成的DNS记录

Service通过label标签选中Pod,被选中的的Pod称为Service的Endpoints

示例如下

# kubectl get ep hostnames
NAME ENDPOINTS AGE
hostnames 10.244.0.241:9376,10.244.0.242:9376,10.244.0.243:9376 20m

可以看到,当我们访问hostnames这个service时,会被定位到10.244.0.241:9376,10.244.0.242:9376,10.244.0.243:9376

注意:只有处于Running状态,且readlinessProbe检查通过的Pod,才会出现在Endpoints列表里

我们再查看servcie

# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hostnames ClusterIP 10.111.15.33 <none> 80/TCP 23m

service列表的VIP(ClusterIP),是设置了一个固定的入口地址,并没有真正的网络设备,ping是没有响应的

通过访问10.111.15.33,就可以访问到它所代理的Pod了

Service的实现原理是由kube-proxy组件,加上iptables来共同实现的,当提交service后,会创建这样一条iptables规则

-A KUBE-SERVICES -d 10.111.15.33/32 -p tcp -m comment --comment "default/hostnames: cluster IP" -m tcp --dport 80 -j KUBE-SVC-NWV5X2332I4OT4T3

iptables规则 的含义是:凡是上的地址是10.111.15.33、目的端口是80的IP包,都会跳转到KUBE-SVC-NWV5X2332I4OT4T3的iptables链处理

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

这是一组随机模式的iptables链,这三条链是DNAT规则,三条链指向的最终目的地是Service代理的三个Pod

iptables规则的匹配是从上到下逐条进行的,为了让每条概率都相同,probability分别被设置成了1/3、1/2和1

当访问Service的VIP的IP包经过上述iptables处理后,就变成了访问具体某一个后端Pod的IP包了,这些Endpoints对应的规则,是kube-proxy通过监听Pod的变化事件,在宿主机上生成并的维护

二、Servcie在外部访问的三种方式

1. nodePort模式

示例yaml

apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
type: NodePort
ports:
- nodePort: 8080
targetPort: 80
protocol: TCP
name: http
- nodePort: 443
protocol: TCP
name: https
selector:
run: my-nginx

访问方式:<任何一台宿主机的IP地址>:8080

宿主机上没有任何一个代理的Pod存在,不能直接访问通过IP访问Pod,只能由宿主机转发

2.LoadBalancer

示例yaml

kind: Service
apiVersion: v1
metadata:
name: example-service
spec:
ports:
- port: 8765
targetPort: 9376
selector:
app: example
type: LoadBalancer

K8S使用了一个CloudProvier转接层,跟公有云api对拉,当LoadBalancer的Service被提交后,

K8S会在公有云创建一个负载均衡服务,把代理的Pod地址代理给负载均衡后端

3.ExternalName

示例yaml

kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
type: ExternalName
externalName: my.database.example.com

不需要label选择,相当于在kube-dns里添加了一条CNAME记录

访问my-servcie.default.svc.cluster.locl和访问my.database.example.com一样

另外,还允许配置公有IP地址

kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 9376
externalIPs:
- 80.11.12.10

三、解决问题思路

1.DNS无法访问Service

在一个 Pod 里执行nslookup排查

$ nslookup kubernetes.default
Server: 10.0.0.10
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local Name: kubernetes.default
Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local

2. Service无法通过ClusterIP访问时

检查这个Service的Endpoints

kubectl get endpoints hostnames
NAME ENDPOINTS
hostnames 10.244.0.5:9376,10.244.0.6:9376,10.244.0.7:9376

如果Pod的readniessProbe没通过,不会出现在Endpoints列表

如果Endpoints正常,再确认kube-proxy和宿主机的iptables是否正常

Kubernetes的Service运行原理的更多相关文章

  1. 场景9 深入RAC运行原理

    场景9 深入RAC运行原理 OPS(Oracle Parallel Server)通过磁盘的节点判定数据是否最新   —>   Data Guard   —>    RAC(Real Ap ...

  2. ASP.NET的运行原理与运行机制 如何:为 IIS 7.0 配置 <system.webServer> 节

    https://technet.microsoft.com/zh-cn/sysinternals/bb763179.aspx 当一个HTTP请求到服务器并被IIS接收到之后,IIS首先通过客户端请求的 ...

  3. JSP起源、JSP的运行原理、JSP的执行过程

    JSP起源 在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变. 如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序 ...

  4. Web Service工作原理

    Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的 ...

  5. ASP.NET Core 运行原理解剖[1]:Hosting

    ASP.NET Core 是新一代的 ASP.NET,第一次出现时代号为 ASP.NET vNext,后来命名为ASP.NET 5,随着它的完善与成熟,最终命名为 ASP.NET Core,表明它不是 ...

  6. jsp基本语法及运行原理

    一.jsp简介 JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它 是由Sun Microsystems公司倡导.许多公司参与一起建立 ...

  7. ASP.NET Core 运行原理解剖[3]:Middleware-请求管道的构成

    在 ASP.NET 中,我们知道,它有一个面向切面的请求管道,有19个主要的事件构成,能够让我们进行灵活的扩展.通常是在 web.config 中通过注册 HttpModule 来实现对请求管道事件监 ...

  8. kubernetes进阶(04)kubernetes的service

    一.service概念 Service是对一组提供相同功能的Pods的抽象,并为它们提供一个统一的入口.借助Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级.Service ...

  9. kubernetes实战之运行aspnetcore webapi微服务 - kubernetes

    1.预备工作 unbuntu 16.04 or above docker for linux kubernetes for linux 集群环境 2.使用vs2017创建一个web api应用程序,并 ...

随机推荐

  1. MockBean 单元测试

    案例一 官方文档:https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/ import org.juni ...

  2. sql注入(从入门到进阶)

    随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进 ...

  3. 卷积层后连接LSTM层的报错(InvalidArgumentError (see above for traceback): Incompatible shapes: [128] vs. [384])

    三通道编译通过但无法训练 报错 InvalidArgumentError (see above for traceback): Incompatible shapes: [128] vs. [384] ...

  4. 微信小程序中scroll-view的几个坑

    微信小程序中scroll-view的几个坑 1:设置scroll-x时,却不能横向滚动,因为view是block组件,但是这里用了flex就不能滚动了(想用flex布局,请开启属性enable-fle ...

  5. jmeter入门(环境搭建&运行&初识)

    最近了解了一些性能测试的基础知识和原理决定动手实践下,比较选择了jmeter 一.什么是jmeter Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试 ...

  6. Educational Codeforces Round 72 (Rated for Div. 2)

    https://www.cnblogs.com/31415926535x/p/11601964.html 这场只做了前四道,,感觉学到的东西也很多,,最后两道数据结构的题没有补... A. Creat ...

  7. 用 C# 来守护 Python 进程

    背景 目前我主要负责的一个项目是一个 C/S 架构的客户端开发,前端主要是通过 WPF 相关技术来实现,后端是通过 Python 来实现,前后端的数据通信则是通过 MQ 的方式来进行处理.由于 Pyt ...

  8. .NetCore技术研究-.NET Core迁移前的准备工作

    前段时间迁移.NET Core做了大量的试水和评估,今天整理一下分享给大家.大致有以下几个部分: 1. .NET Core的由来 2. 为什么要迁移.NET Core 3. .NET Core3.X主 ...

  9. Build step 'Invoke top-level Maven targets' marked build as failure Finished解决

    最近用法 jenkins部署maven项目时候,突然出现Build step 'Invoke top-level Maven targets' marked build as failure Fini ...

  10. 移动端适配(手机端rem布局详解)

    1. 问题的引出 如果html5要适应各种分辨率的移动设备,应该使用rem这样的尺寸单位,同时给出了一段针对各个分辨率范围在html上设置font-size的代码: html{font-size:10 ...