《蹲坑學K8S》之19-3:Flannel通信原理

2021-01-08 DoDo在線

本章節主要學習Flannel網絡是如何通信,從而深刻理解從內部到外部,從外部到內部的資源訪問。

一、container-container通信原理解析

這種場景對於Kubernetes來說沒有任何問題,根據Kubernetes的架構設計。Kubernetes創建Pod時,首先會創建一個pause容器,為Pod指派一個唯一的IP位址。然後,以pause的網絡命名空間為基礎,創建同一個Pod內的其它容器(–net=container:xxx)。因此,同一個Pod內的所有容器就會共享同一個網絡命名空間,在同一個Pod之間的容器可以直接使用localhost進行通信。

二、Pod-Pod通信原理解析

flannel會在每一個宿主機上運行名為flanneld代理,其負責為宿主機預先分配一個子網,並為Pod分配IP位址。同時,Flannel使用etcd來存儲網絡配置、分配的子網和主機公共IP等信息。數據包則通過VXLAN、UDP或host-gw等轉發類型的後端機制進行數據轉發。

1、在同一個Node節點中不同Pod間通信

(1)查看k8s-node-1中Pod運行狀態

(2)查看k8s-node-1的IP位址以及路由

(3)查看k8s-node-1中Pod的IP位址

Pod-1:

Pod-2:

(4)測試連通性

2、在不同Node節點間不同Pod間通信

(1)查看Pod運行狀態

(2)查看Node節點上的IP位址:

K8s-Node-1:

K8s-Node-2:

(3)查看k8s-Node-1的Pod-1和k8s-Node-2的Pod-3的IP位址

Pod-1:

Pod-3:

(4)測試連通性

三、Pod-Service通信原理解析

Service是Kubernetes中最核心的概念,正是因為對此概念的支持,Kubernetes在某種角度下可以被看成是一種微服務平臺。Kubernetes中的pod並不穩定,比如由ReplicaSet、Deployment、DaemonSet等副本控制器創建的pod,其副本數量、pod名稱、pod所運行的節點、pod的IP位址等,會隨著集群規模、節點狀態、用戶縮放等因素動態變化。Service是一組邏輯pod的抽象概念,分配一個虛擬網絡,為一組pod提供統一入口,用戶只需與service打交道,service提供DNS解析名稱,負責追蹤pod動態變化並更新轉發表,通過負載均衡算法最終將流量轉發到後端的pod。

創建一個service時,相應會創建一個指向這個service的域名,域名規則為{服務名}.{namespace}.svc.{集群名稱}。全部為iptables維護和轉發。iptables則由kubelet維護。service僅支持udp和tcp協議,所以ping的icmp協議是用不了的,無法ping通service ip。

1、查看DNS

2、查看Pod

3、查看service

4、查看service詳細信息

四、Pod與外部通信原理

1、Pod訪問外部

(1)查看Pod的解析記錄

(2)查看去外網的路由表

(3)測試與外網的連通性

2、外部訪問內部群集

將服務暴露給外部客戶端,以便外部訪問kubernetes群集。方法有很多種,在這裡介紹以下兩種方式以便理解去原理:

(1)將服務的類型設置成NodePort

NodePort 服務是引導外部流量到你的服務的最原始方式。NodePort,正如這個名字所示,在所有節點(虛擬機)上開放一個特定埠,任何發送到該埠的流量都被轉發到對應服務。

(2)將服務的類型設置成LoadBalance

LoadBalancer 服務是暴露服務到 internet 的標準方式。在 GKE 上,這種方式會啟動一個Network Load Balancer,它將給你一個單獨的 IP 地址,轉發所有流量到群集中的服務。kubernetes默認應用此方式。所有通往你指定的埠的流量都會被轉發到對應的服務。它沒有過濾條件,沒有路由等。這意味著你幾乎可以發送任何種類的流量到該服務,像 HTTP,TCP,UDP,Websocket,gRPC 或其它任意種類。

這個方式的最大缺點是每一個用LoadBalancer暴露的服務都會有它自己的IP位址,每個用到的LoadBalancer都需要付費,這將是非常昂貴的。

1、查看service相信信息

2、從外部訪問內部Pod資源

相關焦點

  • 《蹲坑學K8S》之19-3:Flannel通信原理
    一、container-container通信原理解析這種場景對於Kubernetes來說沒有任何問題,根據Kubernetes的架構設計。Kubernetes創建Pod時,首先會創建一個pause容器,為Pod指派一個唯一的IP位址。
  • 《蹲坑學kubernetes》之19-2:部署Flannel
    查看網絡設置:[root@k8s-master ~]34;https://192.168.1.1:2379,https://192.168.1.2:2379,https://192.168.1.3:2379&39;{ &34;: &34;, &34;: {&34;: &34;}}& wget https://github.com/coreos/flannel
  • 《蹲坑學kubernetes》之19-1:Flannel原理
    一、Flannel工作原理每臺主機都安裝有flannel。Kubernetes定義的flannel網絡為10.1.0.0/16,各主機的flannel從這個網絡申請一個子網。pod1所在的主機的flannel子網為10.1.15.0/24,pod2所在主機的flannel子網為10.1.20.0/24。
  • 《蹲坑學Kubernetes》之:kubeadm部署Kubernetes-v1.18.6群集
    =3.2ETCD_VERSION=3.4.3-0CORE_DNS_VERSION=1.6.7 GCR_URL=k8s.gcr.ioALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers images=(kube-proxy:${KUBE_VERSION}kube-scheduler:${KUBE_VERSION
  • 初識K8S之理論和搭建
    3、 降低BUG率,本地和產線環境和代碼一樣的。三、為k8s的應用場景適合於大型分布式,集群,微服務,高可用,負載均衡,如果大型團隊和項目用它,還可以優化開發流程和節約成本。提供可靠的分布式數據存儲服務,用於持久化存儲K8s集群的配置和狀態apiservice:用戶程序(如kubectl)、K8s其它組件之間通信的接口。K8s其它組件之間不直接通信,而是通過APIserver通信的。
  • K8S的CNI插件對比:flannel vs. calico
    我們知道在單個節點上的的容器之間通信是通過內部的容器網絡進行通信,比如docker通過docker0網橋連接各容器子網,k8s作為一種分布式容器編排框架,那容器之間是怎麼完成通信的呢?k8s 是一個分布式的容器編排框架,k8s 本身沒有對容器之間的通信網絡進行實現,而是通過 CNI 定義了容器網絡的接口的形式,讓其他組件實現CNI來實現容器間的網絡通信,那麼CNI主要解決什麼問題呢?第一,如何保證每個Pod擁有一個集群內唯一的IP位址?
  • 《蹲坑學K8S》之19-4:部署Calico網絡
    Calico 節點組網可以直接利用數據中心的網絡結構(無論是 L2 或者 L3),不需要額外的 NAT,隧道或者 Overlay Network。此外,Calico 基於 iptables 還提供了豐富而靈活的網絡 Policy,保證通過各個節點上的 ACLs 來提供 Workload 的多租戶隔離、安全組以及其他可達性限制等功能。
  • Kubernetes之POD、容器之間的網絡通信
    >3)不同Node,不同POD我們先來看看上面的不同場景是怎麼通信的同一個POD上Container通信在k8s中每個Pod中管理著一組Docker容器,Flannel就是k8s中比較出名的一個。flannelflannel組建一個大二層扁平網絡,pod的ip分配由flannel統一分配,通訊過程也是走flannel的網橋。
  • 《蹲坑學K8S》之19-6:部署Weave網絡
    這樣,容器網絡為所有容器都連接到weave網橋weave網橋通過veth pair連到內核的openvswitch模塊跨主機容器通過openvswitch vxlan通信policy controller通過配置iptables規則為容器設置網絡策略
  • Kubernetes之POD、容器之間的網絡通信
    我們這裡需要區分一下不同的場景1)在同一個POD上Container通信2)同一個Node,不同POD3)不同Node,不同POD我們先來看看上面的不同場景是怎麼通信的同一個POD上Container通信在k8s中每個Pod中管理著一組Docker容器,這些Docker容器共享同一個網絡命名空間
  • Kubeadm部署Kubernetes-v1.19.0群集
    =3.2ETCD_VERSION=3.4.9-1CORE_DNS_VERSION=1.7.0GCR_URL=k8s.gcr.ioALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containersimages=(kube-proxy:${KUBE_VERSION}kube-scheduler:${KUBE_VERSION}kube-controller-manager
  • Centos7搭建k8s環境教程,一次性成功,收藏了
    本篇文章,安裝大步驟如下:安裝docker-ce 18.09.9(所有機器)設置k8s環境前置條件(所有機器)安裝k8s v1.16.0 master管理節點安裝k8s v1.16.0 node工作節點
  • 每天5分鐘|輕鬆掌握開發工作中必會的k8s-k8s安裝與部署
    上一章我們介紹了k8s的核心組件,了解了這些,我們就可以開始k8s的安裝和部署了。來吧,動手吧!準備好兩伺服器(系統是centos7.3),分別作為matser和node,如下:要讓k8s能夠管理我們的集群,需要在所有的節點上面分別安裝k8s的組件。在安裝之前,需要在兩臺節點上做如下的操作。
  • 《蹲坑學K8S》之19-5:二進位部署Calico網絡
    kubelet添加cni配置[root@k8s-master ~] wget https://docs.projectcalico.org/manifests/calico-etcd.yaml 2、下載鏡像[root@k8s-master ~] docker pull calico/cni:v3.14.0
  • 《蹲坑學K8S》之20-3:Ceph存儲
    /etc/ 注意:ceph-1、ceph-2和ceph-3都要重啟chronyd服務。添加硬碟(1)ceph-1、ceph-2和ceph-3伺服器中各添加一塊硬碟。 (二)在客戶端(k8s-node-1、k8s-node-2和k8s-master)上安裝ceph
  • Centos7搭建k8s環境教程,一次性成功,收藏了!
    本篇文章,安裝大步驟如下:安裝docker-ce 18.09.9(所有機器)設置k8s環境前置條件(所有機器)安裝k8s v1.16.0 master管理節點安裝k8s v1.16.0 node工作節點安裝flannel(master)這裡有重要的一步,請記住自己master和node之間通信的ip,如我的
  • kubeadm創建高可用集群v1.19.1
    通過kubernetes構建容器雲平臺第二篇,最近剛好官方發布了V1.19.0,本文就以最新版來介紹通過kubeadm安裝高可用的kubernetes集群。市面上安裝k8s的工具很多,但是用於學習的話,還是建議一步步安裝,了解整個集群內部運行的組件,以便後期學習排錯更方便。。。
  • 詳解kubeadm安裝k8s集群常見問題
    /kube-proxy:v1.18.8docker rmi gotok8s/kube-proxy:v1.18.8docker pull gotok8s/pause:3.2docker tag gotok8s/pause:3.2 k8s.gcr.io/pause:3.2docker rmi gotok8s/pause:3.2docker pull gotok8s/etcd:3.4.3-0docker
  • kubeadm安裝kubernetes/k8s的詳細筆記(包括各種坑和注意事項)
    上一篇文章(),筆者簡單的介紹了k8s已經用rancher來快速安裝k8s集群,非常簡單,因為中間的安裝過程極其中的細節rancher都幫我們封裝好了,但是建議對於k8s的初學者不要通過這樣的方式去學習k8s,當然不是說rancher封裝的不好,相反是rancher做的太好,封裝的太好了,把安裝細節,把k8s涉及到的基本概念,設計思想都隱藏掉了,對應初學者去理解k8s是不好的。
  • 乾貨|帶您了解k8s
    3)docker machine(docker原生):可以將一個主機迅速初始化到docker swarm集群裡。以上三個稱為docker三劍客。Docker的第二類編排工具:mesos:它不是docker的編排工具,而是資源分配工具。所以mesos必須要依賴於容器編排框架marathon。