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 網絡策略