
k8s网络访问控制
1.网络访问控制应用
应用场景:
默认情况下,Kubernetes 集群网络没任何网络限制某些场景下就需要进行网络控制,减少网络攻击面网络策略(Network Policy):是一个K8s资源,用Namespace级别网络访问控制。
网络策略的应用场景(偏重多租户下):
• 应用程序间的访问控制,例如项目A不能访问项目B的Pod
• 开发环境命名空间不能访问测试环境命名空间Pod
• 当Pod暴露到外部时,需要做Pod白名单
2. 网络策略概述
podSelector:目标Pod,根据标签选择。
policyTypes:策略类型,指定策略用于入站、出站流量。
Ingress:from是可以访问的白名单,可以来自于IP段、命名空间、Pod标签等,ports是可以访问的端口。
Egress:这个Pod组可以访问外部的IP段和端口。网络策略是由网络组件维护(calico支持,flannel不持支),不是k8s维护
策略是应用所在命名空间的Pod
3.网络策略工作流程
创建Network Policy资源
Policy Controller监控网络策略,同步并通知节点上程序
节点上DaemonSet运行的程序从etcd中获取Policy,调用本地Iptables创建防火墙规则
4.拒绝其他命名空间Pod访问
准备环境
#kubectl get pod -n test NAME READY STATUS RESTARTS AGE bs 1/1 Running 0 5s web-96d5df5c8-t8cjm 1/1 Running 0 2m49s #kubectl get pods -n default NAME READY STATUS RESTARTS AGE bs 0/1 ContainerCreating 0 10s配置策略
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all-namespaces namespace: test spec: podSelector: {} # 未配置,匹配本命名空间所有pod policyTypes: - Ingress ingress: - from: # 白名单 - podSelector: {} # 未配置,匹配所有pod验证
#kubectl -n test exec -it bs -- sh / # wget 10.244.115.119 Connecting to 10.244.115.119 (10.244.115.119:80) index.html 100% |*******************| 615 0:00:00 ETA #kubectl exec -it bs -- sh / # wget 10.244.115.119 Connecting to 10.244.115.119 (10.244.115.119:80).
5.同一个命名空间下应用之间限制访问
基于标签
需求:将test命名空间携带run=web标签的Pod隔离,只允许携带run=client标签的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: 80apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: test1 spec: podSelector: matchLabels: run: web policyTypes: - Ingress - Egress ingress: - from: - ipBlock: cidr: 172.17.0.0/16 except: - 172.17.1.0/24 - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: run: client1 ports: - protocol: TCP port: 6379 egress: - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 5978.
6.只允许指定命名空间中的应用访问
需求:只允许dev命名空间的Pod访问test命名空间中的Pod 80端口
命名空间打标签和验证
命名空间打标签: kubectl label namespace dev name=dev kubectl run busybox --image=busybox -n dev -- sleep 12h # 可以访问 kubectl exec busybox -n dev -- wget <test命名空间pod IP> # 不可以访问 kubectl exec busybox -- wget <test命名空间pod IP>策略
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: test1 spec: podSelector: matchLabels: run: web policyTypes: - Ingress - Egress ingress: - from: - namespaceSelector: matchLabels: name: dev ports: - protocol: TCP port: 6379.