Service概念

  • Kubernetes Pod是有生命周期的,它们可以被创建,也可以被销毁,然而一旦被销毁生命就永远结束,
  • 每个 Pod 都会获取它自己的 IP 地址,可一旦销毁后,重新创建后,IP地址会产生改变。
    这时候我们通过 k8s中的Service 访问整个pod集群,只要Service不被销毁,pod不断发生变化 入口访问的ip总是固定。
  • Service资源用于为pod对象提供一个固定、统一的访问接口及负载均衡的能力,并借助新一代DNS系统的服务发现功能,解决客户端发现并访问容器化应用的问题。
  • kubernetes中的service是一种逻辑概念。它定义了一个pod逻辑集合以及访问它们的策略,service与pod的关联同样是通过label完成的。service的目标是提供一种桥梁,他会为访问者提供一个固定的访问IP地址,用于在访问时重定向到相应的后端。
  • Service 实现对pod 负载均衡
  • labels 标签 来管理 pod集群的

Service类型

    1. ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。一个Service可能对应多个EndPoint(Pod),client访问的是Cluster IP,通过iptables规则转到Real Server,从而达到负载均衡的效果
    1. NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个
    1. NodeIP:nodePort都将路由到ClusterIP。
    1. LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到:NodePort,此模式只能在云服务器上使用。
    1. ExternalName:将服务通过 DNS CNAME记录方式转发到指定的域名(通过 spec.externlName 设定)

1.在同一个命名空间下启动三个不同的pod
2.修改每个pod里面的 nginx 容器信息 例如 nginx 1 nginx2 nginx3

Endpoint(端点)

Endpoint 类似我们在之前所学习的 服务注册中心 (eureka、nacos)
Endpoint是kubernetes中的一个资源对象,存储在etcd中,用于记录一个service对应的所有pod的访问地址

# 查询服务详情查看端点
kubectl describe svc mayikt-clusterip -n mayikt-sit

# 查询服务端点ip
kubectl get endpoints -n mayikt-sit -o wide

命令

# 查询服务信息 [服务名] [命名空间]
kubectl describe svc mayikt-clusterip -n mayikt-sit

# 查询ip
iptables -t nat -nL |grep 80

# 查询正在运行的pod/服务
kubectl get pods,service

一、ClusterIP(内部访问)

默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。一个Service可能对应多个EndPoint(Pod),client访问的是Cluster IP,通过iptables规则转到Real Server,从而达到负载均衡的效果
Service 是由 kube-proxy 组件,加上 iptables 来共同实现的

apiVersion: v1
kind: Service
# 命名空间配置
metadata:
  name: mayikt-clusterip
  namespace: mayikt-sit
spec:
  # pod 标签选择器
  selector:
    app: nginx-pod
  clusterIP:          # service的ip地址, 如果不写默认会生成一个随机的IP
  type: ClusterIP     # service 类型
  ports:
  - port: 80          # Service端口
    targetPort: 80    # pod端口
  # 让同一个客户端的ip只会轮训到一个节点上  
  # sessionAffinity: ClientIP

可使用下方命令循环测试连接

while true ;do curl 10.103.216.229 ; sleep 1;done;

二、NodePort (节点端口, 暴露给外部可直接访问)

将我们的service端口映射到node节点上的一个端口,让后我们就可以通过 node节点ip:node节点端口访问接口。

各节点ip:30008 可以直接访问到, 节点中80端口的服务

apiVersion: v1
kind: Service
metadata:
  name: mayikt-service
  namespace: mayikt-sit
spec:
  selector:
    app: nginx-pod
  type: NodePort     # service类型
  ports:
  - port: 80         # Service端口
    nodePort: 30008  # 指定绑定的node的端口(默认的取值范围是: 30000-32767), 如果不指定,会默认分配
    targetPort: 80   # pod端口

在这里插入图片描述

三、LoadBalance

在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到:NodePort,此模式只能在云服务器上使用。
例如 f5 dns 轮询解析

四、Ingress

因为在pod多的时候,NodePort性能会急剧下降,如果你的k8s集群有成百上千的服务那岂不是要管理成百上千个NodePort
Ingress和我们之前提到的Service、Deployment也是一个k8s的资源类型,Ingress是用于实现用域名的方式访问k8s集群的内部应用,ingress受命名空间隔离

使用待定

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐