k8s网络策略-命名空间级别的限制
1、需求描述
在实际的生产集群中,有时候不同的命名空间有限制访问的情况存在,比如测试的命名空间不可以访问生产命名空间的Pod,A服务的命名空间不可以访问B服务命名空间的Pod等类似这样的网络隔离需求,k8s支持命名空间和Pod级别的网络隔离,本文讲解的是命名空间级别的网络隔离。
2、环境准备
-
k8s集群版本:v1.29
-
测试Pod yaml文件
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: test1 spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-service namespace: test1 spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP
本次一共需要三个Pod、service、namespace做测试,分别修改Pod和service的name和对应的namespace名称即可
-
测试网络策略yaml文件
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-test1-to-test2 namespace: test2 spec: podSelector: matchLabels: {} policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: test1 podSelector: {} ports: - port: 80 protocol: TCP
配置说明:
1、namespace是策略配置作用于哪个命名空间
2、podSelector是选择test2这个命名空间下的Pod标签,matchLabels: {}表示匹配所有Pod标签
3、Ingress是配置入站规则,egress是出站规则
4、from是配置源端信息(因为是入站,限制源端访问过来的流量)
5、namespaceSelector选择入站的命名空间
需要特别注意的是这儿的命名空间标签KV一定要执行 “kubectl describe ns ns名称” 命名来确认
root@ek8s-master01:/k8syaml# kubectl describe ns test1
Name: test1
Labels: kubernetes.io/metadata.name=test1 #以这个为准
Annotations: <none>
Status: Active
No resource quota.
No LimitRange resource.
6、ports可以指定端口,也可以不配置就不限制端口
3、开始实验
-
资源下发
kubectl apply -f dep-nginx-test1.yaml kubectl apply -f dep-nginx-test2.yaml kubectl apply -f dep-nginx-test3.yaml
-
测试网络
-
命名空间test3访问test2的Pod
访问不通 -
命名空间test1访问test2的Pod
可以正常访问- 命名空间test2访问test2的Pod
访问不通
-
4、结论
k8s配置的networkPolicy网络规则是强规则,配置之后也作用于同命名空间