Openshift:可靠的Kubernetes发行版k8s-openshift-okddocker. k8s

Openshift的网络策略networkpolicy

2018-12-18  本文已影响150人  潘晓华Michael

开启networkpolicy

[OSEv3:vars]
os_sdn_network_plugin_name='redhat/openshift-ovs-networkpolicy

说明:在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

策略设置案例

默认策略

在没有设置任何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公开。

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能够访问该服务。通常这是没有问题的,因为有这种需求的服务是对外开放的。

$ 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的访问

参考文章

Openshift官方文档:Managing Networking

上一篇 下一篇

猜你喜欢

热点阅读