Kubernetes Network Custom Resource Definition De-facto Standard

Kubernetes Network Custom Resource Definition De-facto Standard

1. Goals

本文檔提出了將Kubernetes pod連接到一個(gè)或多個(gè)邏輯或物理網(wǎng)絡(luò)的要求和過(guò)程的規(guī)范,包括使用容器網(wǎng)絡(luò)接口(CNI)連接pod網(wǎng)絡(luò)的插件的要求。

1.1 Non-Goals of Version 1

出于簡(jiǎn)化和/或需要達(dá)成一些合理的共識(shí),本文件特別沒(méi)有涉及某些問(wèn)題。 這些問(wèn)題可能會(huì)在本規(guī)范的未來(lái)版本中得到解決。

1.1.1 Scheduling and resource management

在資源管理工作組中正在努力整合調(diào)度和資源管理(例如,確保節(jié)點(diǎn)沒(méi)有分配比可用網(wǎng)絡(luò)資源更多的pod),其中涉及該工作組和SIG網(wǎng)絡(luò)的各個(gè)成員。
本規(guī)范的未來(lái)版本可能包含資源管理的各個(gè)方面。

1.1.2 對(duì)Kubernetes API的更改

此規(guī)范明確避免了對(duì)現(xiàn)有Kubernetes API的更改。
這些變化需要更長(zhǎng)的上游流程,但希望通過(guò)證明概念并提供多個(gè)pod網(wǎng)絡(luò)附件的一個(gè)或多個(gè)實(shí)際實(shí)現(xiàn),
該文檔可以作為未來(lái)這些變化的基礎(chǔ)。

1.1.3 Interaction with the Kubernetes API

未指定其他pod網(wǎng)絡(luò)附件與Kubernetes API及其對(duì)象(如服務(wù)Services,端點(diǎn)Endpoints,代理proxies等)的交互。
SIG網(wǎng)絡(luò)在2017年7月/ 8月詳細(xì)討論了該主題,并決定需要更改Kubernetes API,這是該規(guī)范的明確非目標(biāo)。

1.1.4 Changes to the Kubernetes CNI Driver

為確保輕松使用此規(guī)范及其實(shí)現(xiàn),Kubernetes CNI驅(qū)動(dòng)程序不需要進(jìn)行任何更改(例如pkg / kubelet / dockershim / network / cni / *)。
已經(jīng)提出了對(duì)驅(qū)動(dòng)程序的更改以支持多個(gè)pod網(wǎng)絡(luò)附件,并且已經(jīng)編寫(xiě)了多個(gè)概念驗(yàn)證,但是對(duì)于多個(gè)附件應(yīng)該如何工作以及因此CNI驅(qū)動(dòng)程序中需要進(jìn)行哪些更改尚未達(dá)成上游共識(shí)。

1.1.5 Enabling Implementations That Are Not CNI Plugins(啟用不是CNI插件的實(shí)現(xiàn))

此規(guī)范僅嘗試啟用Kubernetes網(wǎng)絡(luò)插件,該插件使用像dockershim,CRI-O和rkt這樣的Kubernetes運(yùn)行時(shí)的CNI驅(qū)動(dòng)程序。 該規(guī)范期望通過(guò)實(shí)現(xiàn)來(lái)引導(dǎo)pod網(wǎng)絡(luò)附件操作,該實(shí)現(xiàn)需要是CNI插件。 該規(guī)范的未來(lái)版本可能會(huì)重新審視此要求。

2. Definitions

2.1 Implementation

實(shí)現(xiàn)此規(guī)范的Kubernetes網(wǎng)絡(luò)插件;
從Kubernetes 1.11開(kāi)始,這被定義為符合容器網(wǎng)絡(luò)接口(CNI)規(guī)范v0.1.0或更高版本的插件。
應(yīng)該將Kubernetes配置為調(diào)用所有pod網(wǎng)絡(luò)操作的實(shí)現(xiàn),然后實(shí)現(xiàn)根據(jù)pod的注釋和本規(guī)范中定義的Custom Resources確定要執(zhí)行的其他操作。

2.2 Kubernetes Cluster-Wide Default Network

根據(jù)Kubernetes的當(dāng)前行為和要求連接所有pod的網(wǎng)絡(luò)。

2.3 Network Attachment(Network Attachment)

允許pod直接與給定邏輯或物理網(wǎng)絡(luò)通信的方法。
通常(但不一定)每個(gè)附件采用放置在pod的網(wǎng)絡(luò)命名空間中的內(nèi)核網(wǎng)絡(luò)接口的形式。
每個(gè)附件可能導(dǎo)致分配給pod的零個(gè)或多個(gè)IP地址。

2.4 CNI Delegating Plugin

符合本規(guī)范的實(shí)現(xiàn),它將pod網(wǎng)絡(luò)附件/分離操作委托給符合CNI規(guī)范的其他插件。 例子包括Multus和CNI-Genie。

此規(guī)范將CNI Delegating Plugin的特定要求和建議置于標(biāo)記為此類(lèi)的部分下。
如果實(shí)現(xiàn)不是CNI委托插件,則可以忽略這些標(biāo)記部分及其任何子部分中的要求和建議。

3. NetworkAttachmentDefinition Object

此規(guī)范定義NetworkAttachmentDefinition自定義資源對(duì)象,該對(duì)象描述如何將pod連接到對(duì)象引用的邏輯或物理網(wǎng)絡(luò)。

3.1 Custom Resource Definition (CRD)

CRD告訴Kubernetes API如何公開(kāi)NetworkAttachmentDefinition對(duì)象。 請(qǐng)參閱下面的對(duì)象本身的定義。

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: network-attachment-definitions.k8s.cni.cncf.io
spec:
  group: k8s.cni.cncf.io
  version: v1
  scope: Namespaced
  names:
    plural: network-attachment-definitions
    singular: network-attachment-definition
    kind: NetworkAttachmentDefinition
    shortNames:
    - net-attach-def
  validation:
    openAPIV3Schema:
      properties:
        spec:
          properties:
            config:
               type: string

3.2 NetworkAttachmentDefinition Object Definition

NetworkAttachmentDefinition對(duì)象本身僅包含“spec”部分。 其定義(以Go形式)應(yīng)為:

type NetworkAttachmentDefinition struct {
    metav1.TypeMeta
    // Note that ObjectMeta is mandatory, as an object
    // name is required
    metav1.ObjectMeta

    // Specification describing how to add or remove network
    // attachments for a Pod. In the absence of valid keys in
    // the Spec field, the implementation shall attach/detach an
    // implementation-known network referenced by the object’s
    // name.
    // +optional
    Spec NetworkAttachmentDefinitionSpec `json:"spec"`
}


type NetworkAttachmentDefinitionSpec struct {
    // Config contains a standard JSON-encoded CNI configuration
    // or configuration list which defines the plugin chain to
    // execute. The CNI configuration may omit the 'name' field
    // which will be populated by the implementation when the
    // Config is passed to CNI delegate plugins.
    // +optional
    Config string `json:"config,omitempty"`
}

3.2.1 YAML Example: CNI config JSON in object

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: a-bridge-network
spec:
  config: '{
    "cniVersion": "0.3.0",
    "name": "a-bridge-network",
    "type": "bridge",
    "bridge": "br0",
    "isGateway": true,
    "ipam": {
      "type": "host-local",
      "subnet": "192.168.5.0/24",
      "dataDir": "/mnt/cluster-ipam"
    }
}'

3.2.2 YAML Example: CNI configlist JSON in object

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: another-bridge-network
spec:
  config: '{
  "cniVersion": "0.3.0",
  "name": "another-bridge-network",
  "plugins": [
    {
      "type": "bridge",
      "bridge": "br0",
      "ipam": {
        "type": "host-local",
        "subnet": "192.168.5.0/24"
      }
    },
    {
      "type": "port-forwarding"
    },
    {
      "type": "tuning",
      "sysctl": {
        "net.ipv4.conf.all.log_martians": "1"
      }
    }
  ]
}'

3.2.3 YAML Example: Limited CNI config required ("thick" plugin)

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: a-bridge-network
spec:
  config: '{
    "cniVersion": "0.3.0",
    "type": "awesome-plugin"
}'

3.2.4 YAML Example: Implementation-specific Network Reference

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: a-bridge-network

3.3 NetworkAttachmentDefinition Object Naming Rules

根據(jù)Kubernetes驗(yàn)證命名空間名稱(chēng)的方式,有效的NetworkAttachmentDefinition對(duì)象名稱(chēng)必須由DNS-1123標(biāo)簽格式的單元組成。 建議每個(gè)DNS-1123標(biāo)簽單元不超過(guò)63個(gè)字符。
“DNS-1123標(biāo)簽必須由小寫(xiě)字母數(shù)字字符或' - '組成,并且必須以字母數(shù)字字符開(kāi)頭和結(jié)尾”
Kubernetes錯(cuò)誤消息

可以通過(guò)匹配此正則表達(dá)式來(lái)驗(yàn)證標(biāo)簽:

[a-z0-9]([-a-z0-9]*[a-z0-9])?

3.3.1 Examples

example-namespace/attachment-name
attachment-name

3.4 CNI Delegating Plugin Requirements

對(duì)于CNI委托插件的實(shí)現(xiàn),該實(shí)現(xiàn)將實(shí)際的附件/分離“委托”給一個(gè)或多個(gè)附加的CNI插件。 NetworkAttachmentDefinition對(duì)象包含確定要執(zhí)行哪些CNI插件以及傳遞給它們的選項(xiàng)的必要信息。

3.4.1 Determining CNI Plugins for a NetworkAttachmentDefinition Object

CNI委托插件必須按列出的順序使用以下規(guī)則來(lái)確定哪個(gè)CNI插件要執(zhí)行以便由NetworkAttachmentDefinition對(duì)象描述的pod對(duì)給定網(wǎng)絡(luò)的附件執(zhí)行:

  1. 如果NetworkAttachmentDefinition.Spec中存在“config”鍵,則鍵值的內(nèi)容用于根據(jù)CNI規(guī)范執(zhí)行插件
  2. 如果磁盤(pán)上存在CNI .configlist文件,其JSON“name”鍵與NetworkAttachmentDefinition對(duì)象的名稱(chēng)匹配,則會(huì)加載其內(nèi)容并用于根據(jù)CNI規(guī)范執(zhí)行插件。
  3. 如果磁盤(pán)上存在CNI.config文件,其JSON“name”鍵與NetworkAttachmentDefinition對(duì)象的名稱(chēng)匹配,則會(huì)加載其內(nèi)容并用于根據(jù)CNI規(guī)范執(zhí)行插件。
  4. 否則,網(wǎng)絡(luò)請(qǐng)求必須失敗

3.4.2 Spec.Config and the CNI JSON 'name' Field

如果Spec.Config鍵有效但其數(shù)據(jù)省略了CNI JSON'name'字段,則CNI委托插件應(yīng)在將CNI JSON配置發(fā)送到委托插件之前,將包含NetworkAttachmentDefinition對(duì)象名稱(chēng)的'name'字段添加到CNI JSON。
這旨在簡(jiǎn)化“厚”插件的配置,其中委托插件需要最少的配置。

3.4.2.1 "Name" Injection Example

給定以下NetworkAttachmentDefinition對(duì)象:

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: a-bridge-network
spec:
  config: '{
    "cniVersion": "0.3.0",
    "type": "awesome-plugin"
  }'

CNI委托插件將以下CNI JSON配置發(fā)送到'awesome-plugin'二進(jìn)制文件,該二進(jìn)制文件通過(guò)將NetworkAttachmentDefinition對(duì)象名稱(chēng)作為其數(shù)據(jù)注入“name”字段而生成:

{
    "cniVersion": "0.3.0",
    "name": "a-bridge-network",
    "type": "awesome-plugin"
}

3.4.3 NetworkAttachmentDefinition Object and CNI JSON Configuration Naming Considerations

根據(jù)Kubernetes要求,每個(gè)NetworkAttachmentDefinition對(duì)象必須具有名稱(chēng)。 CNI規(guī)范強(qiáng)烈建議CNI JSON配置包含名稱(chēng),未來(lái)的CNI規(guī)范版本將需要名稱(chēng)。
此規(guī)范強(qiáng)烈建議NetworkAttachmentDefinition對(duì)象名稱(chēng)與NetworkAttachmentDefinition對(duì)象引用的CNI JSON配置中的“name”鍵匹配(無(wú)論是存儲(chǔ)在磁盤(pán)上還是存儲(chǔ)在NetworkAttachmentDefinition.Spec.Config鍵中)。
這減少了用戶(hù)的混淆,并使NetworkAttachmentDefinition對(duì)象和CNI配置之間的映射更加清晰。
強(qiáng)烈建議使用此匹配,因?yàn)樗赡軙?huì)將Kubernetes API對(duì)象命名要求放在外部定義的資源上。
命名最終由集群管理員決定。

4. Network Attachment Selection Annotation

要選擇應(yīng)附加pod的一個(gè)或多個(gè)輔助(“sidecar”)網(wǎng)絡(luò),此規(guī)范定義Pod對(duì)象注釋。 由于此批注選擇的附件是輔助附件,因此Kubernetes本身不知道這些網(wǎng)絡(luò)附件,并且可能無(wú)法通過(guò)標(biāo)準(zhǔn)Kubernetes API獲取有關(guān)它們的信息。

網(wǎng)絡(luò)附件選擇注釋可用于選擇群集范圍內(nèi)的默認(rèn)網(wǎng)絡(luò)的附加附件,超出所需的初始群集范圍的默認(rèn)網(wǎng)絡(luò)附件。

4.1 Annotation Name and Format

Pod對(duì)象注釋名稱(chēng)應(yīng)為“k8s.v1.cni.cncf.io/networks”。 注釋值應(yīng)以?xún)煞N可能的格式之一指定,如下所述。 本規(guī)范的實(shí)現(xiàn)必須支持這兩種格式。
請(qǐng)注意,即使注釋引用的對(duì)象是NetworkAttachmentDefinition對(duì)象,注釋的名稱(chēng)也是“k8s.v1.cni.cncf.io/networks”。 這是故意的。

4.1.1 Comma-delimited Format

此格式旨在是一種非常簡(jiǎn)單,用戶(hù)友好的格式,僅由逗號(hào)分隔的NetworkAttachmentDefinition對(duì)象引用組成。 每個(gè)對(duì)象引用的格式是(a)<NetworkAttachmentDefinition對(duì)象名稱(chēng)>以引用pod命名空間中的NetworkAttachmentDefinition對(duì)象,或(b)<NetworkAttachmentDefinition對(duì)象命名空間> / <NetworkAttachmentDefinition對(duì)象名稱(chēng)>以引用不同命名空間中的NetworkAttachmentDefinition對(duì)象。

kind: Pod
metadata:
  name: my-pod
  namespace: my-namespace
  annotations:
    k8s.v1.cni.cncf.io/networks: net-a,net-b,other-ns/net-c

4.1.2 JSON List Format

此格式允許用戶(hù)為網(wǎng)絡(luò)附件提供特定于pod的要求。
例如,如果最終處理網(wǎng)絡(luò)附件的插件支持這些選項(xiàng),則這些選項(xiàng)可能包括特定的IP地址或MAC地址,無(wú)論是實(shí)現(xiàn)本身還是委托插件。

kind: Pod
metadata:
  name: my-pod
  namespace: my-namespace
  annotations:
    k8s.v1.cni.cncf.io/networks: |
      [
        {"name":"net-a"},
        {
          "name":"net-b",
          "ips": ["1.2.3.4"],
          "mac": "aa:bb:cc:dd:ee:ff"
        },
        {
          "name":"net-c",
          "namespace":"other-ns"
        }
      ]

4.1.2.1 JSON List Format Key Definitions

為此格式的網(wǎng)絡(luò)列表中的每個(gè)網(wǎng)絡(luò)附件映射定義以下鍵。 保留所有不包含句點(diǎn)字符的鍵名稱(chēng),以確保將來(lái)可以擴(kuò)展此規(guī)范。 寫(xiě)入除本規(guī)范中定義的密鑰之外的密鑰的實(shí)現(xiàn)必須使用反向域名表示法(例如“org.foo.bar.key-name”)來(lái)命名非標(biāo)準(zhǔn)密鑰。

4.1.2.1.1 "name"

帶有string類(lèi)型值的必需鍵是NetworkAttachmentDefinition對(duì)象的名稱(chēng),可以是Pod的命名空間(如果“namespace”鍵缺失或?yàn)榭眨部梢允恰皀amespace”鍵指定的另一個(gè)命名空間。

4.1.2.1.2 "namespace"

這個(gè)值為string類(lèi)型的可選鍵是由“name”鍵命名的NetworkAttachmentDefinition對(duì)象的名稱(chēng)空間。

4.1.2.1.3 "ips"

這個(gè)值為string-array的可選鍵需要處理此網(wǎng)絡(luò)附件的插件將給定的IP地址分配給pod。 此鍵的值必須至少包含一個(gè)數(shù)組元素,并且每個(gè)元素必須是有效的IPv4或IPv6地址。 如果該值無(wú)效,則網(wǎng)絡(luò)附件選擇注釋?xiě)?yīng)無(wú)效并由實(shí)現(xiàn)忽略。

4.1.2.1.3.1 "ips" Example
  annotations:
     k8s.v1.cni.cncf.io/networks: |
      [
        {
          "name":"net-b",
          "ips": ["10.2.2.42", "2001:db8::5"]
        }
      ]

4.1.2.1.3.2 CNI Delegating Plugin Requirements

CNI委托插件必須向CNI“args”映射添加“ips”鍵,并將其值設(shè)置為符合“ips”鍵值的“ips”鍵值的轉(zhuǎn)換,如CNI的CONVENTIONS.md中所述。 由于該規(guī)范要求實(shí)現(xiàn)遵循“ips”,但插件可能會(huì)忽略CNI“args”,因此實(shí)現(xiàn)必須確保在返回的CNI請(qǐng)求結(jié)構(gòu)中將所請(qǐng)求的IP地址分配給網(wǎng)絡(luò)附件的接口; 如果尚未分配,則實(shí)施必須使網(wǎng)絡(luò)附件失敗。

鑒于緊接在前的網(wǎng)絡(luò)附件選擇注釋示例,CNI委托插件會(huì)將數(shù)據(jù)轉(zhuǎn)換為以下CNI JSON配置片段,該片段在“net-b”的CNI調(diào)用中傳遞給每個(gè)插件:

{
  …
  "args":{
    "cni":{
      "ips": ["10.2.2.42", "2001:db8::5"]
    }
  }
  …
}

4.1.2.1.4 "mac"

具有值類(lèi)型字符串的此可選鍵需要處理此網(wǎng)絡(luò)附件的插件將給定的MAC地址分配給pod。 此密鑰的值必須包含有效的6字節(jié)以太網(wǎng)MAC地址或有效的20字節(jié)IP-over-InfiniBand硬件地址(如RFC4391第9.1.1節(jié)中所述)。 如果該值無(wú)效,則網(wǎng)絡(luò)附件選擇注釋?xiě)?yīng)無(wú)效并由實(shí)現(xiàn)忽略。

4.1.2.1.4.1 "mac" Example
  annotations:
     k8s.v1.cni.cncf.io/networks: |
      [
        {
          "name":"net-b",
          "mac": "02:23:45:67:89:01"
        }
      ]

4.1.2.1.4.2 CNI Delegating Plugin Requirements

實(shí)現(xiàn)必須向CNI“args”映射添加“mac”密鑰(如CNI的CONVENTIONS.md中所述),并將其值設(shè)置為“mac”密鑰值的轉(zhuǎn)換。 由于此規(guī)范要求實(shí)現(xiàn)遵守“mac”,但插件可能會(huì)忽略CNI“args”,因此實(shí)現(xiàn)必須確保在返回的CNI請(qǐng)求結(jié)構(gòu)中將請(qǐng)求的MAC地址分配給網(wǎng)絡(luò)附件的接口; 如果尚未分配,則實(shí)施必須使網(wǎng)絡(luò)附件失敗。

鑒于緊接在前的網(wǎng)絡(luò)附件選擇注釋示例,CNI委托插件會(huì)將數(shù)據(jù)轉(zhuǎn)換為以下CNI JSON配置片段,該片段在“net-b”的CNI調(diào)用中傳遞給每個(gè)插件:

{
  …
  "args":{
    "cni":{
      "mac": "02:23:45:67:89:01"
    }
  }
  …
}

4.1.2.1.5 "interface"

此值為string類(lèi)型的可選鍵要求實(shí)現(xiàn)使用此網(wǎng)絡(luò)附件生成的pod接口的給定名稱(chēng)。 此鍵的值必須是有效的Linux內(nèi)核接口名稱(chēng)。 如果該值無(wú)效,則網(wǎng)絡(luò)附件選擇注釋?xiě)?yīng)無(wú)效并由實(shí)現(xiàn)忽略。
如果先前的網(wǎng)絡(luò)附件已使用所請(qǐng)求的接口名稱(chēng),則實(shí)施必須使當(dāng)前網(wǎng)絡(luò)附件失敗。

4.1.2.1.5.1 CNI Delegating Plugin Requirements

“接口”鍵需要CNI委托插件在調(diào)用此網(wǎng)絡(luò)附件的CNI插件時(shí)將CNI_IFNAME環(huán)境變量設(shè)置為給定值。

4.2 Multiple Attachments to the Same Network

Pod可以通過(guò)網(wǎng)絡(luò)附件選擇注釋多次請(qǐng)求連接到同一網(wǎng)絡(luò)。 這些請(qǐng)求中的每一個(gè)都被視為單獨(dú)的附件,必須由實(shí)現(xiàn)作為單獨(dú)的操作進(jìn)行處理,并且必須生成單獨(dú)的“網(wǎng)絡(luò)附件狀態(tài)注釋”條目。

4.2.1 CNI Delegating Plugin Requirements

網(wǎng)絡(luò)附件選擇注釋中的每個(gè)網(wǎng)絡(luò)引用對(duì)應(yīng)于NetworkAttachmentDefinition對(duì)象描述的CNI插件/配置列表調(diào)用。 由于CNI規(guī)范將網(wǎng)絡(luò)附件定義為[容器ID,網(wǎng)絡(luò)名稱(chēng),CNI_IFNAME]的唯一元組,因此CNI委托插件必須確保給定網(wǎng)絡(luò)附件的所有CNI操作(例如ADD或DEL)使用相同的唯一元組, 應(yīng)該創(chuàng)建如下:

  1. 容器ID:由運(yùn)行時(shí)給出
  2. 網(wǎng)絡(luò)名稱(chēng):存在于(或通過(guò))NetworkAttachmentDefinition對(duì)象中
  3. CNI_IFNAME:如果沒(méi)有由網(wǎng)絡(luò)附件選擇注釋另外指定,由CNI委托插件為給定附件生成,并且在給定[容器ID,網(wǎng)絡(luò)名稱(chēng)]元組的所有附件中必須是唯一的。

4.2.2 Example

  annotations:
    k8s.v1.cni.cncf.io/networks: net-a,net-a

在此示例中,實(shí)現(xiàn)必須附加“net-a”兩次,并且每個(gè)附件將導(dǎo)致“網(wǎng)絡(luò)附件狀態(tài)注釋”列表中的單獨(dú)條目。

5. Network Attachment Status Annotation

為了確保通過(guò)Kubernetes API可以獲得網(wǎng)絡(luò)附件的結(jié)果,實(shí)現(xiàn)可以將附件操作的結(jié)果發(fā)布到請(qǐng)求附件的pod對(duì)象上的注釋。
注釋的名稱(chēng)應(yīng)為“k8s.v1.cni.cncf.io/network-status”,其值應(yīng)為JSON編碼的地圖列表。 列表中的每個(gè)元素應(yīng)該是由如下所述的網(wǎng)絡(luò)附加操作的結(jié)果組成的映射。

5.1 Source of Status Information

網(wǎng)絡(luò)附件操作的狀態(tài)圖應(yīng)包含從給定網(wǎng)絡(luò)的附件操作結(jié)果中獲取的信息。
僅在pod本身內(nèi)部有用的狀態(tài)信息(如IP路由)不需要是狀態(tài)映射的一部分,因?yàn)榇诵畔⑼ǔEcKubernetes API客戶(hù)端無(wú)關(guān)。

5.1.1 CNI Delegating Plugin Requirements

附件的狀態(tài)應(yīng)取自CNI Result對(duì)象的第一個(gè)沙箱接口,用于該附件的CNI ADD或GET調(diào)用。 如果ADD或GET調(diào)用未返回結(jié)果(CNI規(guī)范當(dāng)前允許),則實(shí)現(xiàn)應(yīng)添加最小狀態(tài)映射,如下所述。

實(shí)現(xiàn)應(yīng)盡可能使用CNI Result對(duì)象中提供的盡可能多的信息來(lái)構(gòu)建網(wǎng)絡(luò)附件狀態(tài)注釋。 如果操作返回版本0.3.0或更高版本的CNI Result對(duì)象,則可以使用“interfaces”,“ips”和“dns”字段輕松構(gòu)建網(wǎng)絡(luò)附件狀態(tài)注釋。 如果操作返回的CNI Result對(duì)象小于0.3.0版,則實(shí)現(xiàn)應(yīng)該從CNI Result中構(gòu)建盡可能多的Network Attachment Status Annotation,并且可以填充剩余的Annotation字段(例如'interface'和'mac ')通過(guò)它希望的任何方式。

5.2 Cluster-Wide Default Network Entry

由于需要實(shí)現(xiàn)將pod連接到群集范圍的默認(rèn)網(wǎng)絡(luò),因此即使未在“網(wǎng)絡(luò)附件選擇注釋”中指定,該網(wǎng)絡(luò)也必須在狀態(tài)映射中具有條目,并且可能沒(méi)有相應(yīng)的NetworkAttachmentDefinition對(duì)象。 該條目應(yīng)將其“默認(rèn)”鍵設(shè)置為“true”。 默認(rèn)條目可以位于狀態(tài)列表中的任何位置。

5.3 Status Map Key Definitions

為每個(gè)網(wǎng)絡(luò)附件的狀態(tài)圖定義了以下鍵。 保留所有不包含句點(diǎn)字符的鍵名稱(chēng),以確保將來(lái)可以擴(kuò)展此規(guī)范。 寫(xiě)入除本規(guī)范中定義的密鑰之外的密鑰的實(shí)現(xiàn)必須使用反向域名表示法(例如“org.foo.bar.key-name”)來(lái)命名非標(biāo)準(zhǔn)密鑰。

5.3.1 "name"

此必需鍵的值(類(lèi)型字符串)應(yīng)包含來(lái)自窗格的網(wǎng)絡(luò)附件選擇批注的NetworkAttachmentDefinition對(duì)象名稱(chēng),或者包含群集范圍的默認(rèn)網(wǎng)絡(luò)的名稱(chēng)。 “name”可以包含第4.1.1節(jié)中定義的命名空間引用。 [參考2018-02-01會(huì)議@ 22:30]

5.3.2 "interface"

此可選鍵的值(類(lèi)型字符串)應(yīng)包含與網(wǎng)絡(luò)附件對(duì)應(yīng)的pod的網(wǎng)絡(luò)命名空間中的網(wǎng)絡(luò)接口名稱(chēng)。

5.3.2.1 CNI Delegating Plugin Requirements

對(duì)于版本0.3.0或更高版本的CNI結(jié)果,“interface”鍵應(yīng)來(lái)自CNI Result的“interfaces”屬性的第一個(gè)元素,該屬性具有有效的“沙盒”屬性。

對(duì)于早于0.3.0的CNI結(jié)果版本,實(shí)現(xiàn)可以從為網(wǎng)絡(luò)附件操作設(shè)置的CNI_IFNAME環(huán)境變量填充該字段,或?qū)⒃撟侄瘟艨铡?/p>

5.3.3 "ips"

此可選鍵的值(類(lèi)型字符串?dāng)?shù)組)應(yīng)包含由于附件操作而分配給pod的IPv4和/或IPv6地址的數(shù)組。

5.3.3.1 CNI Delegating Plugin Requirements

對(duì)于版本0.3.0或更高版本的CNI結(jié)果,如果滿(mǎn)足以下任一條件,則“ips”密鑰應(yīng)來(lái)自CNI結(jié)果的“ips”屬性; 否則它不應(yīng)該包含在狀態(tài)圖中。

  1. “ips”鍵應(yīng)取自CNI Result對(duì)象的“ips”列表的元素,其中“interface”索引引用CNI Result對(duì)象的“interfaces”列表中帶有有效“sandbox”鍵的第一個(gè)元素。
  2. 如果CNI Result對(duì)象的“interfaces”列表中沒(méi)有元素,或者CNI Result對(duì)象的“interfaces”列表中沒(méi)有任何接口具有有效的“sandbox”屬性,則應(yīng)從第一個(gè)元素中獲取“ips”鍵。 CNI結(jié)果對(duì)象的“ips”列表,它沒(méi)有“interface”屬性或“interface”屬性小于零。

這些要求的目的是確保狀態(tài)圖中包含的IP地址與分配給pod中附件接口的IP地址相同,而不是CNI插件有時(shí)報(bào)告的非沙箱接口的地址。

對(duì)于早于0.3.0的版本的CNI結(jié)果,“ips”密鑰應(yīng)來(lái)自CNI結(jié)果的“ip4”和“ip6”屬性的組合。

5.3.4 "mac"

此可選鍵的值(類(lèi)型字符串)應(yīng)包含由“interface”鍵指定的網(wǎng)絡(luò)接口的硬件地址。 如果存在“mac”鍵,則還必須存在“interface”。

5.3.4.1 CNI Delegating Plugin Requirements

對(duì)于版本0.3.0或更高版本的CNI結(jié)果,“mac”鍵應(yīng)來(lái)自CNI Result的“interfaces”屬性的第一個(gè)元素,該屬性具有有效的“沙盒”屬性。

對(duì)于早于0.3.0的CNI結(jié)果版本,實(shí)現(xiàn)可以通過(guò)特定于實(shí)現(xiàn)的機(jī)制填充該字段,或?qū)⒃撟侄瘟艨铡?/p>

5.3.5 "default"

此必需鍵的值(類(lèi)型為boolean)應(yīng)指示此附件是群集范圍的默認(rèn)網(wǎng)絡(luò)的結(jié)果。 “網(wǎng)絡(luò)附件狀態(tài)注釋”列表中只有一個(gè)元素可以將“默認(rèn)”鍵設(shè)置為true。

5.3.6 "dns"

此可選鍵的值(類(lèi)型映射)應(yīng)包含由于網(wǎng)絡(luò)附件而收集的DNS信息。 地圖可能包含以下鍵。

5.3.6.1 "nameservers"

此可選鍵的值(類(lèi)型字符串?dāng)?shù)組)應(yīng)包含DNS服務(wù)器的IPv4和/或IPv6地址數(shù)組。

5.3.6.2 "domain"

此可選鍵的值(類(lèi)型字符串)應(yīng)包含網(wǎng)絡(luò)附件的本地域名。

5.3.6.3 "search"

此可選鍵的值(類(lèi)型字符串?dāng)?shù)組)應(yīng)包含網(wǎng)絡(luò)附件的DNS搜索名稱(chēng)數(shù)組。

5.4 Example

kind: Pod
metadata:
  name: my-pod
  namespace: my-namespace
  annotations:
    k8s.v1.cni.cncf.io/network-status: |
      [
        {
          "name": "cluster-wide-default",
          "interface": "eth5",
          "ips": [ "1.2.3.1/24", "2001:abba::2230/64" ],
          "mac": "02:11:22:33:44:54",
          "default": true
        },
        {
          "name": "some-network",
          "interface": "eth1",
          "ips": [ "1.2.3.4/24", "2001:abba::2234/64" ],
          "mac": "02:11:22:33:44:55",
          "dns": {
            "nameservers": [ "4.2.2.1", "2001:4860:4860::8888" ],
            "search": [ "eng.foobar.com", "foobar.com" ]
          },
          "default": false
        },
        {
          "name": "other-ns/an-ip-over-infiniband-network",
          "interface": "ib0",
          "ips": [ "5.4.3.2/16" ],
          "mac": "80:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22",
          "default": false
        }
      ]

6. Cluster-Wide Default Network

實(shí)現(xiàn)必須將每個(gè)pod連接到群集范圍的默認(rèn)網(wǎng)絡(luò),從而保持現(xiàn)有的Kubernetes pod網(wǎng)絡(luò)行為。 [ref 2018-01-18 @ 31:30]實(shí)現(xiàn)可以自由定義如何配置和引用群集范圍的默認(rèn)網(wǎng)絡(luò)(例如,作為NetworkAttachmentDefinition對(duì)象,磁盤(pán)上的CNI JSON配置文件,或其他一些 如果所有pod都首先連接到該網(wǎng)絡(luò),則意味著)。

6.1 Network Plugin Readiness

在群集范圍的默認(rèn)網(wǎng)絡(luò)準(zhǔn)備就緒之前,實(shí)現(xiàn)不應(yīng)將其CNI JSON配置文件寫(xiě)入Kubernetes CNI配置目錄。 這可以防止Kubernetes在節(jié)點(diǎn)上安排將立即失敗的pod,因?yàn)樵搶?shí)現(xiàn)已表示準(zhǔn)備就緒,但群集范圍的默認(rèn)網(wǎng)絡(luò)沒(méi)有。

該實(shí)現(xiàn)可以自由定義如何確定群集范圍的默認(rèn)網(wǎng)絡(luò)就緒性,前提是當(dāng)確定群集范圍的默認(rèn)網(wǎng)絡(luò)準(zhǔn)備就緒時(shí),可以立即將pod連接到該網(wǎng)絡(luò)并具有合理的網(wǎng)絡(luò)連接期望。

6.1.1 CNI Delegating Plugin Recommendations

為了防止群集范圍的默認(rèn)網(wǎng)絡(luò),實(shí)現(xiàn)和kubelet的CNI插件加載器之間的競(jìng)爭(zhēng)條件,建議通過(guò)--cni-conf-dir命令行選項(xiàng)為kubelet配置特定于實(shí)現(xiàn)的CNI配置目錄。
實(shí)現(xiàn)應(yīng)該等到群集范圍的默認(rèn)網(wǎng)絡(luò)插件的CNI JSON配置寫(xiě)入/etc/cni/net.d,然后將其自己的CNI JSON配置文件寫(xiě)入給予kubelet的特定于實(shí)現(xiàn)的CNI配置目錄。

6.1.2 Alternate Readiness Method

如果在指示實(shí)現(xiàn)準(zhǔn)備好kubelet之前無(wú)法等待群集范圍的默認(rèn)網(wǎng)絡(luò)準(zhǔn)備就緒,則實(shí)現(xiàn)可以立即將其自己的CNI配置文件安裝到kubelet CNI配置目錄,確保其配置優(yōu)先于群集 全范圍的默認(rèn)網(wǎng)絡(luò)(如果有的話)。 然后,實(shí)施必須阻止任何pod網(wǎng)絡(luò)連接/分離操作,直到群集范圍的默認(rèn)網(wǎng)絡(luò)準(zhǔn)備就緒。

6.2 Cluster-wide Default Network Attachment Ordering

在附加由“網(wǎng)絡(luò)附件選擇注釋”指定的任何網(wǎng)絡(luò)之前,實(shí)施必須附加群集范圍的默認(rèn)網(wǎng)絡(luò)。

7. Runtime and Implementation Considerations

7.1 CNI Delegating Plugin Requirements for CNI Configuration and Result Versioning

CNI委托插件必須符合CNI規(guī)范在CNI配置列表中調(diào)用插件的要求。 如果CNI委托插件使用CNI項(xiàng)目的引用“l(fā)ibcni”庫(kù),則會(huì)自動(dòng)處理這些問(wèn)題。 如果沒(méi)有,CNI規(guī)范要求CNI委托插件將配置列表中的cniVersion和name字段注入每個(gè)插件調(diào)用的配置JSON。 這可確保configlist中的每個(gè)插件都能夠理解上一個(gè)插件的結(jié)果,并確保運(yùn)行時(shí)接收到正確版本的最終結(jié)果。

7.2 Attachment/Detachment Failure Handling

在pod網(wǎng)絡(luò)設(shè)置中,無(wú)法連接pod的網(wǎng)絡(luò)附件選擇注釋所引用的任何網(wǎng)絡(luò),或者無(wú)法連接群集范圍的默認(rèn)網(wǎng)絡(luò),應(yīng)立即使pod網(wǎng)絡(luò)設(shè)置操作失敗。 不應(yīng)嘗試尚未執(zhí)行的附件。
在pod網(wǎng)絡(luò)拆卸時(shí),必須拆除在pod網(wǎng)絡(luò)設(shè)置期間嘗試的所有網(wǎng)絡(luò)附件,并且一個(gè)網(wǎng)絡(luò)附件的故障不能防止后續(xù)附件的拆除。 但是,如果任何分離失敗,則應(yīng)將最終錯(cuò)誤傳遞給運(yùn)行時(shí)以指示整體拆卸操作失敗。

7.3 Serialization of Network Attachment Operations

CNI規(guī)范0.4.0規(guī)定“容器運(yùn)行時(shí)不能為同一容器調(diào)用并行操作,但允許為不同容器調(diào)用并行操作。” 實(shí)現(xiàn)必須遵循此要求,并且不得并行化pod網(wǎng)絡(luò)附件操作。 在本規(guī)范的未來(lái)版本中可能會(huì)取消此要求。

7.4 Restrictions on Selection of Network Attachment Definitions by Pods

實(shí)現(xiàn)可以自由地對(duì)給定Pod可以選擇哪些網(wǎng)絡(luò)附件定義施加限制。 這可以通過(guò)RBAC,準(zhǔn)入控制或任何其他特定于實(shí)現(xiàn)的方法來(lái)完成。 如果實(shí)現(xiàn)確定Pod不允許為Pod選擇的給定網(wǎng)絡(luò)附件定義,則它必須使pod網(wǎng)絡(luò)操作失敗。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,486評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,852評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,600評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,944評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,108評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,385評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,616評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,798評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,205評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,537評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,334評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,570評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容