1. 程式人生 > >應用開發者必須瞭解的Kubernetes網路二三事_Kubernetes中文社群

應用開發者必須瞭解的Kubernetes網路二三事_Kubernetes中文社群

在容器領域內,Kubernetes已毋庸置疑成為了容器編排和管理的社群標準。如果你希望你所搭建的應用程式能充分利用多雲(multi-cloud)的優勢,有一些與Kubernetes網路相關的基本內容是你必須瞭解與考慮的。

Kubernetes網路基本的部署排程單元:Pod

Kubernetes中的基本管理單元並非是一個容器,而是一個叫做pod的東西。我們認為部署了一個或多個容器的環境是一個pod單元。通常情況下,它們代表了提供部分服務的單個功能端點。

舉兩個有效的pods單元為例:

  • 資料庫pod — 一個單一MySQL容器
  • Web pod — 包含一個python例項的容器及包含Redis資料庫的容器

pods具有以下常用的特性:

  • 它們共享資源 — 包括了網路棧和名稱空間
  • pod包含了一個IP地址,用於客戶端連線
  • pod的配置定義了任意公共埠以及哪個容器佔用該埠
  • pod中的全部容器可以通過網路中的任意埠進行互動(這些容器都會被本地引用,因此需要確保pod中的服務都有唯一的埠)

Kubernetes服務(Kubernetes Services)

Kubernetes服務位於負載均衡器之後,負責管理多個相同的pods。客戶端無需連線到每個pod的IP,而是直接連線負載均衡器的IP地址。Kubernetes服務會將你的應用程式定義為一個服務,使得Kubernetes可以根據定義的規則和實際可用資源動態擴充套件pod數量。

若想要應用程式被Kubernetes基礎設施外部的客戶端訪問到,唯一的方法是將應用程式定義為服務的一部分。無論你是否擴充套件節點,都需要Kubernetes服務分配外部IP地址。

標籤(Labels)

標籤是Kubernetes中一組作用於物件(如pods)的鍵值對,需要具有實際意義且有相關性。

在Kubernetes的標準配置中,標籤並不直接影響與Kubernetes相關的核心操作,而是主要用於對物件的分組和識別。

網路安全(Network Security)

下面我們將介紹一些Kubernetes推薦使用的網路外掛,這些外掛用到了我們上一節提到的標籤。利用標籤,它們可以在容器執行時改變某些功能。在Kubernetes中,大多數使用的網路外掛都是基於容器網路介面(Container
Networking Interface ,CNI)規範,這項規範由Cloud Native Computing Foundation(CNCF)制定。CNI允許在多個容器平臺中使用相同的網路外掛。現在我們使用一種調整網路安全策略的方法,該方法並不像傳統的網路或者安全團隊模型那樣預先設定好一切,而是在容器執行時,利用標籤來調整正確的網路策略(容器的動態變化太過頻繁,很難進行手動干預),目前該方法已經成為了 Kubernetes Network Special Internet Group(Network SIG)的一部分。如今,我們已經有多個可供使用的網路外掛能夠將網路策略應用於名稱空間和pods中,這其中包括OpenContrail 和 Project Calico。

通過這種新方法,Kubernetes管理員可以匯入所有預先準備的策略,開發者負責調整並根據需求自主選擇策略,而所有這一切都會定義到pod中執行。

網路策略示例:

POST /apis/net.alpha.kubernetes.io/v1alpha1/namespaces/tenant-a/networkpolicys/
{
 "kind": "NetworkPolicy",
 "metadata": {
 "name": "pol1"
 },
 "spec": {
 "allowIncoming": {
 "from": [
 { "pods": { "segment": "frontend" } }
 ],
 "toPorts": [
 { "port": 80, "protocol": "TCP" }
 ]
 },
 "podSelector": { "segment": "backend" }
 }
}

有網路策略定義的pod配置示例:

apiVersion: v1
kind: Pod
metadata:
 name: nginx
 labels:
 app: nginx
 segment: frontend
spec:
 containers:
 - name: nginx
 image: nginx
 ports:
 - containerPort: 80

結論

有了Kubernetes提供的功能,開發者現在擁有了完全定義應用程式及其依賴性所需的靈活性,並且可以在單個pod中使用多個容器。如果任何一個容器發生錯誤,Kubernetes能夠確保將其對應的pod停用,自動用新的pod替換。此外,開發者還可以定義應用程式或者服務偵聽的埠號,無論它是較大服務的一部分,或僅僅是一個獨立例項。通過這樣的操作,使用持續交付和部署方法論的快速開發和部署週期將會成為常態。