開啟networkpolicy
- 創建新集群時,在ansible的hosts的參數列表中添加os_sdn_network_plugin_name配置
[OSEv3:vars]
os_sdn_network_plugin_name='redhat/openshift-ovs-networkpolicy
- 如果已存在的集群,切換網絡策略,請參考Openshift網絡插件動態切換
- ovs-networkpolicy網絡策略下,pod也支持qos網絡流量控制。詳情請閱讀:Openshift Network QoS——Pod網絡控制
說明:在Openshift容器平臺只支持部分k8s networkpolicy v1版本特性,所以egress協議類型,IPBlock和podSelector與namespaceSelector的組合都不支持。
NetworkPolicy配置規則
樣例:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: test
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
- podSelector: pod選擇器,指定該networkpolicy對指定pod產生作用。默認當前project下的所有pod
- policyTypes: Openshift只支持Ingress協議類型
- ingress[].from[].namespaceSelector:namespace選擇器,帶有指定label的namespace允許訪問受控制的pod
- ingress[].from[].podSelector:pod選擇器,指定同一個project下帶有指定label的pod允許訪問受控制的pod
- ingress[].ports:受控制的端口
- 一個project下可以有多條NetworkPolicy規則,同時它們是或的關系
- 每個NetworkPolicy可以有多條ingress策略,同時它們也是或的關系
策略設置案例
默認策略
在沒有設置任何NetworkPolicy策略時,pod之間的網絡與openshift-ovs-subnet一樣,都是可以互相訪問的
對所有pod網絡隔離
對所有pod網絡隔離
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-by-default
spec:
podSelector:
ingress: []
只允許在同一個project下的所有pod可訪問
只允許在同一個project下的pod可訪問
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-same-namespace
spec:
podSelector:
ingress:
- from:
- podSelector: {}
只允許同一個project下的指定pod可訪問
只允許type=blue的pod訪問當前project下的pod
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-same-namespace
spec:
podSelector:
ingress:
- from:
- podSelector:
matchLabels:
type: blue
只允許指定的namespace下的pod可訪問
只允許指定的namespace下的pod可訪問
oc label namespace project-b name=project-b
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-test-namespace
spec:
podSelector:
ingress:
- from:
- namespaceSelector:
matchLabels:
name: project-b
公開指定label的pod的HTTP和HTTPS端口
project-a下的type=red的pod的80和443端口對所有pod開放
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-http-and-https
spec:
podSelector:
matchLabels:
type: red
ingress:
- ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
NetworkPolicy與Routers網絡打通
在ovs-multitenant模式下,router所在的default project對所有project中的pod都具有訪問權限,但是這點在networkpolicy策略中并不適用。如果某個需要公開的服務設置了networkpolicy策略,那么也需要將它向router pod公開。
- 一種方法是將需要公開的服務的端口對所有project公開
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-to-database-service
spec:
podSelector:
matchLabels:
role: database
ingress:
- ports:
- protocol: TCP
port: 5432
該策略不僅允許router能訪問該服務,同時也允許所有的pod能夠訪問該服務。通常這是沒有問題的,因為有這種需求的服務是對外開放的。
- 另一種方法是只對default namespace進行公開
$ oc label namespace default name=default
$ cat allow-from-default-namespace.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-from-default-namespace
spec:
podSelector:
ingress:
- from:
- namespaceSelector:
matchLabels:
name: default
給新建的project創建默認策略
在openshift project的默認配置中添加如下object
objects:
...
- apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-same-namespace
spec:
podSelector:
ingress:
- from:
- podSelector: {}
- apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-default-namespace
spec:
podSelector:
ingress:
- from:
- namespaceSelector:
matchLabels:
name: default
...
總結
Openshift的networkpolicy功能只有當前最新k8s的networkpolicy的部分功能。它支持以下兩種控制:
- 同一個project下的指定pod對受控制的pod的訪問
- 不同project下的所有pod對受控制的pod的訪問
不支持不同project下的指定pod對受控的pod的訪問