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 位址 |
|---|---|
| VM1 | 172.20.10.2 |
| VM2 | 172.20.10.3 |
| VM3 | 172.20.10.4 |
| VM4 | 172.20.10.5 |
| VM5 | 172.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