
Service控制器网络
1.存在的意义
解决Pod的动态变化,提供统一访问入口:
- 防止Pod失联,准备找到提供同一个服务的Pod,服务发现
- 定义一组Pod的访问策略,负责均衡
2.Pod与Service的关系
Service通过标签关联一组Pod
Service使用Iptables或者ipvs为一组Pod提供负载均衡能力
3.三种类型
- ClusterIP
默认ClusterIP,分配一个稳定的IP地址,既VIP,只能在集群内部访问,type: ClusterIP
- NodePort
在每个节点上启用一个端口来暴露服务,ClusterIP可以在集群外部访问。也会分配一个稳定内部集群IP地址
访问地址:<任意NodeIP>:
端口范围:30000-32767
- LoadBalancer
类似NodePort,在每一个节点上启用一个端口暴露服务,k8s会请求底层云平台上的负载均衡器,将每个Node的ip和port作为后端添加进去
4.代理模式
Service的底层实现主要有iptables和ipvs二种网络模式,决定了如何转发流量
1.修改ipvs网络模式
1.kubeadm方式修改ipvs模式:
# kubectl edit configmap kube-proxy -n kube-system ... mode: “ipvs“ ... # kubectl delete pod kube-proxy-btz4p -n kube-system注:
- kube-proxy配置文件以configmap方式存储
- 如果让所有节点生效,需要重建所有节点kube-proxy pod
2.二进制方式修改ipvs模式:
# vi kube-proxy-config.yml mode: ipvs ipvs: scheduler: "rr“ # systemctl restart kube-proxy注:配置文件路径根据实际安装目录为准
2.访问流程
客户端 ->NodePort/ClusterIP(iptables/Ipvs负载均衡规则) -> 分布在各节点Pod3.查看负载均衡规则:
• iptables模式iptables-save |grep
• ipvs模式ipvsadm -L -n
5.模式对比
- iptables
• 灵活,功能强大
• 规则遍历匹配和更新呈线性时延
- ipvs
• 工作在内核态,有更好的性能
• 调度算法丰富:rr,wrr,lc,wlc,ip hash...
5.DNS名称
CoreDNS:是一个DNS服务器,Kubernetes默认采用,以Pod部署在集群中,CoreDNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析
CoreDNS YAML文件:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/corednsClusterIP
A记录格式:..svc.cluster.local
示例:my-svc.my-namespace.svc.cluster.local
实现跨namespace与Service通信
通过Service的ExternalName类型即可实现跨namespace名称空间与Service通信。
Service域名格式:(service name).(namespace).svc.cluster.local,其中 cluster.local 为指定的集群的域名
6.定义与创建
多端口Service定义:对于某些服务,需要公开多个端口
Service也需要配置多个端口定义,通过端口名称区分。
apiVersion: v1 kind: Service metadata: name: web spec: type: ClusterIP ports: - name: http port: 80 protocol: TCP targetPort: 80 - name: https port: 443 protocol: TCP targetPort: 443 selector: app: web查看结果
#kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 14d web ClusterIP 10.106.15.76 <none> 80/TCP,443/TCP 6s