NetworkPolicy
NetworkPolicy是Kubernetes设计用来限制Pod访问的对象,相当于从应用的层面构建了一道防火墙,进一步保证了网络安全。NetworkPolicy支持的能力取决于集群的网络插件的能力。
默认情况下,如果命名空间中不存在任何策略,则所有进出该命名空间中的Pod的流量都被允许。
NetworkPolicy的规则可以选择如下3种:
- namespaceSelector:根据命名空间的标签选择,具有该标签的命名空间都可以访问。
- podSelector:根据Pod的标签选择,具有该标签的Pod都可以访问。
- ipBlock:根据网络选择,网段内的IP地址都可以访问。(仅Egress支持IPBlock)
通过YAML使用Ingress规则
- 场景一:通过网络策略限制Pod只能被带有特定标签的Pod访问
图1 podSelector
目标Pod具有role=db标签,该Pod只允许带有role=frontend标签的Pod访问其6379端口。设置该网络策略的具体操作步骤如下:
- 创建名为access-demo1.yaml文件。
vim access-demo1.yaml
以下为YAML文件内容:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: access-demo1 namespace: default spec: podSelector: # 规则对具有role=db标签的Pod生效 matchLabels: role: db ingress: # 表示入规则 - from: - podSelector: # 只允许具有role=frontend标签的Pod访问 matchLabels: role: frontend ports: # 只能使用TCP协议访问6379端口 - protocol: TCP port: 6379
- 执行以下命令,根据上述的access-demo1.yaml文件创建网络策略。
kubectl apply -f access-demo1.yaml
预期输出:
networkpolicy.networking.k8s.io/access-demo1 created
- 创建名为access-demo1.yaml文件。
- 场景二:通过网络策略限制Pod只能被指定命名空间下的Pod访问
图2 namespaceSelector
目标Pod具有role=db标签,该Pod只允许project=myproject标签的命名空间中的Pod访问其6379端口。设置该网络策略的具体操作步骤如下:
- 创建名为access-demo2.yaml文件。
vim access-demo2.yaml
以下为YAML文件内容:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: access-demo2 spec: podSelector: # 规则对具有role=db标签的Pod生效 matchLabels: role: db ingress: # 表示入规则 - from: - namespaceSelector: # 只允许具有project=myproject标签的命名空间中的Pod访问 matchLabels: project: myproject ports: # 只能使用TCP协议访问6379端口 - protocol: TCP port: 6379
- 执行以下命令,根据上述的access-demo2.yaml文件创建网络策略。
kubectl apply -f access-demo2.yaml
预期输出:
networkpolicy.networking.k8s.io/access-demo2 created
- 创建名为access-demo2.yaml文件。
通过YAML使用Egress规则
Egress不仅支持podSelector和namespaceSelector,还支持ipBlock。
仅1.23及以上版本集群支持Egress规则。
- 场景一:通过网络策略限制Pod只能访问指定地址
图3 ipBlock
目标Pod具有role=db标签,该Pod只允许访问172.16.0.16/16网段,但不允许访问该网段中的172.16.0.40/32地址。设置该网络策略的具体操作步骤如下:
- 创建名为access-demo3.yaml文件。
vim access-demo2.yaml
以下为YAML文件内容:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: access-demo3 namespace: default spec: policyTypes: # 使用Egress必须指定policyType - Egress podSelector: # 规则对具有role=db标签的Pod生效 matchLabels: role: db egress: # 表示出规则 - to: - ipBlock: cidr: 172.16.0.16/16 # 允许在出方向访问此网段 except: - 172.16.0.40/32 # 不允许在出方向访问此网段,except网段需在cidr网段内
- 执行以下命令,根据上述的access-demo3.yaml文件创建网络策略。
kubectl apply -f access-demo3.yaml
预期输出:
networkpolicy.networking.k8s.io/access-demo3 created
- 创建名为access-demo3.yaml文件。
- 场景二:通过网络策略限制Pod只能被带有特定标签的Pod访问,且只能访问指定Pod
图4 同时使用Ingress和Egress
目标Pod具有role=db标签,该Pod只允许带有role=frontend标签的Pod访问其6379端口,且该Pod只能访问带有role=web标签的Pod。网络策略中的Ingress和Egress可以定义在同一个规则中,具体操作步骤如下:
- 创建名为access-demo4.yaml文件。
vim access-demo2.yaml
以下为YAML文件内容:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: access-demo4 namespace: default spec: policyTypes: - Ingress - Egress podSelector: # 规则对具有role=db标签的Pod生效 matchLabels: role: db ingress: # 表示入规则 - from: - podSelector: # 只允许具有role=frontend标签的Pod访问 matchLabels: role: frontend ports: # 只能使用TCP协议访问6379端口 - protocol: TCP port: 6379 egress: # 表示出规则 - to: - podSelector: # 只允许访问具有role=web标签的Pod matchLabels: role: web
- 执行以下命令,根据上述的access-demo4.yaml文件创建网络策略。
kubectl apply -f access-demo4.yaml
预期输出:
networkpolicy.networking.k8s.io/access-demo4 created
- 创建名为access-demo4.yaml文件。