跳至主要内容

Kube-OVN 虛擬機器隔離

虛擬機器之間的隔離通常透過 VLAN(在傳統網路中)或虛擬交換器(在 Kube-OVN 中)來實現。如果您想在同一虛擬交換器網路內隔離虛擬機器,可以使用以下任一方式來達成所需的微分段:

  • 子網路存取控制清單(ACL):將規則套用到虛擬機器使用的子網路。
  • Kubernetes 網路策略:在網路命名空間內套用規則,並使用 Pod 選擇器。

子網路 ACL​

有關架構和使用指南的更多資訊,請參閱 Kube-OVN 文件中的 Subnet ACL 和 ACL API Reference。

範例​

  • 範例 1:172.20.10.0/24 子網路內的所有虛擬機器,除了子網路範圍 172.20.10.0/30 中位址為 172.20.10.2 和 172.20.10.3 的虛擬機器外,都允許相互通訊。

    Kube-OVN 會自動將閘道位址 172.20.10.1 新增到 excludeIps 清單中,防止其被分配給任何虛擬機器。但是,與閘道位址之間的通訊也會受到影響。

    apiVersion: kubeovn.io/v1
    kind: Subnet
    metadata:
    name: vswitch1
    spec:
    acls:
    - action: drop
    direction: to-lport
    match: ip4.dst == 172.20.10.0/30
    priority: 1005
    - action: drop
    direction: from-lport
    match: ip4.src == 172.20.10.0/30
    priority: 1005
    cidrBlock: 172.20.10.0/24
    excludeIps:
    - 172.20.10.1
    gateway: 172.20.10.1
    gatewayNode: ""
    natOutgoing: false
    private: false
    protocol: IPv4
    provider: vswitch1.default.ovn
    vpc: vpc1
  • 範例 2:172.20.10.0/24 子網路內的所有虛擬機器,除了位址為 172.20.10.3 的虛擬機器外,都允許相互通訊。位址為 172.20.10.2 的虛擬機器允許通訊,因為 ACL 規則執行是基於優先級的。對於此子網路,優先級值為 1006 的規則會在 1005 之前執行。

    Kube-OVN 會自動將閘道位址 172.20.10.1 新增到 excludeIps 清單中,防止其被分配給任何虛擬機器。但是,與閘道位址之間的通訊也會受到影響。

    apiVersion: kubeovn.io/v1
    kind: Subnet
    metadata:
    name: vswitch1
    spec:
    acls:
    - action: allow
    direction: to-lport
    match: ip4.dst == 172.20.10.2
    priority: 1006
    - action: allow
    direction: from-lport
    match: ip4.src == 172.20.10.2
    priority: 1006
    - action: drop
    direction: to-lport
    match: ip4.dst == 172.20.10.0/30
    priority: 1005
    - action: drop
    direction: from-lport
    match: ip4.src == 172.20.10.0/30
    priority: 1005
    cidrBlock: 172.20.10.0/24
    excludeIps:
    - 172.20.10.1
    gateway: 172.20.10.1
    gatewayNode: ""
    natOutgoing: false
    private: false
    protocol: IPv4
    provider: vswitch1.default.ovn
    vpc: vpc1
  • 範例 3:位址為 172.20.10.2 的虛擬機器允許與其他虛擬機器通訊。但是,反方向的流量會被阻擋。不允許任何虛擬機器與 172.20.10.2 通訊。

    apiVersion: kubeovn.io/v1
    kind: Subnet
    metadata:
    name: vswitch1
    spec:
    acls:
    - action: drop
    direction: to-lport
    match: ip4.dst == 172.20.10.2
    priority: 1005
    cidrBlock: 172.20.10.0/24
    excludeIps:
    - 172.20.10.1
    gateway: 172.20.10.1
    gatewayNode: ""
    natOutgoing: false
    private: false
    protocol: IPv4
    provider: vswitch1.default.ovn
    vpc: vpc1
  • 範例 4:在 vswitch1 子網路上,來自連接埠 9501 和 IP 位址 172.20.10.6 的 TCP 流量會被阻擋。

    apiVersion: kubeovn.io/v1
    kind: Subnet
    metadata:
    name: vswitch1
    spec:
    acls:
    - action: drop
    direction: from-lport
    match: ip4.src == 172.20.10.6 && tcp.src == 9501
    priority: 1005
    cidrBlock: 172.20.10.0/24
    excludeIps:
    - 172.20.10.1
    gateway: 172.20.10.1
    gatewayNode: ""
    natOutgoing: false
    private: false
    protocol: IPv4
    provider: vswitch1.default.ovn
    vpc: vpc1

網路策略​

更多資訊請參閱 Kubernetes 文件中的 Network Policies 和 Kube-OVN 文件中的 NetworkPolicy Logging。

警告

NetworkPolicy 規則預設會拒絕流量。為避免影響其他 Pod,請確保以下事項:

  • 將所有必要的匹配條件新增到策略中。
  • 使用 Pod 選擇器和命名空間來隔離流量。

本文件中的範例著重於實現同一子網路內 VM 之間的隔離。

範例​

以下虛擬機器在 default 命名空間中建立,並附加到為子網路範圍 172.20.10.0/24 建立的覆蓋網路。

虛擬機器IP 位址
VM1172.20.10.2
VM2172.20.10.3
VM3172.20.10.4
VM4172.20.10.5
VM5172.20.10.6
  • 範例 1:VM1 和 VM2 允許相互通訊,因為它們的位址在子網路 172.20.10.0/30 內。default 命名空間中的所有其他流量,包括與 VM3、VM4 和 VM5 之間的流量,都會被阻擋。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: ip-block
    namespace: default
    spec:
    egress:
    - to:
    - ipBlock:
    cidr: 172.20.10.0/30
    ingress:
    - from:
    - ipBlock:
    cidr: 172.20.10.0/30
    policyTypes:
    - Ingress
    - Egress
  • 範例 2:VM1 和 VM2 允許相互通訊,也允許與子網路 172.20.10.0/24 中的其他虛擬機器通訊。但是,該子網路中的其他虛擬機器無法與 VM1、VM2 以及彼此通訊。這是因為 ingress 策略只允許來自 172.20.10.0/30 的流量。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: ip-block
    namespace: default
    spec:
    ingress:
    - from:
    - ipBlock:
    cidr: 172.20.10.0/30
    policyTypes:
    - Ingress
  • 範例 3:VM1 和 VM2 允許相互通訊,但不允許與子網路 172.20.10.0/24 中的其他虛擬機器通訊。同一子網路中的其他虛擬機器可以與 VM1 和 VM2 通訊。這是因為 egress 策略允許流量傳送到 172.20.10.0/30。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: ip-block
    namespace: default
    spec:
    egress:
    - to:
    - ipBlock:
    cidr: 172.20.10.0/30
    policyTypes:
    - Egress
  • 範例 4:VM2 允許與 VM1 通訊,但不允許與子網路 172.20.10.0/24 中的其他虛擬機器通訊。這是因為 Pod 選擇器標籤套用到了 VM2。同一子網路中的所有其他虛擬機器可以與 VM1 和彼此通訊。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: ip-block
    namespace: default
    spec:
    podSelector:
    matchLabels:
    vm.kubevirt.io/name: VM2
    egress:
    - to:
    - ipBlock:
    cidr: 172.20.10.0/30
    ingress:
    - from:
    - ipBlock:
    cidr: 172.20.10.0/30
    policyTypes:
    - Ingress
    - Egress