1. 程式人生 > >藉助 Calico,管窺 Kubernetes 網路策略_Kubernetes中文社群

藉助 Calico,管窺 Kubernetes 網路策略_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,會發現訪問能力已經恢復。

安裝方法來自 Calico 官網。

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