k8s-NetworkPolicy
NetworkPolicy 是k8s中的网络策略可以限制pod以及namespace之间的访问流量
演示一下名称空间之间基于端口的访问限制
官方对networkpolicy的介绍
官方网址: 网络策略 |Kubernetes (简体中文)
一:创建NetworkPolicy
vim networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy # 策略的名称
namespace: default # 策略所在的命名空间
spec:
podSelector:
matchLabels: {} # 空的标签选择器,意味着匹配default命名空间所有 Pod
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector: # 从特定命名空间选择器匹配的命名空间中的 Pod 允许访问
matchLabels:
app: echo
ports: # 定义允许访问的端口
- protocol: TCP
port: 80
- protocol: TCP
port: 8080
生成networkpolicy
kubectl apply -f networkpolicy.yaml
kubectl describe networkpolicy
#查看详细信息,因为我的default命名空间只有一个networkpolicy,所以没指定名字
kubectl get networkpolicy
可以看到这个networkpolicy是限制有app=echo的名称空间中的pod只允许访问default名称空间下的所有pod的80和8080端口,其他端口不允许访问
二:创建具有app=echo的名称空间
kubectl create ns test #创建namespace可以简写ns
kubectl label ns test app=echo #给test命名空间打上app=echo的标签
kubectl get ns --show-labels #查看test命名空间的标签
三:验证
在default命名空间下创建两个pod,分别为nginx和tomcat。
nginx是80端口 tomcat是8080端口
vim nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: default
spec:
containers:
- image: nginx:v1
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
protocol: TCP
vim tomcat.yaml
apiVersion: v1
kind: Pod
metadata:
name: tomcat
namespace: default
spec:
containers:
- image: tomcat:v1
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 8080
protocol: TCP
创建出来
kubectl apply -f nginx.yaml
kubectl apply -f tomcat.yaml
在test命名空间中创建一个pod进行访问验证
创建一个busybox
kubectl run busy-test --image=docker.io/library/busybox:1.28 --namespace=test -- /bin/sh -c "sleep 3600"
查看default命名空间下的pod ip
kubectl get pod -owide
kubectl -n test exec -it busy-test -- /bin/sh #进入容器内部
使用wget 来请求一下网页文件
可以看到80和8080都是可以下载到的
下面来多开两个终端进入到busybox容器里面用于下载网页文件,随后修改networkpolicy查看效果
看录屏查看效果
k8s-networkpolicy
这个测试方式就是上面的两个终端分别下载nginx和tomcat的网页文件
下面那个终端用于动态修改网络策略:第一次是取消掉了8080端口也就是tomcat的端口,可以发现tomcat的网页不被持续下载了,第二次我们又取消掉了nginx的80端口之后nginx的网页文件也不被下载了,第三次我们又恢复了80端口,可以看到nginx的网页文件又重新被下载了