一般情况下使用flannal作为 kubernetes 的网络通讯插件,而使用calico作为k8s 的路由策略。

帮助文档:https://docs.projectcalico.org/v3.4/getting-started/kubernetes/installation/flannel

下载:

wget https://docs.projectcalico.org/v3.4/getting-started/kubernetes/installation/hosted/canal/canal.yaml

安装:

kubectl apply -f canal.yaml

帮助文档:

kubectl explain networkpolicy

kubectl create namespace dev


image.png


入站管控 Ingress


关闭dev名称空间的入口请求:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: ingress-test
  namespace: dev
spec:
  podSelector: {}  # 空表示控制所有
  policyTypes:
  - Ingress    # 定义ingress但是没有定义规则,表示都不允许

查看:kubectl get networkpolicy -n dev


打开dev名称空间所有的入站请求:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: ingress-test
  namespace: dev
spec:
  podSelector: {}
  ingress:
  - {}          # 为空就是所有Pod都允许接受请求
  policyTypes:
  - Ingress

打开dev名称空间的特定入站请求:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-ingress
  namespace: dev
spec:
  podSelector:
    matchLabels:
      app: myapp   # 对这些标签的Pod进行通信管制
  ingress:
  - from:
    - ipBlock:
        cidr: 10.244.0.0/16      # 这些网段的Pod都可以接受外部请求
        except:
        - 10.244.1.2/32   # 这个IP不允许接收外部请求
    ports:
    - protocol: TCP
      port: 80
    - protocol: TCP
      port: 443

注意:多个策略会相互影响,如果定义的策略不管用注意查看是否有其他策略影响。


出站管控 Egress


查看规则:

kubectl get netpol -n prod

kubectl get networkpolicy -n prod

关闭prod名称空间的所有出站请求:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: ingress-test
  namespace: prod
spec:
  podSelector: {}
  policyTypes:
  - Egress

打开名称空间prod的所有的出站请求:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: ingress-test
  namespace: prod
spec:
  podSelector: {}
  egress:
  - {}
  policyTypes:
  - Egress