website/cn/docs/concepts/services-networking/network-policies.md

105 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
approvers:
- thockin
- caseydavenport
- danwinship
title: 网络策略
---
* TOC
{:toc}
网络策略NetworkPolicy是一种关于pod间及pod与其他网络端点间所允许的通信规则的规范。
`NetworkPolicy` 资源使用标签选择pod并定义选定pod所允许的通信规则。
## 前提
网络策略通过网络插件来实现,所以用户必须使用支持 `NetworkPolicy` 的网络解决方案 - 简单地创建资源对象,而没有控制器来使它生效的话,是没有任何作用的。
## 隔离和非隔离的Pod
默认情况下Pod是非隔离的它们接受任何来源的流量。
Pod可以通过相关的网络策略进行隔离。一旦命名空间中有网络策略选择了特定的Pod该Pod会拒绝网络策略所不允许的连接。 (命名空间下其他未被网络策略所选择的Pod会继续接收所有的流量)
## `NetworkPolicy` 资源
通过[api参考](/docs/api-reference/{{page.version}}/#networkpolicy-v1-networking)来了解资源定义。
下面是一个 `NetworkPolicy` 的示例:
```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
ingress:
- from:
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
```
除非选择支持网络策略的网络解决方案否则将上述示例发送到API服务器没有任何效果。
__必填字段__: 与所有其他的Kubernetes配置一样`NetworkPolicy` 需要 `apiVersion``kind``metadata` 字段。 关于配置文件操作的一般信息,请参考 [这里](/docs/user-guide/simple-yaml)、 [这里](/docs/user-guide/configuring-containers)和 [这里](/docs/user-guide/working-with-resources)。
__spec__: `NetworkPolicy` [spec](https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status) 中包含了在一个命名空间中定义特定网络策略所需的所有信息
__podSelector__: 每个 `NetworkPolicy` 都包括一个 `podSelector` 它对该策略所应用的一组Pod进行选择。因为 `NetworkPolicy` 目前只支持定义 `ingress` 规则,这里的 `podSelector` 本质上是为该策略定义 "目标pod" 。示例中的策略选择带有 "role=db" 标签的pod。空的 `podSelector` 选择命名空间下的所有pod。
__ingress__: 每个 `NetworkPolicy` 包含一个 `ingress` 规则的白名单列表。 (其中的)规则允许同时匹配 `from``ports` 部分的流量。示例策略中包含一条简单的规则: 它匹配一个单一的端口,来自两个来源中的一个, 第一个通过 `namespaceSelector` 指定,第二个通过 `podSelector` 指定。
所以,示例网络策略:
1. 隔离 "default" 命名空间下 "role=db" 的pod (如果它们不是已经被隔离的话)。
2. 允许从 "default" 命名空间下带有 "role=frontend" 标签的pod到 "default" 命名空间下的pod的6379 TCP端口的连接。
3. 允许从带有 "project=myproject" 标签的命名空间下的任何pod到 "default" 命名空间下的pod的6379 TCP端口的连接。
查看 [网络策略入门指南](/docs/getting-started-guides/network-policy/walkthrough) 了解更多示例。
## 默认策略
用户可以通过创建一个选择所有Pod但是不允许任何通信的网络策略来为一个命名空间创建 "默认的" 隔离策略:
```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector:
```
这可以确保即使Pod在未被其他任何网络策略所选择的情况下仍能被隔离。
或者如果用户希望允许一个命名空间下的所有Pod的所有通信 (即使已经添加了策略使得一些pod被 "隔离"),仍可以创建一个明确允许所有通信的策略:
```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all
spec:
podSelector:
ingress:
- {}
```
## 下一步呢?
- 查看 [声明网络策略](/docs/tasks/administer-cluster/declare-network-policy/)
来进行更多的示例演练