我们说下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即可