K8S之Service详解


参考视频:https://ke.qq.com/user/index/index.html#/plan/cid=1709963&term_id=102815140

一、概念

1.1.Service存在的意义

1.防止Pod失联(服务发现)
2.定义一组Pod的访问策略(负载均衡)

1.2.三种常用类型

(1)ClusterIP(集群内部使用)

默认方式,分配一个稳定的IP地址,即VIP,只能在集群内部访问

(2)NodePort(对外暴露应用)

在每个节点启用一个端口来暴露服务,可以在集群外部访问,通过NodeIP:NodePort访问

(3)LoadBalancer(对外暴露应用,适用于公有云)

与NodePort类似,在每个节点启用一个端口来暴露服务。除此之外,K8s请求底层云平台的负载均衡器,把每个[Node IP]:[NodePort]作为后端添加进去

二、Service代理模式

在这里插入图片描述
Service是由kube-proxy实现的

通过两种方式实现负载均衡规则,分别是iptables和IPVS

2.1.iptables模式

查看规则

iptables-save |grep <Service Name>

实现流程

接受流量->概率分配请求->根据分配请求转发到实际Pod

2.2.IPVS模式【推荐使用】

2.2.1.修改代理模式为ipvs

加载ip_vs相关内核模块

modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh

设置模式为ipvs

kubectl edit configmaps kube-proxy -nkube-system

在这里插入图片描述
删除kube-proxy的Pod,使配置文件生效

kubectl delete pod kube-proxy-9lvgh -nkube-system

查看Pod日志可以看到已改为ipvs模式
在这里插入图片描述

ipvsadm -Ln		#查看规则

在这里插入图片描述

三、示例

3.1.tomcat-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
spec:
  type: NodePort
  ports:
  - port: 8080
    name: service-port
    nodePort: 31005
  - port: 8005
    name: shutdown-port
  selector:
    tier: frontend

kubectl apply -f tomcat-service.yaml

3.2.解释

定义了一个名为tomcat-service的Service,服务端口为8080和8005,采用NodePort的方式对外提供服务,拥有“tier=frontend”这个标签的所有Pod示例都属于它。

3.3.验证

kubectl get svc

tomcat-service分配了一个ClusterIP为10.1.9.124,该Service的虚端口为8080和8005,8080指定了nodePort端口为31005,而8005没有指定,K8S会随机分配一个端口给它。
在这里插入图片描述

3.3.1.集群内通过ClusterIP+虚端口可以访问服务

在这里插入图片描述

3.3.2.集群外通过NodeIP+nodePort端口可以访问Service服务

在这里插入图片描述

kubectl get endpoints

10.244.1.15为Pod的IP地址,端口8080是容器暴露的端口,可以通过PodIP+端口号访问
在这里插入图片描述

kubectl get svc tomcat-service -o yaml

可以看到Service更详细的信息,如名字、命名空间、clusterIP、虚端口

port端口为ClusterIP的端口,用于集群内部访问;
targetPort为提供该服务的容器所暴露的端口号,如果在yaml文件没有指定targetPort,则默认targetPort与port相同

在这里插入图片描述

3.3.3.在Pod里面,建议通过ServiceName.Namespace.svc.cluster.local访问

在这里插入图片描述

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页