Kubernetes之canal的網路策略(NetworkPolicy)
阿新 • • 發佈:2018-11-14
安裝要求:
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
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埠。