我们现在已经有了 pod ,那让他们相互访问不可以么?答案是,不可以,因为 pod 是有生命周期的,他可能随时被创建也可能随时被销毁
,而 每次新建 pod 就会给其分配一个随机的 ip
,并且 k8s 也会自动调控 pod 的数量。这就导致了 pod 之间直接访问是不现实的,如果有一个入口,可以动态绑定那些提供相同服务的 pod,并将其开放在固定端口
上,这样访问起来不就方便很多了么?这个入口在 k8s 中被称为service。
Service是一组逻辑Pods的抽像,并定义了这组逻辑Pods的访问策略,来解决应用之间的内部访问。
我们看下服务例子:
apiVersion: v1
kind: Service
metadata:
name: kubia
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: kubia
代理模型
目前k8s提供了三种服务代理模型
- userspace
- iptables:
默认配置
- ipvs
Kubernetesv1.2之前默认是userspace之后是iptables模式
,iptables模式性能和可靠性更好,但是iptables模式依赖健康检查,在没有健康检查的情况下如果一个pod不响应,iptables模式不会切换另一个pod上
Kubernetes v1.9版本会支持lvs
的ipvs模式目前还是beta版
服务类型
当前服务支持如下几种类型
ClusterIP
:通过集群的内部IP暴露服务, 不设置类型时,此值是默认值NodePort
:通过每个Node上的IP和静态端口暴露服务LoadBalancer
:外部云供商的负载均衡器ExternalName
:将服务映射成一个externalName(e.g. foo.bar.example.com)