本章目录

  1. k8s中的三种网络
  2. service的构建及参数说明

 

一  k8s的三种网络

  在k8s集群中,k8s是有三种网络类型的,下面我们看一下下面这个图

 

K8S网络原理 lvs k8s三种网络_IP

  1 节点网络:顾名思义,节点网络就是你每台物理服务器或者虚拟机的物理IP地址

  2 Pod网络:k8s专门为了pod分配的一个网段。它是通过CNI网络插件(flannel或者calico等组件)来实现IP的分配。我们可以把CNI插件理解成为一个交换机,每个pod都连接在这个交换机上,pod依靠这个交换机获取自己的IP地址

  3 Service: 这是本章要讲的重点,service是为了k8s中某一组具有相同功能的pod应用提供一个稳定的统一的入口地址,然后service把请求负载均衡到后端的各个pod上面。

   为什么会出现service这种抽象功能:为了实现高度自动化,k8s中的pod启动在哪个节点上与pod分配了什么IP都是通过k8s自动实现的。我们无法通过具体的固定的某一IP来定位到我们想要的pod,因为pod一旦重启,ip就会发生变化,为了解决这种问题,

   k8s巧妙的利用了service的这一中间层充当固定的IP地址,所有同类型的pod都归一个service管理,只要找到这个service,无论podIP如何变化,service都能稳定的提供对应的业务功能

   相信大家都用过nginx负载均衡,其实这个service与nginx作为负载均衡的作用是类似

   

K8S网络原理 lvs k8s三种网络_K8S网络原理 lvs_02

  看完这个图相信大家对service就有大体的轮廓了

 

 

二  service的构建及参数说明

  我们先看一个service的构建模板

1 apiVersion: v1
 2 kind: Service
 3 metadata:
 4   name: demo-service
 5   labels:
 6     app: demo-service
 7   namespace: deafult
 8 spec:
 9   selector:             #标签选择器,指明哪些标签的pod被此service管理
10     app: aanginx
11   type: NodePort         #指明service的类型,一共有四种,clusterIP,nodeport,externalName,loadBalancer,其中默认的是cluster,
12   clusterIP: 10.xx.xx.xx   #虚拟服务IP地址,当type=clusterIP的时候,如果不指定,则默认分配,一般这项我们都会选择默认,所以在生产环境中最好不要自己制定IP,以免冲突
13   sessionAffinity: cluster   #是否支持session,可选值有俩个,一个是clusterIP,一个是NONE,默认NONE。
14   ports:
15   - name: nginx-port       #port名字,指不指定都行
16     protocol: TCP       #端口协议 可选项为TCP  UDP。现在多出来一个SCTP,默认的TCP
17     port: 80           #service的端口
18     target: 80          #容器的端口(或者叫做pod的端口,一般都是一个pod里面一个容器)
19     nodeport: 30002           #节点端口,此端口的作用是可以让外部IP访问到服务

 

  service的构建同样是四大部分,apiVersion,kind,metadata,spec。其中前三个变化不大,只有spec中的几个选项需要重点说明一下

  

  type:

  1. ClusterIP:虚拟服务的IP地址(默认的就是这个),该地址用来让k8s集群内部的pod访问
  2. NodePort: 使用宿主机的端口。外部通过k8s集群的node+port就能访问到服务
  3. ExternalName: 让k8s集群内部的pod能够访问到集群外的服务,
  4. LoadBalancer: 使用外接负载均衡器完成服务的负载分发

 

  sessionAffinity:

  NONE:当为空时,service对后端的pod进行轮询访问,类似nginx负载均衡策略中的轮询策略

  ClusterIP: 当指定为Cluster的时候,同一客户端(根据客户端的IP判定)的访问请求都转发达到同一个后端pod。类似于nginx中的URL_hash

 

  ports:

  下面我们说一下port,targetport,跟nodeport

  

K8S网络原理 lvs k8s三种网络_TCP_03

  根据上图我们可以知道,targetport属于pod容器的端口,比如nginx  Pod要映射出80端口,那么targetPort就写8080,端口

  port是属于service的端口,这个端口的作用用于在k8s集群中的pod进行通信,一般来说我们会将port的端口与targetPort的端口设置的相同以便于区分

  nodePort就是节点上的端口,它能够给外界提供访问。注意nodeport端口有设置范围的,30000<= nodeport <=32767,让然我们可以通过手动修改来更改这个端口号的范围  比如像把端口范围改成1-65535,则在apiserver的启动命令里面添加如下参数: 

  –service-node-port-range=1-65535

三 小结

  k8s  service的基础知识就这么多,当再生产环境中方 pod需要暴露给公网的时候需要用到ingress,ingress其实也是service的一部分,只不过要复杂的多,ingress后续会专门写一篇来做详细说明