实战练习
设置配置环境:
[candidate@node-1] $ kubectl config use-context hk8s
Task
在现有的 namespace my-app 中创建一个名为 allow-port-from-namespace 的新 NetworkPolicy。
确保新的 NetworkPolicy 允许 namespace echo 中的 Pods 连接到 namespace my-app 中的 Pods 的 9000 端口。
进一步确保新的 NetworkPolicy:
不允许对没有在监听 端口 9000 的 Pods 的访问
不允许非来自 namespace echo 中的 Pods 的访问
理论学习
Kubernetes NetworkPolicy
Kubernetes NetworkPolicy 用于定义和管理网络访问策略,它提供了一种声明性的方式来控制 Pod 之间以及 Pod 与集群内外其他网络实体之间的通信。
通过使用 NetworkPolicy 可以定义规则以限制进出 Pod 的网络流量。 这些规则可以基于多个属性进行过滤,利用 Pod 的标签、命名空间、IP 地址和端口。可以定义允许或拒绝特定来源或目标的流量,并制定允许的协议和端口范围。
NetworkPolicy 可以帮助实施网络隔离、安全性、流量控制和应用程序微服务架构等策略。
- 网络隔离 :通过定义 NetworkPolicy,您可以限制 Pod 与其他 Pod 或命名空间之间的通信,实现网络隔离和安全性。
- 流量控制:NetworkPolicy 允许根据源 IP 、目标 IP 、协议和端口的等属性来控制进出 Pod 的流量,以确保只用经过授权的流量可以访问特定的 Pod。
- 应用程序微服务: 可以定义应用程序的微服务之间的网络通信策略,从而实现应用程序的模块化和解耦。每个微服务可以根据需要定义自己的网络策略。
- 安全策略:NetworkPolicy 可以仅允许来自特定 IP 范围的流量或仅允许使用特定的安全协议。
下面是一个 NetworkPolicy 的示例:
apiVersion: networking.k8s.io/v1 # 指定使用的 Kubernetes API 版本
kind: NetworkPolicy # 声明配置为 NetworkPolicy 资源
metadata: # 元数据 用于定义 NetworkPolicy 的名称和命名空间
name: test-network-policy
namespace: default
spec: # 定义规则与策略
podSelector: # 选择应用 NetworkPolicy 的目标 Pod
matchLabels: # 匹配标签
role: db
policyTypes: # 策略类型
- Ingress # 允许入站流量
- Egress # 允许出站流量
ingress: # 入站规则
- from: # 允许流量来源
- ipBlock: # 允许来自 IP 段的流量
cidr: 172.17.0.0/16
except: # 排除不允许的 IP 段
- 172.17.1.0/24
- namespaceSelector: # 允许来自特定命名空间的流量
matchLabels:
project: myproject
- podSelector: # 允许来自特定标签的 Pod
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress: # 出站规则,允许从 Pod 发出的流量
- to: # 指定允许流量去往的目标
- ipBlock: # 指定允许去往的 IP 段
cidr: 10.0.0.0/24
ports: # 指定允许的端口和协议
- protocol: TCP
port: 5978
操作步骤
- 进入题目指定集群
$ kubectl config use-context k8s
- 查看 Namespace 标签
# 获取 Namespace echo 的标签
$ kubectl get ns echo --show-labels
# 为 Namespace echo 添加标签
$ kubectl label ns echo project=echo
- 上官网复制项目 yaml 文件,并根据题目要求修改 yaml 文件内容
# 以下内容以在满足题目要求的情况下最小化 NetworkPolicy 策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: diy-namespace
namespace: my-app
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
project: echo
ports:
- protocol: TCP
port: 9000
- 在服务器上创建 NetworkPolicy.yaml 将上面 yaml 内容写入其中
# 编辑 yaml 文件
$ vim NetworkPolicy.yaml
# 执行 NetworkPolicy 策略
$ kubectl apply -f NetworkPolicy.yaml
检查命令
# 查看 Namespace echo NetworkPolicy 策略
$ kubectl describe networkpolicy -n my-app
参考链接:https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/