SVC功能
Deployment 维护pod.如果是pod出现问题导致重启,那么ip变了,此时对外(可能是集群外,集群内)的服务可能失效。引入service .对外提供服务指向不变。而service 根据标签将请求(RR轮询算法)导向对应的pod.<br /> 似乎SVC和nginx很类似。但是SVC只能提供4层负载能力即ip+port。如果想要更强得能力(7层负载)通过ingress可以做到。<br /> SVC的功能实际就是对外提供一个固定的服务指向。那么即使SVC 关联的PO ip改变。只要Pod标签不变,那么SVC都能将服务导向正确的Pod
SVC类型
- ClusterIp
在集群内部提供一个虚拟ip
- NodePort
在ClusterIp基础上,为每个机器绑定一个端口。使用nodeIP:nodePort 访问service
- LoadBalancer
在NodePort基础上,使用cloud provider 创建一个外部负载均衡器,将请求转发至NodeIP:NodePort.即将请求分发至不同node的Service上
- ExternalName
集群内部访问外部服务,为外部服务注册SVC .集群内部通过SVC 访问外部服务。即使外部服务ip修改,也不会影响集群内部的使用。此类型仅1.7版本或更高版本kube-dns支持
SVC代理模式分类
v1.0 代理实现由userspace实现; v1.1支持iptables代理; v1.2默认iptables ;v1.8.0-beta.0支持ipvs代理;v1.14默认使用ipvs代理
userspace
如图,
node内部访问:client Pod-》iptables-》kube-proxy-》server pod1;
node之间访问: client Pod -》iptables-》kube-proxy-》server pod2;
iptables
此模式,很明显请求通过iptables进行转发,虽说性能略微不足。但不走kube-proxy,减轻其压力
ipvs
很明显,相比iptables代理模式,将iptables替换成ipvs.除了更好的性能,其为负载均衡提供了更多的算法选择。而使用此模式需要额外做某些配置。
ipvs的使用需要node节点之上已经安装了ipvs内核模块。kube-proxy在启用ipvs代理模式时会校验是否安装了ipvs模块。如果未安装,则使用iptable 代理模式。
Ingress
本身SVC只能实现4层(ip+port)代理,通过Ingress实现7层代理。其实现方式有很多。比如nginx.apache等都能作为ingress的实现载体。 鄙人选择ingress-nginx.
目标
测试ClusterIP
通过创建一个pod的Deployment.并创建一个SVC与之联系。查看代理内容,之后删除pod.查看新增的pod其代理ip。
clusterIp-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: clusterIp-deploy
namespace: defalut
spec:
selector:
matchLabels:
app: myapp
release: stabel
replicas: 3
template:
metadata:
labels:
app: myapp
release: stabel
env: test
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
clusterIp-service.yaml
apiVerion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
type: ClusterIp
selector:
app: myapp
release: stabel
ports:
- name: http
port: 80
targetPort: 80