美文网首页Kubernetes
K8S集群网络浅析

K8S集群网络浅析

作者: ciiiii | 来源:发表于2020-04-03 16:52 被阅读0次

首发于:ciii's blog

概述

K8S官方文档集群网络描述了实现K8S网络的四个要点:

  1. 高度耦合的容器间通信
  2. Pod间通信
  3. Pod到Service的通信
  4. 外部到Service的通信
  1. Highly-coupled container-to-container communications
  2. Pod-to-Pod communications
  3. Pod-to-Service communications
  4. External-to-Service communications

解析

容器间通信

在这种情况下,一个Pod下的两个容器是共享存储、网络的,所以只需要通过localhost来进行互相访问。

Pod间通信

Pod间通信的基础是:

  1. 集群内的每一个Pod都拥有一个独立的IP
  2. 任意Pod可以通过IP互连

K8S是通过CNI(Container Network Interface)插件来实现这一扁平化的网络模型的,主要有以下几种:

  • Flannel
  • Calico
  • Weave Net

具体的原理和实现暂时略过,后续会在CNI专题中详细展开。

Pod到Service的通信

访问方式:

  • 集群内容器通过 <service>.<namspace>:<port> 访问跨namespace的service
  • 集群内容器通过 <service>:<port> 访问同namespace的service

主要过程:

DNS解析:

在容器中,根据 /etc/resolve.conf 中的配置进行解析,nameserver为集群DNS服务的ClusterIP,search域则是域名匹配的顺序。

nameserver 10.254.25.10
search default.svc.cluster.local svc.cluster.local cluster.local

根据该search域,匹配步骤如下(target为访问域名):

  1. target.default.svc.cluster.local
  2. target.svc.cluster.local
  3. target.cluster.local

每一步拼接得到的域名,都会查询集群DNS服务,若记录存在,则直接返回对应Service的ClusterIP。

Service负载均衡(非Headless Service):

上一步DNS解析中得到了Service的ClusterIP,映射到每一个Pod的PodIP的工作则是由kube-proxy负责的。

集群中的每个Node都运行了kube-proxy服务,它订阅了API server中的Service和Endpoint对象,一旦发生变化,就会修改本机的iptables规则。

当容器内访问Service的ClusterIP时,会被宿主机的iptables修改为对应Pods中任一Pod的IP,从而实现Pod到Service的通信。

外部到Service的通信

NodePort:

通过监听每个Node上的固定端口来暴露Service

当有NodePort类型的Service被创建时,kube-proxy就会创建对应的iptables规则,使访问<NodeIP>:<NodePort>的流量转发到对应的<PodIP>:<ContainerPort>上。

这种方式一般需要结合外部的LB来使用。

LoadBalancer:

通过Cloud Provider创建外部LB来暴露Service

LoadBalancer类型的Service绑定的外部LB把流量转发到<NodeIP>:<NodePort>上,本质上与NodePort类型的Service没有区别,只是自动创建并配置了外部LB。

Ingress:

通过Ingress Controller来路由暴露Service

上述两种暴露方式都只能暴露单一Service,如果一个集群中有若干Service需要对外暴露,Ingress的暴露方式会更合适。

不同于上述两种方式,只需要指定Service的类型,这里引入了Ingress资源:

  • 同时集群内还部署了一个Ingress Controller服务,并订阅了API server中的Ingress和Endpoint对象;
  • 当一个Ingress创建时,Ingress Controller会根据Ingress配置添加路由规则;
  • Ingress这种模式通过配置不同的路由把集群内多个Service通过一个Service来暴露出去。

总结

网络是K8S的核心,里面的每个部分都值得深入剖析,本文仅仅概述了其中个关键点,今后还会对CNI、kube-proxy、CoreDNS等组件详细分析。

相关文章

  • K8S集群网络浅析

    首发于:ciii's blog 概述 K8S官方文档集群网络描述了实现K8S网络的四个要点: 高度耦合的容器间通信...

  • flannel网络模式

    flannel,k8s的网络模型,为k8s集群内的容器提供网络服务的组件。 主要作用: 为集群内所有容器提供一个扁...

  • 【DAY02】Rancher容器云平台安装部署K8S集群(2)

    1 K8S集群对网络部分的优化 K8S集群对网络以及防火墙的配置优化 云主机操作配置端口范围即可image.png...

  • k8s专题目录

    初阶k8s集群搭建 高阶k8s HA 集群搭建(一) 高阶k8s HA 集群搭建(二) docker镜像私有仓库搭...

  • k8s集群变更 clusterDomain

    k8s集群变更 clusterDomain变更部分变更k8s集群 clusterDomain 所有node节点: ...

  • k8s-访问外网服务的两种方式

    需求 k8s集群内的pod需要访问mysql,由于mysql的性质,不适合部署在k8s集群内,故k8s集群内的应用...

  • k8s环境下,开发如何在本地联调?kt-connect详解

    它的作用类似VPN,能够打通k8s集群跟本地的网络。 主要有以下四种模式:Connect:本地网络直接访问k8s集...

  • k8s的网络发现

    k8s网络场景 容器与容器之间的通信 pod与pod之间的通信 pod到service之间的通信 集群外部与集群内...

  • mac本地安装minikube

    为了方便快速体验k8s集群,官方提供了minikube单节点集群,便于在本地安装学习使用。因为网络的原因,在安装过...

  • k8s 网络插件

    k8s 网络插件 跨node 为了实现不同node上的Pod通信,必须实现以下两点: 对k8s集群中所有node上...

网友评论

    本文标题:K8S集群网络浅析

    本文链接:https://www.haomeiwen.com/subject/cukkphtx.html