CKA考试知识点分享(10)---NetworkPolicy
CKA 版本:1.32
第十套题是涉及NetworkPolicy相关。
注意:本文不是题目,只是为了学习相关知识点做的实验。仅供参考
实验目的
创建NetworkPolicy,来验证网络策略带来的影响。
注意:需要网络插件支持网络策略。我使用的是calico
实验开始
禁止pod的出入站流量
创建命名空间
kubectl create ns test1
kubectl create ns test2
创建两个pod和svc
apiVersion: apps/v1
kind: Deployment
metadata:name: backendnamespace: test1
spec:selector:matchLabels:app: backendtemplate:metadata:labels:app: backendspec:containers:- name: nginximage: docker.m.daocloud.io/library/nginx:stable-alpineports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: backendnamespace: test1labels:app: backend
spec:ports:- port: 80selector:app: backend
再创建一个前端,把label修改成:app: frontend
查看pod
测试访问:同空间后端nginx能够成功访问到前端nginx
kubectl exec -n test1 backend-74c99c7f54-b4f4j – sh -c “curl frontend.test1”
添加网络策略,限制空间下pod拒绝出入站流量。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: default-deny-ingressnamespace: test1
spec:podSelector: {}policyTypes:- Ingress- Egress
创建后,再次验证发现pod不能互相通讯了。
同命名空间pod准许被访问
现在需要设置test1下的backend 能访问frontend服务
需要设置test1 下的出站
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: test1-network-egressnamespace: test1
spec:podSelector:matchLabels:app: backendpolicyTypes:- Egressegress:- to:- namespaceSelector:matchLabels:kubernetes.io/metadata.name: kube-system #这个是为了解析服务名称- podSelector:matchLabels:app: frontend
需要设置test1 下frontend 准许backend入站
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: test1-network-ingressnamespace: test1
spec:podSelector:matchLabels:app: frontendpolicyTypes:- Ingressingress:- from:- podSelector:matchLabels:app: backend
测试访问:
kubectl exec -n test1 backend-74c99c7f54-b4f4j – sh -c “curl frontend.test1”
测试frontend 去访问backend,发现不能成功
不同命名空间之间pod互相访问
我们test1 命名空间下的backend 想要访问 test2 空间下的frontend 如何实现呢?
由于跨不同的命名空间,所以需要添加多个命名空间的访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: test1-network-egressnamespace: test1
spec:podSelector:matchLabels:app: backendpolicyTypes:- Egressegress:- to:- namespaceSelector:matchExpressions:- key: "kubernetes.io/metadata.name"operator: Invalues: ["kube-system", "test2"]- podSelector:matchLabels:app: frontend
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: test2-network-ingressnamespace: test2
spec:podSelector:matchLabels:app: frontendpolicyTypes:- Ingressingress:- from:- podSelector:matchLabels:app: backend- namespaceSelector:matchExpressions:- key: "kubernetes.io/metadata.name"operator: Invalues: ["test1"]- podSelector:matchLabels:app: backend
测试访问:test1 命名空间下的backend 可以访问 test2 空间下的frontend
从上面可以看出这几种选择器的作用
podSelector:此选择器将在与 NetworkPolicy 相同的名字空间中选择特定的 Pod,应将其允许作为入站流量来源或出站流量目的地。
namespaceSelector:此选择器将选择特定的名字空间,应将所有 Pod 用作其入站流量来源或出站流量目的地。
namespaceSelector 和 podSelector:一个指定 namespaceSelector 和 podSelector 的 to/from 条目选择特定名字空间中的特定 Pod。
参考链接:
https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/