k8s中pod是有生命周期的,如果podIP发生变化,跟他向关联的服务就会找不到pod。

service就是为了解决这个问题,每个service和一个或一组pod绑定,可以理解为 service是pod的代理,service中记录着pod的IP,pod发生变化会通知service,我们访问service它会把请求转发给pod

service IP是逻辑存在的记录在iptables或ipvs中。

网络简述

k8s CNI组件flannel 和calico 网络原理 - 三木燕 - 博客园

每一个pod会生成一个根容器,根容器创建网络命名空间,在调用cni配置网络接口,使用cni扩展插件calico或flannel为容器分配IP 完成网络通讯

flannel: vxlan 等技术实现二层通讯。

通信流程:

  1. pod-a访问pod-b 因为两者IP不在同一个子网,首先数据会先到默认网关也就是cni010.64.0.1
  2. 节点上面的静态路由可以看出来10.64.1.0/24 是指向flannel.1的
  3. flannel.1 会使用vxlan协议把原始IP包加上目的mac地址封装成二层数据帧
  4. 原始vxlan数据帧无法在物理二层网络中通信,flannel.1 (linux 内核支持vxlan,此步骤由内核完成)会把数据帧封装成UDP报文经过物理网络发送到node-02
  5. node-02收到UDP报文中带有vxlan头信息,会转交给flannel.1解封装得到原始数据
  6. flannel.1 根据直连路由转发到cni0 上面
  7. cni0 转发给pod-2

calico: 三层路由网络,支持复杂的网络策略,每一个节点类似一个路由

k8s集群中有三类IP

Node NetWork(节点网络)

Pod NetWork(pod网络)  这两种网络是真是存在的

Cluster NetWork(集群网络) 存在于逻辑上的地址,只出现在Service的规则中。

Service 资源清单:

kubectl explain service

apiVersion: v1
kind: Service
metadata:# svc 名称name: my-service
spec:# 通过选择器,绑定后端podselector:dep: app1-podports:# svc port- port: 80# 绑定的pod端口targetPort: 80

其他常用字段:

allocateLoadBalancerNodePorts <boolean>

clusterIP <string>

#动态分配的地址,也可以自己在创建的时候指定,创建之后就改不了了

clusterIPs <[]string>

externalIPs <[]string>

externalName <string>

externalTrafficPolicy <string>

healthCheckNodePort <integer>

ipFamilies <[]string>

ipFamilyPolicy <string>

loadBalancerIP <string>

loadBalancerSourceRanges <[]string>

publishNotReadyAddresses <boolean>

selector <map[string]string> #通过标签选择器选择关联的pod有哪些

sessionAffinity <string>

sessionAffinityConfig <Object>

#service在实现负载均衡的时候还支持sessionAffinity,sessionAffinity

什么意思?会话联系,默认是none,随机调度的(基于iptables规则调度的);如果我们定义sessionAffinity的client ip,那就表示把来自同一客户端的IP请求调度到同一个pod上

topologyKeys <[]string>

type <string>  #定义service的类型

service的四种类型

ExternalName:适用于集群中不同命名空间中的访问。

示例:

apiVersion: v1
kind: Service
metadata:name: my-externamespace: dev
spec:type: ExternalName# 其他命名空间中FQDN(完全合格域名)externalName: my-service.default.svc.cluster.local
---
apiVersion: v1
kind: Pod
metadata:name: test-pod5namespace: dev
spec:containers:- name: bixbuy# 最新版镜像与k8s不兼容会出现解析失败情况image: busybox:1.28.4command: ["/bin/sh","-c","sleep 36000"]

解析命令 nslookup   svc名

ClusterIP:通过k8s集群内部IP暴露服务,选择该值,服务只能够在集群内部访问(默认)

NodePort:通过每个Node节点上的IP和静态端口暴露k8s集群内部的服务

apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:dep: app1-podports:- port: 80# 外部端口,创建集群时的端口范围nodePort: 30078targetPort: 80# 类型type: NodePort

LoadBalancer:使用云提供商的负载均衡器,可以向外部暴露服务。

service只要创建完成,我们就可以直接解析它的服务名,每一个服务创建完成后都会在集群dns中动态添加一个资源记录,添加完成后我们就可以解析了,资源记录格式是:

SVC_NAME.NS_NAME.DOMAIN.LTD.

服务名.命名空间.域名后缀

集群默认的域名后缀是svc.cluster.local.

映射外部服务示例:

创建svc时会创建个同名的Endpoints完成绑定操作,通过操作Endpoints实现绑定外部服务

apiVersion: v1
kind: Service
metadata:name: mysql-svc
spec:# 定义svc,只指定开放的端口ports:- port: 3306

此时查看详情发现没有绑定Endpoints

创建Endpoints

apiVersion: v1
kind: Endpoints
metadata:name: mysql-svc
subsets:
- addresses:- ip: 192.168.1.23ports:- port: 3306

kube-proxy

service 只是把应用对外提供服务的方式做了抽象,应用是跑在容器中,我们的请求是需要发送到个个node上的。kube-proxy部署在k8s的没一个节点上,是k8s的核心组件,我们创建一个service时会在iptables上追加一些规则,实现路由及负载均衡等功能。k8s 1.8之前默认使用iptables模式,但随着service越多,规则链的数量越多,其性能会明显下降。之后引入了ipvs规则来采用hash表。加快查询速度。小集群还是选择iptables

一组pod通过标签绑定到一个svc(Cluster  IP), 这个 IP 是个虚拟IP 由iptables管理通过Endpoints实现的,集群内通过访问这个Cluster IP:Port就能访问到集群内对应的serivce下的Pod.

三种工作方式:

Userspace方式

client 请求发送到 server iptables,  iptables转发请求给kube-proxy接口,kube-proxy处理完毕把请求发送给指定的pod,再把请求发送给iptabels 由iptabels在转发给各个节点的pod

iptables方式

client 直接请求本地server Ip 根据iptables 分发到个个节点的pod(nat转发)

ipvs方式

与iptables类似,ipvs为负载均衡算法提供了更多选项,例如:

rr:轮询调度

lc:最小连接数

dh:目标哈希

sh:源哈希

sed:最短期望延迟

nq:不排队调度

以上不论哪种,kube-proxy都通过watch的方式监控着apiserver写入etcd中关于Pod的最新状态信息,它一旦检查到一个Pod资源被删除了或新建了,它将立即将这些变化,反应再iptables 或 ipvs规则中,以便iptables和ipvs在调度Clinet Pod请求到Server Pod时,不会出现Server Pod不存在的情况。自k8s1.11以后,service默认使用ipvs规则,若ipvs没有被激活,则降级使用iptables规则.

k8s - service相关推荐

  1. 使用kubectl port-forward暴露minikube k8s service端口

    kubectl port-forward暴露minikube k8s service端口 第一种方式 minikube service hello-minikube 第二种方式: kubectl po ...

  2. Kubernetes系列之理解K8s Service的几种模式

    原文地址:Kubernetes系列之理解K8s Service的几种模式 今天给大家介绍下k8s的service的几种访问模式. 概述 我们知道pod的ip不是固定的,是根据所在宿主机的docker0 ...

  3. k8s - Service ExternalName

    类型ExternalName 类型为 ExternalName 的服务将服务映射到 DNS 名称,而不是典型的选择器,例如 my-service 或者 cassandra. 您可以使用 spec.ex ...

  4. k8s service type_k8s重器之Service

    Service是k8s的核心,通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并将请求进行负载分发到各个容器应用上. 目录: Service定义详解 Service基本 ...

  5. k8s service:ingress

    介绍 k8s默认的service只能代理四层,七层代理就要使用ingress实现. 比如:要配置https加密访问,如果没有ingress,只能对Apache每一个都配置https,然后通过servi ...

  6. k8s service服务发现详解:ipvs代理模式、服务类型

    目录 k8s服务发现Service 理解 Service的实现模型 userspace代理模式 iptables代理模式 ipvs代理模式 Service定义 Service配置清单重要字段 创建Cl ...

  7. k8s service type_通过搭建MySQL掌握k8s(Kubernetes)重要概念(上):网络与持久卷...

    点击上方蓝色"Go语言中文网"关注我们,设个星标,每天学习 Go 语言 前一篇"通过实例快速掌握 k8s(Kubernetes)核心概念[1]"讲解了 k8s ...

  8. k8s service对象初识

    service 四种类型 clusterIp NodePort LoadBalancer ExternalName是别名 service是实现负载均衡的一个对象通过kube-proxy创建ipvs 或 ...

  9. k8s service:ClusterIP、NodePort、LoadBalancer、ExternalName

    ClusterIP Deployment.yaml service.yaml ipvsadm -Ln headless service dig需要安装bind-utils NodePort 30715 ...

最新文章

  1. wpf 如何设置弹出窗口必须关闭才能打开其他软件_CAD如何打印才能不留白?原来打印图纸还有这么多技巧?...
  2. Android开发之旅:HelloWorld项目的目录结构
  3. 搜索引擎新架构:与SQL不得不说的故事
  4. CentOS统的7个运行级别的含义
  5. OJ1031: 判断点在第几象限
  6. React 第十一章 组件的组合使用
  7. Atitit 个人信息数据文档知识分类
  8. html5显示特殊符号,HTML5特殊符号怎么显示-电脑自学网
  9. pandorabox 潘多拉固件路由器作为无线打印机服务器记录
  10. 记一次awvs14安装、破解之路~
  11. python有道批量单词音标整理-使用有道API在线批量翻译单词
  12. php汉字转换拼音,php实现汉字转拼音
  13. 乔布斯其人的演讲技巧
  14. STM32H7B0 HAL OSPI配置的一次失败原因分享
  15. python中的figure什么意思_Python Matplotlib.figure.Figure.text()用法及代码示例
  16. 用计算机解决问题听课笔记,《用计算机解决问题的一般步骤》说课稿
  17. vue中v-model详解
  18. IK分词器的安装和扩展词典的使用
  19. 660万明文密码泄露,知名广告公司Clixsence被黑客端了个底朝天
  20. python实现自动化抢微信红包功能_【Python】用Python实现微信自动化抢红包,再也不用担心抢不到红包了...

热门文章

  1. Spring 面向切面编程(AOP) D5
  2. 学习规律及其在学习中的应用
  3. 基于微信小程序的网上订餐系统 报告+任务书+开题报告+文献综述+中期PPT+外文翻译及原文+PPT+项目源码及数据库文件
  4. 监控安装ESXi on Arm的树莓派4b的CPU温度
  5. python01g内存读取10g文件并排序_将大文件逐行读取到Python2.7中时的内存使用
  6. 存档:全球各国名称中英文对照表
  7. JAVA:实现求StandardDeviation标准差算法(附完整源码)
  8. [css] 【转载】 精简高效的CSS命名准则/方法
  9. 程鑫峰:1.19伦敦金陷多空交织,长江金业后市行情解析
  10. Splunk中12小时制AM/PM的日期转换