我们说下Kubernetes中的网络对象

其一,便是Service,负责进行负载均衡的服务,暴露一组Pod让其他人进行服务发现

对于Service这个对象,我们之前也使用过,比如在讲解金丝雀部署的时候,我们就说了Service的作用

而且之前我们也说过Service对象中的TYPE,分别用过ClusterIP和NodePort,这一次我们连上之前说过的两个Type,详细的讲解一下Service这个对象

首先是Type这个字段.有ClusterIP 和 NodePort,LoadBalancer,ExternalName

ClusterIP:通过集群内部的IP暴露服务,这个服务只能在集群内部访问

NodePort:为每一个Node上都暴露一个Port供外部访问

LoadBalancer 利用云服务器提供的负载均衡器暴露服务,可以将流量路由到自动创建的NodePort或者ClusterIP服务上

ExternalName 利用这个服务,可以将外部的网络映射到内部的一个固定域名

1.      ClusterIP

是给出一个IP让集群内部访问,直接访问ServiceName也可以,其中ClusterIP可以手动指定,只要在ServerIP的CIDR范围内即可,如果ClusterIP设置为None,则会变为一个headless Service

2.      NodePort

不需要填充ClusterIP的字段,可以在Ports中设置对应的nodePort

图片

如果不手动指定nodePort,那么Kubernetes会在 –service-node-port-range的范围内分配端口,默认值为30000-32767

3.      ExternalName

图片

其他的Pod可以访问这个Service来访问其他的域名服务

4.      LoadBalancer

让云服务提供商来根据LoadBalancer来创建一个负载均衡,不建议使用

图片

之后是说一个和Service密切相关的对象,EndPoint

关于EndPoint,和Service的关系,就好比Deployment和ReplicaSet

我们使用kubectl describe svc来查看一个Service的详情

会发现其中有一项Endpoints:       xxxxx:xxxx

这就是当Service进行请求转发时,明确的目标IP

对应的对象就是EndPoint

kubectl get ep

KubeProxy实际上维护endpoint来帮助K8S找到对应的Pod IP

而这个对象实际上是可以edit的

而且有一种使用方式,就是Kubernetes的Service并不selector某些Label

而是书写一个EndPoint,让这个EndPoint的ServiceName和Service一致,从而自定义访问IP

之后我们说下Service其他的配置项

allocateLoadBalancerNodePorts        <boolean>

仍在实验室阶段,不建议使用

externalName <string>

以域名的方式指定externalName类型的Service访问什么

externalTrafficPolicy        <string>

可以使用的配置项有 local或者Cluster,如果指定为local,则直接会将请求转发给Pod,而不进行负载均衡,这可能导致流量分配不均,不建议使用

healthCheckNodePort  <integer>

用于LoadBalancer类型的Service,供云厂商的负载均衡器去检测集群内的Pod是否可用

internalTrafficPolicy        <string>

内部流量转发策略,默认是Cluster,可以设置为Local,但是当设置为Local的时候,kube-proxy只会将流量转发到当前节点上就绪的Pod,没有就丢弃这个请求

loadBalancerClass    <string>

允许不使用云提供商的默认负载均衡器,使用指定负载均衡器,当然云服务商如果没有指定的loadBalancerClass,则会丢弃这个请求

loadBalancerIP       <string>

期望云提供商使用指定的LoadBalancerIP,但云服务商可能忽略这个请求

loadBalancerSourceRanges     <[]string>

提供网段来限制有哪些客户端IP可以访问网络负载平衡器

publishNotReadyAddresses     <boolean>

是否为没有就绪的Pod准备地址

sessionAffinity      <string>

在ClusterIP下,是让客户端能够连接到同一个Pod的选项,设置为ClientIP即可开启

sessionAffinityConfig        <Object>

关于上面的session亲和性更多的设置

在上面的sessionAffinityConfig中,提供了一个Object对象,其实Object对象中能够设置的只有一个timeoutSeconds,也就是会话的过期时间

设置方式如下

SessionAffinityConfig:

ClientIP:

timeoutSeconds: 30

最后,扩展一下Pod也是可以指定hostname的

比如我么声明一个Service

apiVersion: v1

kind: Service

metadata:

name: default-subdomain

spec:

selector:

name: busybox

clusterIP: None

ports:

– name: foo # 实际上不需要指定端口号

port: 1234

targetPort: 1234

然后我们声明一个Pod

apiVersion: v1

kind: Pod

metadata:

name: busybox1

labels:

name: busybox

spec:

hostname: busybox-1

subdomain: default-subdomain

containers:

– image: busybox:1.28

command:

– sleep

– “3600”

name: busybox

在里面我们声明了hostname,并且设置了subdomain

需要注意subdomain设置需要和svc名称一样

这样,就可以不通过statefulset,直接使用Pod做到直接访问Pod了

相同名称空间

直接pod-hostname.svcname即可

不同名称空间

pod-hostname.svcname.namespace即可

发表评论

邮箱地址不会被公开。 必填项已用*标注