OpenShiftEgressに関するすべて。パート2

OpenShift Egressに関する記事の最初の部分では、クラスター内のPODの固定発信IPアドレスを整理するためのオプションについて説明しました。しかし、クラスターの外部にあり、特定のVLANにあるネットワークセグメントへのアクセスを提供する必要がある場合はどうでしょうか。





ここでは、IPアドレスの操作は役に立ちません。この場合の唯一の解決策は、必要なVLANにあるクラスターノード上の追加のインターフェイスの編成と、クラスター内で必要なプロジェクトからの追加のインターフェイスへのアクセスの編成です。そして、MultusCNIと呼ばれるプロジェクトがこれを支援することができます



Multus CNI



ご存知のように、デフォルトでは、KubernetesのPODには、それとのすべての対話が行われる1つのインターフェースがあります。Multusを使用すると、デフォルトのインターフェイスに加えて、PODで複数のインターフェイスを作成できます。実際、Multusはそれ自体がCNIプラグインであり、CNIプラグインが他のCNIプラグインへの呼び出しを制御します。このため、MultusはCNIメタプラグインと呼ばれます。Multusが行うことは、DemystifingMultusの記事の写真によく示されてい ます





もちろん、追加のインターフェースの数は複数にすることができます。



OpenShiftでのMultusCNIの構成



それでは、ブースで専用VLANへのアクセスの問題を解決してみましょう。デフォルトでは、すべてのクラスターノードにOpenShift VLAN(IP:192.168.111 / 24)にある1つのインターフェイスが割り当てられます。multes-testプロジェクトからVLANRestrictedにある192.168.112 / 24ネットワークのリソースへのアクセスを整理したいと思います。VLAN制限付きとVLANOpenShiftは相互にルーティングされません。





まず、VLAN Restrictedからいくつかのノード(この場合、これらはNode1とNode2)にインターフェイスを追加し、これらのノードにnode-role.kubernetes.io/multus-node='yes 'ラベルを付けます 制限付きVLANのリソースは、multus-nodeラベルの付いたノードから利用できます。multus-testプロジェクトを作成しましょう:



[ocp@shift-is01 macvlan]$ oc new-project multus-test

      
      





Multus CNIサポートはOpenShiftに長い間存在しており、個別に追加する必要はありません。Multus構成管理は、CRDnetworks.operator.openshift.ioのCRを介して行われ ます新しいインターフェイスのCNIプラグイン構成を追加して、このリソースを編集する必要があります



。oceditnetworks.operator.openshift.ioクラスター



spec:
  additionalNetworks:
    - name : net1
      namespace: multus-test
      type: Raw
      rawCNIConfig: |-
        { "cniVersion": "0.3.1",
          "type": "ipvlan",
          "mode": "l2",
          "master": "ens224",
          "ipam": {
            "type": "static"
           }
        }

      
      





この瞬間はデコードが必要です。この構成で何を定義しましたか?



  1. PODの場合、「net1」という名前のインターフェイスがmultus-testプロジェクトに追加されます
  2. このインターフェイスの構成は、CNIプラグイン「ipvlan」を介して決定されます。
  3. CNIプラグインipvlanはL2モードで構成されています。
  4. ens224ノードの物理インターフェイスは、net1のメインインターフェイスとして使用されます。
  5. 最後に、IPAM静的プラグインを使用してIPアドレス指定を管理します。


CNIプラグインの選択



追加のインターフェースについては、使用するCNIプラグインを選択する必要があります。可能なCNIプラグインのリストは、Webサイト www.cni.devにあります。この例では、ipvlanプラグインを使用して います。実際、これは、コンテナがホストの外部ネットワークインターフェイスを介して通信できるようにする最も単純なブリッジです。この場合、すべての発信接続は独自のIPアドレスを使用しますが、外部ネットワークインターフェイスのMACアドレスを持ちます。サイトhicu.beの写真は、 ipvlanプラグインをよく示しています。





生産的な環境では、macvlanプラグインが選択されること多く 、発信接続には一意のMACアドレスがあるという点でipvlanとは異なります。ただし、この場合、ネットワーク機器が1つのポートから異なるMACアドレスを持つパケットを送信できるように、ネットワークインフラストラクチャを準備する必要があることがよくあります。



IPAMプラグインの選択



ネットワークインターフェイスの編成に加えて、新しいインターフェイスのIPアドレスを発行するためのルールを定義する必要があります。これは、IPアドレス管理(またはIPAM)機能を実装するCNIプラグインによっても処理されます。可能なIPAMプラグインのリストは、www.cni.devにもあります 。この例では、PODに固定アドレスを割り当てる最も単純な静的IPAMプラグインを使用しました。



そのようなPODが多数ある場合、静的IPAMは不便になります。ここでの適切な選択は、dhcpプラグイン(外部DHCPサーバーへの要求を介してPODのIPアドレスを割り当てる)を使用するか、居場所情報プラグインを使用すること です。



これらのIPAMプラグインのサポートは、デフォルトで OpenShift、個別にインストールする必要はありません。



制限されたVLANアクセス



Multus構成を定義すると、ネットワークアタッチメント定義と呼ばれるリソースがクラスターに表示されます。これは、現在のMultus構成を反映しています。



ネットワークアタッチメント定義



[ocp@shift-is01 macvlan]$ oc get network-attachment-definitions --all-namespaces
NAMESPACE     NAME   AGE
multus-test   net1   3m4s

[ocp@shift-is01 macvlan]$ oc get network-attachment-definitions.k8s.cni.cncf.io -n multus-test net1 -o yaml
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
  creationTimestamp: "2020-11-02T16:44:46Z"
  generation: 1
  managedFields:
  - apiVersion: k8s.cni.cncf.io/v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:ownerReferences:
          .: {}
          k:{"uid":"01a4f46a-fc3c-495f-b196-b39352421e2a"}:
            .: {}
            f:apiVersion: {}
            f:blockOwnerDeletion: {}
            f:controller: {}
            f:kind: {}
            f:name: {}
            f:uid: {}
      f:spec:
        .: {}
        f:config: {}
    manager: cluster-network-operator
    operation: Update
    time: "2020-11-02T16:44:46Z"
  name: net1
  namespace: multus-test
  ownerReferences:
  - apiVersion: operator.openshift.io/v1
    blockOwnerDeletion: true
    controller: true
    kind: Network
    name: cluster
    uid: 01a4f46a-fc3c-495f-b196-b39352421e2a
  resourceVersion: "25898949"
  selfLink: /apis/k8s.cni.cncf.io/v1/namespaces/multus-test/network-attachment-definitions/net1
  uid: 7a7d718b-82c5-46fe-8f72-8fd4299508ec
spec:
  config: |-
    { "cniVersion": "0.3.1",
      "type": "ipvlan",
      "mode": "l2",
      "master": "ens224",
      "ipam": {
        "type": "static"
       }
    }

      
      





制限されたVLANにアクセスできる追加のインターフェイスを持つテストPODを作成しましょう:



pod-ipvlan-static.yaml



[ocp@shift-is01 ipvlan]$ cat ./pod-ipvlan-static.yaml
apiVersion: v1
kind: Pod
metadata:
  namespace: multus-test
  name: test-multus-pod
  labels:
    app: test-multus-pod
  annotations:
    k8s.v1.cni.cncf.io/networks: '[
      {
        "name": "net1",
        "ips": ["192.168.112.250/24"]
      }
]'
spec:
  nodeSelector:
    node-role.kubernetes.io/multus-node: yes
  containers:
  - name: test-multus-pod
    image: centos/tools
    command: ["/bin/bash", "-c", "sleep 9000000"]

      
      





作成されたPODに移動して、そのネットワーク構成を表示し、制限されたVLAN(192.168.112.0/24ネットワーク上)のアドレスの可用性を確認しましょう。



ocp@shift-is01 ipvlan]$ oc rsh test-multus-pod
sh-4.2# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
3: eth0@if2142: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
    link/ether 0a:58:0a:fe:04:a0 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.254.4.160/24 brd 10.254.4.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::bc4b:abff:fe0b:91f8/64 scope link
       valid_lft forever preferred_lft forever
4: net1@if826: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
    link/ether 00:50:56:96:f3:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.112.250/24 brd 192.168.112.255 scope global net1
       valid_lft forever preferred_lft forever
    inet6 fe80::50:5600:196:f302/64 scope link
       valid_lft forever preferred_lft forever

sh-4.2# ping 192.168.112.1 -c 3
PING 192.168.112.1 (192.168.112.1) 56(84) bytes of data.
64 bytes from 192.168.112.1: icmp_seq=1 ttl=64 time=0.179 ms
64 bytes from 192.168.112.1: icmp_seq=2 ttl=64 time=0.230 ms
64 bytes from 192.168.112.1: icmp_seq=3 ttl=64 time=0.223 ms

--- 192.168.112.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2041ms
rtt min/avg/max/mdev = 0.179/0.210/0.230/0.028 ms

      
      





「ipa」コマンドの出力からわかるように、PODは追加のnet1 @ if826ネットワークインターフェイスとマニフェストで指定したIPアドレスを受け取りました。追加のインターフェースは制限付きVLANのイーサネットアダプターを介して機能するため、このPODから、必要なネットワークセグメントにアクセスできました。



著者:JetInfosystemsのDevOpsソリューション部門の責任者であるSergeyArtemovが



テレグラムチャネル@DevSecOpsTalksに参加してください



書誌



  1. MacVLANを備えたOpenShift4とその所在
  2. multusの謎を解く
  3. Macvlan vs Ipvlan



All Articles