命令记不住

登陆

k8s 网络 ACL

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: 80

apiVersion: 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

.

推荐阅读