文章目录
Service控制器
Service存在的意义
Service存在主要是为了解决Pod的动态变化,提供统一访问入口。
- 防止pod失联,准备找到提供同一个服务的Pod(服务发现)
- 定义一组Pod的访问策略(负载均衡 )
Pod与Service的关系
Service通过标签关联一组pod。
Service为一组pod提供负载均衡能力。
service创建
[root@k8s-master ~]# vim service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: test
name: test1
spec:
ports:
- port: 80 # Service端口
protocol: TCP # 协议
targetPort: 80 # 容器端口
selector:
app: test # 关联pod的一组标签
type: NodePort # 服务类型
多端口Service定义
- 对于某些服务,可能需要公开多个端口,Service也需要配置多个端口定义,通过端口名称区分。
apiVersion: v1
kind: Service
metadata:
labels:
app: test
name: test
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
- name: test # 多个service端口需要添加name来区分
port: 9999
protocol: TCP
targetPort: 9999
selector:
app: test
type: NodePort
[root@k8s-master ~]# kubectl get service # 查看service是启动了2个端口
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 24h
test NodePort 10.105.75.166 <none> 80:31484/TCP,9999:31097/TCP 23h
Service常用的三种类型
ClusterIP:当不指定类型时,默认分配的时ClusterIP,会分配一个稳定的IP地址,即VIP,只能在集群内部进行访问
NodePort:每个节点上启动一个端口来暴露服务,可以在集群外部进行访问。也会分配一个稳定内部集群IP地址
- 访问方式:<任意Node节点IP>:<NodePort端口>
- 默认NodePort端口范围:30000-32767
**LoadBalancer:与NodePort相似,在每个节点上启用一个端口来暴露服务。kubernetes会请求底层云平台(如阿里云、腾讯云、AWS等)上的负载均衡器,将每个Node([NodeIP]:[NodePort])作为后端添加进去。 **
[root@k8s-master ~]# vim service.yaml
# 指定nodeport端口,不让随机生成
apiVersion: v1
kind: Service
metadata:
labels:
app: test
name: test
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
nodePort: 30003 # 指定nodeport端口
selector:
app: test
type: NodePort
Service代理模式
流程包流程:客户端 -》NodePort/ClusterIP(iptables/ipvs负载均衡规则)-》分布在各个节点Pod
查看负载均衡规则
- iptables模式
- iptables -save | grep
- ipvs模式
ipvsadm -L -n
Iptables和Ipvs对比
Iptables:
- 灵活,功能强大
- 规则遍历匹配和更新,呈线性时延
IPVS:(适合大规模的集群)
- 工作在内核态,性能更好
- 调度算法丰富:rr,wrr,lc,wlc,ip hash等