用NetworkPolicy定義Pod訪問策略

NetworkPolicy簡介

NetworkPolicy是Kubernetes和OpenShift定義通過網絡訪問Pod的安全策率,利用它可以在不通的Project和Pod之間定義細粒度的應用訪問策率。

在NetworkPolicy中以**白名單**的方式定義了針對“**XXX項目**”的“**XXXPod**”可以讓“**XXX項目**”的“**XXXPod**”通過“**XXX方式**”訪問,不在白名單都無法進行訪問。

應用環境和測試方法

部署測試應用

創建如下資源:

<code>$ oc new-project project1
$ oc label namespace project1 name=project1
$ oc new-project project2
$ oc label namespace project2 name=project2
$ oc new-project project3
$ oc label namespace project3 name=project3
$ oc new-app -n project1 openshiftroadshow/parksmap --name=web-db
$ oc new-app -n project1 openshiftroadshow/parksmap --name=web
$ oc new-app -n project1 openshiftroadshow/parksmap --name=db
$ oc new-app -n project1 openshiftroadshow/parksmap --name=mail
$ oc new-app -n project1 openshiftroadshow/parksmap --name=foobar
$ oc new-app -n project1 openshiftroadshow/parksmap --name=foo
$ oc new-app -n project1 openshiftroadshow/parksmap --name=bar
$ oc new-app -n project1 openshiftroadshow/parksmap --name=api
$ oc new-app -n project1 openshiftroadshow/parksmap --name=monitoring
$ oc new-app -n project1 openshiftroadshow/parksmap --name=project1-app
$ oc new-app -n project2 openshiftroadshow/parksmap --name=project2-app
$ oc new-app -n project3 openshiftroadshow/parksmap --name=project3-app/<code>

測試驗證

通過以下方法驗證可從應用的Pod中訪問到同一項目或不同項目的應用Service地址。以下是從project1-app的Pod通過Service的**CLUSTER-IP**訪問project2-app的Pod的說明。

<code>$ oc get svc -n project1
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
project1-app ClusterIP 172.30.144.211 <none> 8080/TCP 2m8s
$ oc get pod -n project2 | grep Running
NAME READY STATUS RESTARTS AGE
project2-app-l7jqd 1/1 Running 0 102s

$ oc rsh project2-app-l7jqd
sh-4.2$ curl 172.30.144.211:8080/<none>/<code>

NetworkPolicy策略

拒絕所有Pod直接訪問

OpenShift 4 HOL (13) - 用NetworkPolicy定義Pod訪問策略

<code>kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-all
spec:
podSelector:
ingress: []/<code>

2. 將deny-all.yaml的NetworkPolicy策略實施於project1。注意:為了不相互影響,需要將其它策略刪除。

<code>$ oc create -f deny-all.yaml -n project1/<code>

3. 通過“測試驗證”步驟確認已經無法從任何項目的Pod訪問到project1-app1的Service了。

## 只允許來自相同項目的Pod訪問

![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20191214135228923.png)

1. 創建以下內容的allow-same-namespace.yaml。

<code>kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-same-namespace
spec:
podSelector:
ingress:
- from:
- podSelector: {}/<code>

2. 將allow-same-namespace.yaml的NetworkPolicy策略實施於project1。注意:為了不相互影響,需要將其它策略刪除。

<code>$ oc create -f allow-same-namespace.yaml -n project1/<code>

3. 通過“測試驗證”步驟確認只能從project1的Pod訪問project1-app的Service了。

只允許來自同一項目的指定Pod訪問

OpenShift 4 HOL (13) - 用NetworkPolicy定義Pod訪問策略

1. 創建以下內容的allow-some-app.yaml。

<code>kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-mail-access-db
spec:
podSelector:
matchLabels:
app: mail
ingress:
- from:
- podSelector:
matchLabels:
app: mail/<code>

2. 將allow-some-app.yaml的NetworkPolicy策略實施於project1。注意:為了不相互影響,需要將其它策略刪除。

<code>$ oc create -f allow-mail-access-db -n project1/<code>

3. 通過“測試驗證”步驟確認只能從mail訪問db的Service了。

只允許從其他項目訪問

OpenShift 4 HOL (13) - 用NetworkPolicy定義Pod訪問策略

1. 創建以下內容的allow-from-other-namespace.yaml。

<code>apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-other-namespace
spec:
podSelector:
matchLabels:
app: web-db
ingress:
- from:
- namespaceSelector: {}/<code>

2. 將allow-some-app.yaml的NetworkPolicy策略實施於project1。注意:為了不相互影響,需要將其它策略刪除。

<code>$ oc create -f allow-from-other-namespace.yaml -n project1/<code>

3. 通過“測試驗證”步驟確認只能從其它項目的Pod訪問web-db的Service了。

只允許從指定的項目訪問

OpenShift 4 HOL (13) - 用NetworkPolicy定義Pod訪問策略

1. 創建以下內容的allow-from-other-project.yaml。

<code>apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-other-project-pod
spec:
podSelector:
matchLabels:
app: db
ingress:
- from:
- namespaceSelector:
matchLabels:
project: project2
podSelector:
matchLabels:
app: mail/<code>

注意:以上代碼的namespaceSelector和podSelecto是“並且”的關係。而以下代碼namespaceSelector和podSelecto是“或者”的關係。

<code>    - from:
- namespaceSelector:
matchLabels:
project: project2
- podSelector:
matchLabels:
app: mail/<code>

2. 將allow-from-other-project.yaml的NetworkPolicy策略實施於project1。注意:為了不相互影響,需要將其它策略刪除。

<code>$ oc create -f allow-from-other-project.yaml -n project1/<code>

3. 通過“測試驗證”步驟確認只能從project2項目的Pod訪問project1項目web的Service了。

只允許從指定項目的指定Pod訪問

1. 創建以下內容的allow-other-project-pod.yaml。

<code>apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-other-project-pod
spec:
podSelector:
matchLabels:
app: db
ingress:
- from:
- namespaceSelector:
matchLabels:
project: project2
podSelector:
matchLabels:
app: mail/<code>

注意:以上代碼的namespaceSelector和podSelecto是“並且”的關係。而以下代碼namespaceSelector和podSelecto是“或者”的關係。

<code>    - from:
- namespaceSelector:
matchLabels:
project: project2
- podSelector:
matchLabels:
app: mail/<code>

2. 將allow-other-project-pod.yaml的NetworkPolicy策略實施於project1。注意:為了不相互影響,需要將其它策率刪除。

<code>$ oc create -f allow-other-project-pod.yaml -n project1/<code>

3. 通過“測試驗證”步驟確認只能從project2項目中mail的Pod訪問project1項目web的Service了。

只允許從指定的端口訪問

OpenShift 4 HOL (13) - 用NetworkPolicy定義Pod訪問策略

1. 創建以下內容的allow-port.yaml。

<code>apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port
spec:
podSelector:
matchLabels:
app: api
ingress:
- from:
- podSelector:
matchLabels:
app: monitoring
ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443/<code>

2. 將allow-port.yaml的NetworkPolicy策略實施於project1。注意:為了不相互影響,需要將其它策率刪除。

<code>$ oc create -f allow-port.yaml -n project1/<code>

混合策略

如果一個Pod被不同的NetworkPolicy定義了訪問策略,則這些訪問策率的全集適用於這個Pod。

其它參考

- https://kubernetes.io/docs/concepts/services-networking/network-policies/

- https://blog.openshift.com/whats-new-in-openshift-3-5-network-policy-tech-preview/


分享到:


相關文章: