K8S理念
容器云原生平台,屏蔽底层细节
核心要素
node节点(各种conditions控制) 和pod容器组
service服务和labelSelector(标签选择器)
集群架构
service层网络逻辑
1.会为Service创建一个本地集群的DNS入口,因此前端Pod只需要DNS查找主机名为 ‘backend-service’,就能够解析出前端应用程序可用的IP地址。
2.现在前端已经得到了后台服务的IP地址,但是它应该访问2个后台Pod的哪一个呢?Service在这2个后台Pod之间提供透明的负载均衡,会将请求分发给其中的任意一个(如下面的动画所示)。通过每个Node上运行的代理(kube-proxy)完成
控制器
针对POD的控制,由期望状态,通过控制器调整到目标状态
Deployment
StatefulSet
DaemonSet
CronJob
Jobs - Run to Completion
Ingress
非必须,可以起到路由转发作用,HTTP请求到service层中间增加路由功能
HTTP/HTTPS–>Ingress–>Service->kubeproxy–>Pod
网络模型
network namespace 进程的网络堆栈–>默认分配到 root networK Namespace
veth pair 跨多个network namespace进行通信(虚拟网卡)
网桥 ARP 判断是否本地转发
iptables进行NAT为互联网IP或者serviceIP
数据包的传递:Node-to-Internet
下图中:1.数据包从 Pod 的 network namespace 发出
2.通过 veth0 到达虚拟机的 root network namespace
3.由于网桥上找不到数据包目标地址对应的网段,数据包将被网桥转发到 root network namespace 的网卡 eth0。在数据包到达 eth0 之前,iptables 将过滤该数据包。
4.在此处,数据包的源地址是一个 Pod,如果仍然使用此源地址,互联网网关将拒绝此数据包,因为其 NAT 只能识别与节点(虚拟机)相连的 IP 地址。因此,需要 iptables 执行源地址转换(source NAT),这样子,对互联网网关来说,该数据包就是从节点(虚拟机)发出的,而不是从 Pod 发出的
5.数据包从节点(虚拟机)发送到互联网网关
6.互联网网关再次执行源地址转换(source NAT),将数据包的源地址从节点(虚拟机)的内网地址修改为网关的外网地址,最终数据包被发送到互联网
避免
避免建立迅速成功的Pod,造成K8S无法检测到成功,导致频繁拉起pod