SVC功能

  1. Deployment 维护pod.如果是pod出现问题导致重启,那么ip变了,此时对外(可能是集群外,集群内)的服务可能失效。引入service .对外提供服务指向不变。而service 根据标签将请求(RR轮询算法)导向对应的pod.<br /> 似乎SVCnginx很类似。但是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支持

  • headless Service

    无头服务。

    SVC实现流程

    image.png
    实际上,通过kube-proxy将pod的信息写入iptables/或者后来的lpvs.

SVC代理模式分类

v1.0 代理实现由userspace实现; v1.1支持iptables代理; v1.2默认iptables ;v1.8.0-beta.0支持ipvs代理;v1.14默认使用ipvs代理

userspace

image.png
如图,
node内部访问:client Pod-》iptables-》kube-proxy-》server pod1;
node之间访问: client Pod -》iptables-》kube-proxy-》server pod2;

iptables

image.png
此模式,很明显请求通过iptables进行转发,虽说性能略微不足。但不走kube-proxy,减轻其压力

ipvs

image.png
很明显,相比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

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: clusterIp-deploy
  5. namespace: defalut
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: myapp
  10. release: stabel
  11. replicas: 3
  12. template:
  13. metadata:
  14. labels:
  15. app: myapp
  16. release: stabel
  17. env: test
  18. spec:
  19. containers:
  20. - name: nginx
  21. image: nginx:latest
  22. imagePullPolicy: IfNotPresent
  23. ports:
  24. - containerPort: 80

clusterIp-service.yaml

  1. apiVerion: v1
  2. kind: Service
  3. metadata:
  4. name: myapp
  5. namespace: default
  6. spec:
  7. type: ClusterIp
  8. selector:
  9. app: myapp
  10. release: stabel
  11. ports:
  12. - name: http
  13. port: 80
  14. targetPort: 80

image.png

测试无头服务

测试NodePort