藉助 Calico,管窺 Kubernetes 網路策略_Kubernetes中文社群
阿新 • • 發佈:2018-12-27
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 官網。
這只是一個很入門的介紹,後續會有更多進一步的嘗試。