主頁 >  其他 > 開發環境下的 Kubernetes 容器網路演進之路

開發環境下的 Kubernetes 容器網路演進之路

2020-09-15 15:01:46 其他

馬蜂窩技術原創文章,更多干貨請搜索公眾號:mfwtech

使用 Docker+Kubernetes 來簡化開發人員的作業流,使應用更加快速地迭代,縮短發布周期,在很多研發團隊中已經是常見的做法,

如果說 Docker 提供的是應用級的主機抽象,那么 Kubernetes 的作用就是應用級的集群抽象,提供容器集群運行所需的基礎設施,旨在解決容器化應用的資源調度、部署運行、服務發現、擴容縮容等問題,

一直以來,容器網路設計都被認為是非常重要,但相對復雜的部分, 本文要介紹的 Kubernetes 網路,目前主要為馬蜂窩旅游網大多數 Java 業務提供開發環境的底層基礎設施,隨著團隊的調整及業務需求升級,整個系統對網路架構的要求也越來越嚴苛,基于這樣的背景,Kubernetes 網路過去一年多經歷了兩次比較重要的改造,以期不斷降低運維除錯成本,提高研發效率,

借由本文分享我們的實踐經驗,與君共勉,

 

Part.1 Kubernetes 網路原理及挑戰

1. Kubernetes Pod 設計

Pod 是 Kubernetes 的基本調度單元,我們可以將 Pod 認為是容器的一種延伸擴展,一個 Pod 也是一個隔離體,而 Pod 內部又包含一組共享的容器,

每個 Pod 中的容器由一個特殊的 Pause 容器,及一個或多個緊密相關的業務容器組成,Pause 容器是 Pod 的根容器,對應的鏡像屬于 Kubernetes 平臺的一部分,以它的狀態代表整個容器組的狀態,同一個 Pod 里的容器之間僅需通過 localhost 就能互相通信,

每個 Pod 會被 Kubernetes 網路組件分配一個唯一的(在集群內的 IP 地址,稱為 Pod IP,這樣就允許不同 Pod 中的服務可以使用同一埠 (同一個 Pod 中埠只能被一個服務占用),避免了發生埠沖突的問題,

2. 挑戰

Pod 的 IP 是在 Kubernetes 集群內的,是虛擬且局域的,這就帶來一個問題,Pod IP 在集群內部訪問沒有問題,但在實際專案開發中,難免會有真實網路環境下的應用需要訪問 Kubernetes 集群里的容器,這就需要我們做一些額外的作業,

本文將結合我們開發環境下基于 K8S 容器網路演進的程序,介紹在 Pod IP 為虛擬或真實 IP 情況下的幾種直接訪問 Pod IP 的解決方案,

 

Part.2 基于 Kubernetes 的容器網路演進

第一階段:Kubernetes + Flannel

最早,我們的網路設計方案只服務于大交通業務,初期大交通的 Java 應用是部署在物理機上的,團隊內部容器相關的底層基礎設施幾乎為 0,為了更加平穩地實作容器化的落地,中間我們沒有直接把服務全部遷移到 K8S 中去,而是經歷了一段混跑,

這個程序中必然會有物理機上的 Java 應用訪問 K8S 里 Java 容器的情況 (一個注冊中心),當時我們選用的網路架構是 Flannel VXLAN + Kube-proxy,主要是考慮到 Flannel 的簡潔性,

Flannel 是為 K8S 設計的一個非常簡潔的多節點三層網路方案,主要用于解決容器的跨主機通信問題,是一個比較大一統的方案,它的設計目的是為集群中的所有節點重新規劃 IP 地址的使用規則,從而使得不同節點上的容器能夠獲得「同屬一個內網」且「不重復的」IP 地址,并讓屬于不同節點上的容器能夠直接通過內網 IP 通信,

Flannel 的原理是為每個 host 分配一個 subnet,容器從此 subnet 中分配 IP,這些 IP 可以在 host 間路由,容器間無需 NAT 和 port  mapping 就可以跨主機通信,每個 subnet 都是從一個更大的 IP 池中劃分的,Flannel 會在每個 host 上面運行一個守護行程 flanneld,其職責就是從大池子中分配 subnet,為了各個主機間共享資訊,Flannel 用 ETCD 存放網路配置、已分配的 subnet、host 的 IP 等資訊,

Flannel 的節點間有三種通信方式:

  • VXLAN:默認配置,利用內核級別的 VXLAN 來封裝 host 之間傳送的包

  • Host-gw:二層網路配置,不支持云環境,通過在 host 的路由表中直接創建到其他主機 subnet 的路由條目

  •  UDP:通常用于 debug

我們在所有的業務物理機上都部署了 Flannel,并且啟動 Flanneld 服務,使之加入 K8S 虛擬網路,這樣物理機上的服務與 K8S 里的容器服務在互相呼叫時,就可以通過 Flannel+Kube-proxy 的虛擬網路,整體結構圖如下:

  • 流量 1 是部署在物理機和 K8S 容器里的應用注冊服務的線路

  • 流量 2 是兩個物理機節點互相呼叫時的線路

  • 流量 3 是物理機節點呼叫 K8S 容器應用時的線路,反之 app3 呼叫 app1 時就會直接訪問 app1 所在的物理機 IP

第二階段:Kubernetes + Flannel+ VPN-server

為了加速大交通業務微服務和容器化的落地,我們在團隊內部完成了開發環境容器化的改造,并將所有流量全部遷移到 K8S 編排系統上,

大交通整體的微服務改造基于 Dubbo,了解的朋友都知道,Dubbo 服務中 Consumer 和 Provider 的通訊很常見,對應到我們的場景就有了本地 Dubbo 服務 (Consumer) 消費開發環境微服務 (Provider),以及本地遠程 debug 開發環境的情況,但是 Dubbo consumer 從注冊中心拿到的都是容器的虛擬網路 IP,在集群外的真實網路環境里根本訪問不通,

為了解決這個問題,提高開發與聯調效率,我們開始了第一次 K8S 容器網路方案的改造,

我們設想,既然一個公司的員工可以通過撥通 VPN,從公網進入到公司的內網,那如果在 K8S 集群內部署一個 OpenVPN 的 Server,是不是也可以從集群外進入到集群的內網之中?實作思路如下圖所示:

  • 我們在集群的 middleware 空間下以 nodeport 的方式部署了 VPN Server,并給客戶端分配了 10.140 的網段

  • 當客戶端通過 172.18.12.21:30030 撥通 VPN 時,客戶端與 VPN Server 間的網路被打通

  • 因為 VPN Server 本身處于集群虛擬網路環境中,所以其他容器的 IP 對于 vpn server 是可見的,因此撥通 VPN 后,VPN 客戶端就可以直接對集群內的 Pod 進行訪問

改造后開發環境與機房 K8S 集群之間的網路架構圖如下所示:

通過在 K8S 集群里架設 OpenVPN,我們暫時解決了辦公區對機房 K8S 集群的 RPC 通訊問題,該方案的優缺點如下:

優點:

  • 快速實作

  • 工程量小

  • 網路隔離,證書驗證更安全

不足

  • 操作略繁瑣,如使用時需要申請證書,安裝客戶端軟體;每次使用前需要先打開 OpenVPN

  • 是一種中間方案,沒有從本質上解決問題

第三階段:基于 MAC-VLAN 的 Kubernetes CNI

為了更好地支持 Java 業務的微服務改造,避免重復造輪子,我們構建了統一的 Java 基礎平臺,之前的網路方案也面向更多的部門提供服務,

隨著服務的業務和人員越來越多,由人工操作帶來的不便和問題越來越明顯,我們決定對 K8S 網路進行再一次改造,從之前的經驗中我們感到,如果 K8S 的虛擬網路不去除,容器服務的 IP 是不可能直接由集群外的真實網路到達的,

為了快速滿足不同業務場景下對于 K8S 網路功能的需求,我們開始深入研究 CNI,

關于 CNI

CNI (Conteinre Network Interface) 旨在為容器平臺提供統一的網路標準,由 Google 和 CoreOS 主導制定,它本身并不是一個完整的解決方案或者程式代碼,而是綜合考慮了靈活性、擴展性、IP 分配、多網卡等因素后,在 RKT 的基礎上發展起來的一種容器網路介面協議,

CNI 的網路分類和主流的實作工具主要包括:

  • 第?類:與宿主機平??絡(2 層?絡或 3 層?絡),?絡插件主要包括 Bridge、MAC-VLAN 、IP-VLAN、Calico BGP、Flannel host-GW 等

  • 第?類:利? SDN 技術的虛擬?絡,?絡插件主要有:Flannel vxlan、Calico ipip、Weave 等

MAC-VLAN  及其帶來的問題

通過對比測驗,考慮到當下需求,我們最終決定基于網路改造、運維成本和復雜度都較低的 MAC-VLAN  方案:

MAC-VLAN 具有 Linux Kernal 的特性,用于給一個物理網路介面(parent)配置虛擬化介面,虛擬化介面與 parent 網路介面擁有不同的 mac 地址,但 parent 介面上收到發給其對應的虛擬化介面的 mac 包時,會分發給對應的虛擬化介面,有點像將虛擬化介面和 parent 介面進行了「橋接」,使虛擬化網路介面在配置了 IP 和路由后就能互相訪問,

在 MAC-VLAN 場景下,K8S 容器訪問可能會遇到一些問題,比如配置 MAC-VLAN 后,容器不能訪問 parent 介面的 IP,

通過調研,發現有以下兩種解決方案:

1. 虛擬網卡:打開網卡混雜模式,通過在宿主機上虛擬出一個虛擬網卡,將虛擬網卡與宿主機真實網卡聚合系結

2. PTP 方案:類似 Bridge 的簡化版,但是網路配置更復雜,并且有一些配置在自測程序中發現并沒有太大用處,與 Bridge 主要的不同是 PTP 不使用網橋,而是直接使用 vethpair+路由配置,

通過對比兩種方案的可實施性,最終我們選擇了第一種方案,但是第一種方案在虛擬機環境中經過測驗發現偶爾會有宿主機與本機容器不通的現象,建議采用第一種方案的同學盡量不要使用虛擬機環境(懷疑還是網卡混雜設定的問題),

「磁區而治」的網路改造

K8S 的核心組件 KubeDNS 在啟動時默認會訪問 ClusterIP 段的第一個 IP;如果繼續使用原有的 Nginx-ingress,那么 Nginx-ingress 的容器在啟動時也是使用 ClusterIP 去連接 KubeDNS,而使用 MAC-VLAN 給 KubeDNS 和 Nginx-ingress 分配的都是真實網路 IP,他們是無法聯通 ClusterIP 的,所以 KubeDNS 和 Nginx-ingress 容器又不能使用 MAC-VLAN 方案,否則容器服務的域名訪問能力將喪失,

綜合考慮之下,最終我們采取了「磁區而治」的措施,將不同類別的容器調度到不同的區域,使用不同的網路方案,大致的圖解如下:         

      

采用 MAC-VLAN 方案時容器 IP 的分配方案有兩種:DHCP 和 host-local,考慮到公司目前沒有統一的 DHCP 和 IPAM 服務器為容器分配 IP,開發環境的機器數量不多,我們就采用了人工參與每個節點的網路 IP 段分配,

綜上,此次改造后的網路架構圖大致如下:

效果

可以看到與第一次網路改造的架構圖對比:

  • 宿主機 1 和宿主機 2 上已經拋棄了 Kube-proxy 和 Flannel 這些虛擬網路的組件

  • 宿主機 1 和宿主機 2 這些業務容器節點直接使用了公司公共 DNS 設施

  • 辦公區本地 consumer 服務在注冊中心拿到 provider 的 IP 后,可以直接連接消費,反之亦可

  • K8S 集群分為了虛擬網路區 (運行 K8S  集群管理組件) 和真實網路區 (運行業務容器)

此次改造的優勢和不足總結為:

優點:

  • 遠程 debug

  • 辦公網與集群內服務間的 RPC,TCP 通訊在二層網路中打通

  • 網路延遲大大降低

  • 支持多機房容災部署

缺點:

  • 工程量大

  • 需要耗費大量真實 IP 地址

  • 集群規模很大時,存在 ARP 廣播風暴和交換機 MAC 表超限風險

 

Part.3 近期優化方向

每一次挑戰都是進步的基石,K8S 網路系統自上線以來,極大提高了 Java 業務容器化的運維效率,降低了運維成本,同時提供了更靈活、更穩定的服務運行環境,

在使用和改造 K8S 網路的程序中, 我們也遇到了很多問題,比如服務的優雅上下線、容器 HPA 的設定規則、容器模版的多樣化支持等等,近期我們將重點針對以下幾方面近一步優化和改進: 

1. 生產環境逐步進行網路改造,并實作集群多機房部署,提高容災能力

2. 對第二次網路改造中的虛擬網路區中的 Nginx-ingress 二次開發,使其支持使用公司公共 DNS,并且廢棄 SVC,徹底拋棄虛擬網路的使用

本文作者:張小伍,馬蜂窩旅游網交酒平臺研發工程師,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/47601.html

標籤:其他

上一篇:AWS re:Invent 2019參會有感

下一篇:記錄:一次使用私有LoadBalance provider,工具metallb的故障排除

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more