应用开发者必须了解的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" }} }/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: nginxlabels:app: nginxsegment: frontend spec:containers:- name: nginximage: nginxports:- containerPort: 80: v1 kind: Pod metadata:name: nginxlabels:app: nginxsegment: frontend spec:containers:- name: nginximage: nginxports:- containerPort: 80結論
有了Kubernetes提供的功能,開發者現在擁有了完全定義應用程序及其依賴性所需的靈活性,并且可以在單個pod中使用多個容器。如果任何一個容器發生錯誤,Kubernetes能夠確保將其對應的pod停用,自動用新的pod替換。此外,開發者還可以定義應用程序或者服務偵聽的端口號,無論它是較大服務的一部分,或僅僅是一個獨立實例。通過這樣的操作,使用持續交付和部署方法論的快速開發和部署周期將會成為常態。
總結
以上是生活随笔為你收集整理的应用开发者必须了解的Kubernetes网络二三事的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从分布式到微服务,深挖Service M
- 下一篇: springboot源码分析之环境属性构