K8s网络从0到1
K8s网络从0到1
前言
K8s是一个强大的平台,但它的网络比较复杂,涉及很多概念,例如Pod网络,Service网络,Cluster IPs,NodePort,LoadBalancer和Ingress等等。为了帮助大家理解,模仿TCP/IP协议栈,我把K8s的网络分解为四个抽象层,从0到3,除了第0层,每一层都是构建于前一层之上。
第0层Node节点网络比较好理解,也就是保证K8s节点(物理或虚拟机)之间能够正常IP寻址和互通的网络,这个一般由底层(公有云或数据中心)网络基础设施支持。本文主要介绍第1到3层网络。
Pod网络概念模型
Pod相当于是K8s云平台中的虚拟机,它是K8s的基本调度单位。所谓Pod网络,就是能够保证K8s集群中的所有Pods(包括同一节点上的,也包括不同节点上的Pods),逻辑上看起来都在同一个平面网络内,能够相互做IP寻址和通信的网络。
同一节点上的Pod网络
Pod中可以有多个容器,这些容器共享Pod的网络栈和其它资源如Volume。共享网络栈意味着容器可以通过localhost相互访问,但同一端口上不能同时开启服务。
同一节点上的Pod网络依赖于3个关键网络设备:
- eth0:节点主机网卡
- docker0:虚拟网桥,相当于虚拟交换机
- veth0:Pod的虚拟网卡
Pod的IP由docker0网桥分配,例如:
- docker0网桥IP:172.17.0.1
- Pod1 IP:172.17.0.2
- Pod2 IP:172.17.0.3
在同一网段内,这些Pods可以进行IP寻址和互通。
不同节点间的Pod网络
不同节点间的Pod网络互通主要有两种方案:
-
路由方案
通过配置路由器支持Pod网络的转发。 -
覆盖网络方案
采用隧道封包技术,如flannel/weavenet等。
CNI简介
CNI(Container Network Interface)是K8s的Pod网络集成标准,不同的Pod网络技术可以通过CNI插件形式和K8s进行集成。
小结
- K8s网络分四层:节点网络、Pod网络、Service网络、外部接入网络
- 节点内Pod网络依赖虚拟网桥和虚拟网卡
- 节点间Pod网络可采用路由方案或覆盖网络方案
- CNI是Pod网络集成标准
Service网络
Service网络主要解决服务发现和负载均衡问题。
服务发现技术演进
-
DNS方案
-
Service Registry方案
K8s的Service网络原理
K8s通过ServiceName+ClusterIP统一屏蔽服务发现和负载均衡。
关键组件:
- Kubelet:负责启动Pod实例并向Master注册
- Kube-Proxy:监听Master,修改iptables规则
- Kube-DNS:实现ServiceName->ClusterIP映射
总结
- Service网络解决服务发现和负载均衡
- ClusterIP统一屏蔽服务发现和负载均衡
- 客户端通过Kube-Proxy + iptables转发实现
- 现代微服务发现机制和传统Linux内核机制的结合
外部接入网络
K8s通过NodePort、LoadBalancer和Ingress等方式将内部服务暴露到外部网络。
NodePort
通过Kube-Proxy在节点上暴露一个监听端口,将K8s内部服务暴露出去。
LoadBalancer
在NodePort基础上引入负载均衡器。
Ingress
在K8s内部部署反向代理服务,通过一个LB暴露多个服务。
Kubectl Proxy & Port Forward
本地调试K8s服务的简易方法:
- kubectl proxy
- kubectl port-forward
- kubectl exec
总结
- NodePort是基础,LoadBalancer依赖NodePort
- LoadBalancer提供公网访问支持
- Ingress通过反向代理暴露多个服务
- Service发布type:
- ClusterIP:仅内部访问
- NodePort:通过NodePort暴露
- LoadBalancer:通过LoadBalancer暴露