藉助 Calico,管窺 Kubernetes 網絡策略

Kubernetes 提出了一系列 CXI 的標準容器接口,其中的 CNI 以插件方式支持多種網絡。新增的 networkpolicy API 對象,提供了對網絡策略的支持,本文以 Calico 爲例,實際操作一個網絡策略的創建和測試。

環境準備

  • 一個 Kubernetes 集羣
  • Kubelet 和 API Server 都開啓了 --allow_privileged=true
  • Kubelet 指定使用 CNI :--network-plugin=cni
  • 爲了避免某些不可描述的網絡設施的影響,建議下載幾個鏡像
    • quay.io/calico/node:v1.0.2
    • calico/cni:v1.5.6
    • calico/kube-policy-controller:v0.5.2
    • calico/ctl:v1.0.2

運行 Calico

  • 下載 http://docs.projectcalico.org/v2.0/getting-started/kubernetes/installation/hosted/calico.yaml
  • 如果用私庫鏡像,需要修改其中的幾個鏡像地址
  • 修改 data/etcd_endpoints 的數據爲可訪問的 etcd 的地址。
kubectl create -f calico.yaml

這裏在 kube-system 中創建了一個 DaemonSet 和一個 Deployment,分別用於提供 CNI 支持和網絡策略支持。

$ kubectl get deployment,daemonset,svc --all-namespaces [9:55:14]
NAMESPACE NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kube-system deploy/calico-policy-controller 1 1 1 1 10h

NAMESPACE NAME DESIRED CURRENT READY NODE-SELECTOR AGE
kube-system ds/calico-node 2 2 2 <none> 10h

NAMESPACE NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default svc/kubernetes 172.200.0.1 <none> 443/TCP 19h default svc/nginx 172.200.183.204 <none> 80/TCP 9h

網絡策略

爲測試效果,我們首先創建一個 Namespace

kubectl create ns policy

然後是 Nginx 部署和服務:

---
kind: ReplicationController
apiVersion: v1
metadata:
 name: nginx
 labels:
 name: nginx
spec:
 replicas: 1
 selector:
 name: nginx
 template:
 metadata:
 labels:
 name: nginx
 app: nginx
 spec:
 containers: - name: nginx
 image: nginx
 ports: - containerPort: 80
 protocol: TCP

---
kind: Service
apiVersion: v1
metadata:
 name: nginx
 labels:
 name: nginx
spec:
 ports: - protocol: TCP
 port: 80
 targetPort: 80
 selector:
 name: nginx

然後我們用 alpine 鏡像測試一下對這一服務進行訪問:

kubectl run alpine --rm -it --image=alpine sh

運行成功後,在 Alpine 的 Shell 中輸入:

wget -O - -T 5 http://nginx 

會出現 Nginx 的缺省頁面的代碼。

接下來我們給 Default Namespace 加一個缺省拒絕訪問的註解:

$ kubectl annotate ns default "net.beta.kubernetes.io/network-policy={\"ingress\": {\"isolation\": \"DefaultDeny\"}}"

重複測試過程,會發現超時錯誤。

我們來創建一條策略:

kind: NetworkPolicy
apiVersion: extensions/v1beta1
metadata:
 name: access-nginx
spec:
 podSelector:
 matchLabels:
 run: nginx
 ingress: - from: - podSelector:
 matchLabels:
 access: "true"

很容易理解,對於符合 “run=nginx” 的 Pod,只有 “access=true” 的 Pod 能夠訪問

給 Alpine 帶上標籤重新運行:

kubectl run alp --image=alpine --labels="access=true" --rm -ti sh

重新 wget,會發現訪問能力已經恢復。

本文主要線索來自官方示例:https://kubernetes.io/docs/getting-started-guides/network-policy/walkthrough/

安裝方法來自 Calico 官網。

這只是一個很入門的介紹,後續會有更多進一步的嘗試。

本文轉自中文社區-藉助 Calico,管窺 Kubernetes 網絡策略

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章