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端口。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM