声明网络策略

本文档可帮助您开始使用 Kubernetes NetworkPolicy API 来声明网络策略,这些策略控制 Pod 如何相互通信。

开始之前

您需要有一个 Kubernetes 集群,并且必须配置 kubectl 命令行工具以与您的集群通信。建议在至少有两个不充当控制平面主机的节点的集群上运行本教程。如果您还没有集群,可以使用 minikube 创建一个集群,或者可以使用以下 Kubernetes 游乐场之一

您的 Kubernetes 服务器必须是 v1.8 或更高版本。要检查版本,请输入 kubectl version

确保您已配置具有网络策略支持的网络提供商。有许多支持 NetworkPolicy 的网络提供商,包括

创建一个 nginx 部署并通过服务公开它

要了解 Kubernetes 网络策略的工作原理,首先创建一个 nginx 部署。

kubectl create deployment nginx --image=nginx
deployment.apps/nginx created

通过名为 nginx 的服务公开部署。

kubectl expose deployment nginx --port=80
service/nginx exposed

以上命令创建一个带有 nginx Pod 的部署,并通过名为 nginx 的服务公开部署。nginx Pod 和部署位于 default 命名空间中。

kubectl get svc,pod
NAME                        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
service/kubernetes          10.100.0.1    <none>        443/TCP    46m
service/nginx               10.100.0.16   <none>        80/TCP     33s

NAME                        READY         STATUS        RESTARTS   AGE
pod/nginx-701339712-e0qfq   1/1           Running       0          35s

通过从另一个 Pod 访问来测试服务

您应该能够从其他 Pod 访问新的 nginx 服务。要从 default 命名空间中的另一个 Pod 访问 nginx 服务,请启动一个 busybox 容器

kubectl run busybox --rm -ti --image=busybox:1.28 -- /bin/sh

在您的 shell 中,运行以下命令

wget --spider --timeout=1 nginx
Connecting to nginx (10.100.0.16:80)
remote file exists

限制对 nginx 服务的访问

要限制对 nginx 服务的访问,以便只有带有标签 access: true 的 Pod 才能查询它,请按如下方式创建一个 NetworkPolicy 对象

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: access-nginx
spec:
  podSelector:
    matchLabels:
      app: nginx
  ingress:
  - from:
    - podSelector:
        matchLabels:
          access: "true"

NetworkPolicy 对象的名称必须是有效的DNS 子域名

将策略分配给服务

使用 kubectl 从上面的 nginx-policy.yaml 文件创建一个 NetworkPolicy

kubectl apply -f https://k8s.io/examples/service/networking/nginx-policy.yaml
networkpolicy.networking.k8s.io/access-nginx created

测试未定义访问标签时对服务的访问

当您尝试从没有正确标签的 Pod 访问 nginx 服务时,请求会超时

kubectl run busybox --rm -ti --image=busybox:1.28 -- /bin/sh

在您的 shell 中,运行该命令

wget --spider --timeout=1 nginx
Connecting to nginx (10.100.0.16:80)
wget: download timed out

定义访问标签并再次测试

您可以创建一个带有正确标签的 Pod,以查看是否允许该请求

kubectl run busybox --rm -ti --labels="access=true" --image=busybox:1.28 -- /bin/sh

在您的 shell 中,运行该命令

wget --spider --timeout=1 nginx
Connecting to nginx (10.100.0.16:80)
remote file exists

此页面上的项目引用了第三方产品或项目,这些产品或项目提供了 Kubernetes 所需的功能。Kubernetes 项目作者不对这些第三方产品或项目负责。有关更多详细信息,请参阅CNCF 网站指南

您应该在提出添加额外第三方链接的更改之前阅读内容指南

上次修改时间:2023 年 8 月 24 日下午 6:38 PST:使用 code_sample 短代码而不是 code 短代码 (e8b136c3b3)