• 网络策略应用场景
• 网络策略概述
• 网络访问控制5个案例
1.8.1 应用场景
默认情况下,Kubernetes 集群网络没任何网络限制,Pod 可以与任何其他 Pod 通信,在某些场景下就需要进行网络控制, 减少网络攻击面,提高安全性,这就会用到网络策略。 网络策略(Network Policy):是一个K8s资源,用于限制Pod出入流量,提供Pod级别和Namespace级别网络访问控制。 网络策略的应用场景:
• 应用程序间的访问控制,例如项目A不能访问项目B的Pod
• 开发环境命名空间不能访问测试环境命名空间Pod
• 当Pod暴露到外部时,需要做Pod白名单
• 多租户网络环境隔离
1.8.2 网络策略概述
1.8.2.1 基本配置
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
podSelector:目标Pod,根据标签选择。
policyTypes:策略类型,指定策略用于入站、出站流量。
Ingress:from是可以访问的白名单,可以来自于IP段、命名空间、 Pod标签等,ports是可以访问的端口。 Egress:这个Pod组可以访问外部的IP段和端口。
1.8.2.2 网络策略工作流程
网络策略工作流程:
1、创建Network Policy资源
2、Policy Controller监控网络策略,同步并通知节点上程序
3、节点上DaemonSet运行的程序从etcd中获取Policy,调用本 地Iptables创建防火墙规则
1.8.3 网络访问控制案例
1.8.3.1 案例1:拒绝命名空间下所有Pod出入站流量
需求:拒绝test命名空间下所有Pod入、出站流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: test
spec:
podSelector: {} # 匹配本命名空间所有pod
policyTypes:
- Ingress
- Egress
# ingress和egress没有指定规则,则不允许任何流量进出pod
1.8.3.2 案例2:拒绝其他命名空间Pod访问
需求:test命名空间下所有pod可以互相访问,也可以访问其他
命名空间Pod,但其他命名空间不能访问test命名空间Pod。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-namespaces
namespace: test
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- podSelector: {} # 匹配本命名空间所有pod
1.8.3.3 案例3:允许其他命名空间Pod访问指定应用
需求:允许其他命名空间访问test命名空间指定Pod
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all-namespaces
namespace: test
spec:
podSelector:
matchLabels:
app: web
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector: {} # 匹配所有命名空间的pod
1.8.3.4 案例4:同一个命名空间下应用之间限制访问
需求:将test命名空间中标签为run=web的pod隔离, 只允许标签为run=client1的pod访问80端口
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: app-to-app
namespace: test
spec:
podSelector:
matchLabels:
run: web
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
run: client1
ports:
- protocol: TCP
port: 80
以上是允许在test这个命名空间,假如不限制命名空间,如下:
]# cat test0719.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: app-to-app
namespace: test
spec:
podSelector:
matchLabels:
run: web
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector: {}
podSelector:
matchLabels:
run: client1
ports:
- protocol: TCP
port: 80
1.8.4 CKS考题分析
1.8.4.1 考题一
解读:在 testing 命名空间创建一个名为 denypolicy 的网络策略。拒绝所有 Ingress 和
Egress 流量。将网络策略应用到 testing 命名空间中的所有 pod。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: denypolicy
namespace: testing
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
1.8.4.2 考题二
解读:创建一个名为 pod-restriction 的网络策略,以限制命名空间 dev-team 中 products
service Pod。
只允许以下 Pod 连接 products-service Pod:
- qa 命名空间中的 Pod
- Pod 标签为 environment:testing,在所有命名空间
kubectl get pod -n dev-team --show-labels # 查看 pod 标签(environment: staging)
kubectl get ns --show-labels # 查看 qa 命名空间标签(name: qa)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: pod-restriction
namespace: dev-team
spec:
podSelector:
matchLabels:
environment: staging
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: qa
- from:
- namespaceSelector: {}
podSelector:
matchLabels:
environment: testing