CNI(Container Network Interface)是Kubernetes中實現網路外掛程式的介面標準。CNI Chain是一種CNI外掛程式模式,支援結合多個CNI外掛程式實現更靈活的網路設定。在Kubernetes叢集中,CNI Chain可將多個CNI外掛程式組成一個鏈,每個外掛程式負責處理特定的網路任務,例如IP分配、路由等。當容器建立時,CNI Chain首先調用第一個外掛程式,並將輸出傳遞給下一個外掛程式,直到所有外掛程式都完成任務。
ACK不保證多個CNI外掛程式之間可以協作。配置自訂CNI Chain屬於高危操作,請在充分理解多個CNI功能後進行配置,謹慎操作,避免配置錯誤導致業務中斷。
前提條件
已建立Kubernetes託管版叢集,且叢集的網路外掛程式為Terway。更多資訊,請參見建立Kubernetes託管版叢集。
使用限制
Terway版本需大於等於v1.5.6。關於如何升級組件版本,請參見管理組件。
配置自訂CNI Chain
當您需要使用CNI Chain時,需要在Terway設定檔中增加您需要的外掛程式。
操作步驟
修改Terway設定檔,執行以下命令,修改
eni-config
設定檔。kubectl edit cm -nkube-system eni-config
配置參數
說明
10-terway.conf
terway CNI 配置,請勿修改其中內容。
重要請勿修改原有配置內容。
10-terway.conflist
自訂CNI Chain配置。
plugins
中第一個cni配置應當為10-terway.conf
內配置。重要文檔內配置僅為樣本說明,請勿直接拷貝,導致配置錯誤。
配置塊的內容應當為JSON格式,請保證格式正確。
設定檔樣本
kind: ConfigMap apiVersion: v1 metadata: name: eni-config namespace: kube-system data: 10-terway.conflist: | { "plugins": [ { "cniVersion": "0.4.0", "name": "terway", "type": "terway", "capabilities": {"bandwidth": true} }, { "type": "portmap", "capabilities": {"portMappings": true}, "externalSetMarkChain":"KUBE-MARK-MASQ" } ] } 10-terway.conf: | { "cniVersion": "0.4.0", "name": "terway", "type": "terway", "capabilities": {"bandwidth": true} }
使用
kubectl rollout restart -n kube-system daemonset.apps/terway-eniip
重建Terway Pods。若配置正確,您可以在節點
etc/cni/net.d/10-terway.conflis
設定檔中查看您自訂的外掛程式配置。
使用案例
ACK不保證多個CNI外掛程式之間可以協作。配置自訂CNI Chain屬於高危操作,請在充分理解多個CNI功能後進行配置,謹慎操作,避免配置錯誤導致業務中斷。
下文使用案例僅供參考。
設定portmap
Portmap外掛程式的主要職責是將Pod的內部連接埠映射到宿主機的連接埠上,從而允許外部網路訪問Pod的特定服務。
配置樣本
kind: ConfigMap
apiVersion: v1
metadata:
name: eni-config
namespace: kube-system
data:
10-terway.conflist: |
{
"plugins": [
{
"cniVersion": "0.4.0",
"name": "terway",
"type": "terway",
"capabilities": {"bandwidth": true}
},
{
"type": "portmap",
"capabilities": {"portMappings": true},
"externalSetMarkChain":"KUBE-MARK-MASQ"
}
]
}
10-terway.conf: |
{
"cniVersion": "0.4.0",
"name": "terway",
"type": "terway",
"capabilities": {"bandwidth": true}
}
關閉容器內IPv6功能
在容器內,即使您的叢集並未啟用IPv6雙棧功能,容器的網路介面在建立後仍會自動分配一個IPv6本地鏈路地址,屬於fe80::/64
網段。這是作業系統核心的預設行為,通常是無害的,並不會干擾正常業務運行。
然而,如果您的應用程式在處理網路地址時存在錯誤,可能會錯誤地將這個IPv6 Link-Local地址識別為Pod的IP,並嘗試使用它進行通訊。但Link-Local地址旨在用於同一鏈路內的裝置間通訊,並不能用於網路通訊,這可能會導致您的應用程式運行異常。在這種情況下,您的應用程式代碼存在缺陷,請優先嚮應用程式的供應商報告並尋求解決方案。
如果您仍然需要在容器內關閉IPv6本地鏈路地址,您可以通過配置tuning
外掛程式實現。
配置樣本
kind: ConfigMap
apiVersion: v1
metadata:
name: eni-config
namespace: kube-system
data:
10-terway.conflist: |
{
"plugins": [
{
"cniVersion": "0.4.0",
"name": "terway",
"type": "terway",
"capabilities": {"bandwidth": true}
},
{
"type": "tuning",
"sysctl": {
"net.ipv6.conf.all.disable_ipv6": "1",
"net.ipv6.conf.default.disable_ipv6": "1",
"net.ipv6.conf.lo.disable_ipv6": "1"
}
}
]
}
10-terway.conf: |
{
"cniVersion": "0.4.0",
"name": "terway",
"type": "terway",
"capabilities": {"bandwidth": true}
}