1. 程式人生 > >Kubernetes之canal的網路策略(NetworkPolicy)

Kubernetes之canal的網路策略(NetworkPolicy)

安裝要求:

1、我們這裡安裝的是3.3的版本。kubernetes的要求:

支援的版本

  • 1.10
  • 1.11
  • 1.12

2、CNI外掛需要啟用,Calico安裝為CNI外掛。必須通過傳遞--network-plugin=cni引數將kubelet配置為使用CNI網路(在kubeadm上,這是預設設定。)

3、支援kube-proxy的模式

  • iptables
  • ipvs需要1.9以上的

安裝Clico用於策略和Flannel用於網路

我們這裡使用Kubernetes的etcd進行安裝,首先確保Kubernetes設定--cluster-cidr=10.244.0.0/16

--allocate-node-cidrs=true。(kubeadm是預設安裝的)

我們叢集啟動了RBAC,所以要建立RBAC

kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/canal/rbac.yaml

安裝Calico

kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/canal/canal.yaml

 

kubernetes中的網路控制策略

NetworkPolicy是kubernetes對pod的隔離手段,可以看到,NetworkPolicy實際上只是宿主機上的一系列iptables規則。

 

  • Egress 表示出站流量,就是pod作為客戶端訪問外部服務,pod地址作為源地址。策略可以定義目標地址或者目的埠
  • Ingress 表示入站流量,pod地址和服務作為服務端,提供外部訪問。pod地址作為目標地址。策略可以定義源地址和自己埠
  • podSelector 規則生效在那個pod上,可以配置單個pod或者一組pod。可以定義單方向。podSelector
    選擇名稱空間中的Pod。

 kubectl explain  networkpolicy.spec講解:

  • egress 出站流量規則 可以根據ports和to去定義規則。ports下可以指定目標埠和協議。to(目標地址):目標地址分為ip地址段、pod、namespace
  • ingress 入站流量規則 可以根據ports和from。ports下可以指定目標埠和協議。from(來自那個地址可以進來):地址分為ip地址段、pod、namespace
  • podSelector 定義NetworkPolicy的限制範圍。直白的說就是規則應用到那個pod上。podSelector: {},留空就是定義對當前namespace下的所有pod生效。沒有定義白名單的話 預設就是Deny ALL (拒絕所有)
  • policyTypes 指定那個規則 那個規則生效,不指定就是預設規則。

在dev的namespace下定義一個入站流量拒絕的規則:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-policy
spec:
  podSelector: {}
  policyTypes:
  - Ingress

$ kubectl apply -f network-policy.yaml  -n dev

在dev和prod的namespace下個各自建立一個pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  labels:
    name: myapp
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1

$  kubectl apply -f policy-pod.yaml  -n dev

$  kubectl apply -f policy-pod.yaml  -n prod
# 測試一下
$ kubectl get pod -o wide   -n prod
NAME      READY     STATUS    RESTARTS   AGE       IP           NODE
pod-1     1/1       Running   0          3h        10.244.2.3   k8s-node02
$ kubectl get pod -owide   -n dev
NAME      READY     STATUS    RESTARTS   AGE       IP           NODE
pod-1     1/1       Running   0          3h        10.244.2.2   k8s-node02
$ curl 10.244.2.3
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
$ 10.244.2.2 不通

 表示所有的都被執行的規則

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-policy
spec:
  podSelector: {}
  ingress:
  - {}
  policyTypes:
  - Ingress

$ kubectl apply -f  network-policy.yaml  -n dev 

測試
$ curl 10.244.2.2                              
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

放行特定的入站訪問流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-myapp-policy
spec:
  podSelector: 
    matchLabels:
      app: myapp   #選擇app=myapp 的標籤放行
  ingress:
  - from:
    - ipBlock:   #地址段
        cidr: 10.244.0.0/16  允許這個地址段訪問
        except:    排除一下地址不可以訪問
        - 10.244.1.2/32
    ports:
    - port: 80   只執行訪問80埠
      protocol: TCP
$ kubectl apply -f alloy-pod.yaml -n dev 

測試一下

$ curl 10.244.2.2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

下面寫一個完整的NetworkPolicy物件:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978

大概意思:

  • 該規則只在default 的namespace下,攜帶role:db標籤的pod生效。限制請求的型別包括Ingress和Egress。
  • Kubernetes會拒絕任何訪問被隔離pod的請求,除非這個請求來自以下“白名單”裡的物件。並且訪問的是被隔離pod的6379埠。
  • default Namespace裡的,攜帶了role=fronted標籤的pod可以訪問
  • 任何Namespace裡的,攜帶了project=myproject標籤的pod可以訪問
  • 任何源地址資料172.17.0.0/16網段,且不屬於172.17.1.0/24網段的請求
  • Kubernetes會拒絕被隔離pod對外發起任何請求,除非請求的目的地址屬於10.0.0.0/24網段,並且訪問的是該網段地址的5978埠。