首页 > 其他分享 >k8s service原理

k8s service原理

时间:2023-03-28 17:23:07浏览次数:47  
标签:iptables endpoint service KUBE 原理 k8s my kube

1. 为什么需要service

Pod是非永久性资源,会动态创建和销毁,pod的ip会变化,而service会动态感知pod的变化,而对调用方无感知,调用方只需要访问固定的service name就可以动态地访问后端的pod。

实现这个功能不单只靠service这个组件,还需要kube-dnsendpointkube-proxy的配合。

2. 创建service

为了方便理解,这里创建一个没有selector选择器的service:

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  #clusterIP: "10.96.96.111"
  type: NodePort
  ports:
  - protocol: TCP
    port: 8000         #设定Serivce对外提供服务的端口,当service类型为headless时,不需要该配置
    targetPort: 80     #设定容器(Pod)的端口,即Pod网络的端口。
    nodePort: 32111    #它仅在type为NodePort时才需要指定.

创建完后观察service的事件变化,发现只有一个add事件,配置如下:

{
	"metadata": {
		"name": "my-service",
		"namespace": "default",
		"uid": "8529449e-57b0-4f19-9c7c-eebc1930c3cf",
		"resourceVersion": "1074994",
		"creationTimestamp": "2023-03-28T07:33:01Z",
		"managedFields": [{
			"manager": "kubectl",
			"operation": "Update",
			"apiVersion": "v1",
			"time": "2023-03-28T07:33:01Z",
			"fieldsType": "FieldsV1",
			"fieldsV1": {
				"f:spec": {
					# ...
				}
			}
		}]
	},
	"spec": {
		"ports": [{
			"protocol": "TCP",
			"port": 8000,
			"targetPort": 80,
			"nodePort": 32111
		}],
		"clusterIP": "10.96.145.44",
		"clusterIPs": ["10.96.145.44"],
		"type": "NodePort",
		"sessionAffinity": "None",
		"externalTrafficPolicy": "Cluster",
		"ipFamilies": ["IPv4"],
		"ipFamilyPolicy": "SingleStack"
	},
	"status": {
		"loadBalancer": {}
	}
}

可以看到k8s立刻会为service分配一个ClusterIP,看看iptables里的记录:

iptables -t nat -L KUBE-SERVICES |egrep 'my-service'

此时是没有相关记录的。

3. 创建endpoint

一定要创建一个和service同名的endpoint:

apiVersion: v1
kind: Endpoints
metadata:
  name: my-service
subsets:
  - addresses:
      - ip: 10.244.0.13
    ports:
      - port: 80

这里我们为endpoint绑定了一个podIP:10.244.0.13,再观察iptables记录:

root@local-dev-control-plane:/# iptables -t nat -L KUBE-SERVICES |egrep 'my-service'
KUBE-MARK-MASQ  tcp  -- !10.244.0.0/16        10.96.145.44         /* default/my-service cluster IP */ tcp dpt:8000
KUBE-SVC-FXIYY6OHUSNBITIX  tcp  --  anywhere             10.96.145.44         /* default/my-service cluster IP */ tcp dpt:8000


root@local-dev-control-plane:/# iptables -t nat -L KUBE-SVC-FXIYY6OHUSNBITIX
Chain KUBE-SVC-FXIYY6OHUSNBITIX (2 references)
target     prot opt source               destination         
KUBE-SEP-6PNXU34HIRWIZKTJ  all  --  anywhere             anywhere             /* default/my-service */

root@local-dev-control-plane:/# iptables -t nat -L KUBE-SEP-6PNXU34HIRWIZKTJ 
Chain KUBE-SEP-6PNXU34HIRWIZKTJ (1 references)
target     prot opt source               destination         
KUBE-MARK-MASQ  all  --  10.244.0.13          anywhere             /* default/my-service */
DNAT       tcp  --  anywhere             anywhere             /* default/my-service */ tcp to:10.244.0.13:80

可以看到已经创建了相关的转发规则。

endpoint控制器

endpoint控制器会监听service资源的变化,来创建或更新endpoint资源。

如果我们创建一个带selector选择器的service,endpoint控制器就会创建一个同名的endpoint资源。

4. kube-proxy的作用

kube-proxy会同时监听service和endpoint的资源变化,来创建或更新iptables规则。这里就解释了为什么service和endpoint资源一定要同名,service里有clusterIP信息,endpoint里有podIP信息,kube-proxy根据两者的信息来创建iptables规则。

5. kube-dns的作用

  1. 监听service资源的变化,创建dns记录。
  2. 提供域名解析服务:pod通过service名称访问服务时,先从kube-dns里解析到clusterIP,然后通过iptables规则将请请求转发到后端pod。

标签:iptables,endpoint,service,KUBE,原理,k8s,my,kube
From: https://www.cnblogs.com/zqwlai/p/17265967.html

相关文章

  • 32、K8S-配置管理之Configmap
    1、基础知识1.1、场景需求生产中所有的应用程序中,都涉及到配置文件,而配置文件经常会有变更,比如数据库连接、代码版本号等.最典型场景就是:项目经历开发环境、测试环境......
  • mongodb和redis设计原理简析
    redis:1、NIO通信  因都在内存操作,所以逻辑的操作非常快,减少了CPU的切换开销,所以为单线程的模式(逻辑处理线程和主线程是一个)。  reactor模式,实......
  • 交换机的工作原理
    1.以太网帧的格式包的数据大小有(46---1500字节),帧的数据大小有(64---1518字节)帧是将目标地址、源地址等都进行了封装2.交换机的工作原理2.1插上交换机进入初始状态交换......
  • 【解答】MySQL MTR的实现原理与优势
    MySQLMTR(MySQLTestRun)是MySQL数据库测试框架,用于自动化测试MySQL数据库系统的功能和性能。MTR由MySQL官方提供,包含了大量的测试用例,可以对MySQL数据库系统的各......
  • 编程原理
    编程原理一、问题求解1、问题求解(ProblemSolving):指描述问题,以及开发计算机程序来解决问题的整个过程。这个过程经历多个阶段,包括理解待解决问题、设计概念化解决方案,以及用......
  • k8s-hpa
    kubectlscale对运行在k8s环境中的pod数量进行扩容(增加)或缩容(减小)。HPA:(HorizontalPodAutoscaler)Pod自动弹性伸缩,K8S通过对Pod中运行的容器各项指标(CPU占用、内......
  • k8s-pv/pvc
    默认情况下容器中的磁盘文件是非持久化的,对于运行在容器中的应用来说面临两个问题,第一:当容器挂掉kubelet将重启启动它时,文件将会丢失;第二:当Pod中同时运行多个容器,容器之......
  • let 运行原理
    1.servlet的工作过程以及容器的作用Servlet没有main()方法,他们受控与另外一个java应用,这个java应用称为容器(Container)。Tomcat就是这么一个容器,web服务器应用(如Apache)......
  • 超详细【入门精讲】数据仓库原理&实战 一步一步搭建数据仓库 内附相应实验代码和镜像
    超详细【入门精讲】数据仓库原理&实战一步一步搭建数据仓库内附相应实验代码和镜像数据和脚本感谢B站UP主哈喽鹏程!!!目录0.B站课程链接和搭建数据仓库资源下载1.环......
  • Aop原理
    AOP相关的概念1)Aspect:切面,切入系统的一个切面。比如事务管理是一个切面,权限管理也是一个切面。2)Joinpoint:连接点,也就是可以进行横向切入的位置。3)Advice:通知,切面在某个......