声明网络策略
本文件帮助您开始使用 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 子域名。
注意
NetworkPolicy 包含一个podSelector
,它选择将策略应用于的 Pod 组。您可以看到此策略选择了具有标签 app=nginx
的 Pod。标签是在 nginx
部署中的 Pod 中自动添加的。空的 podSelector
选择命名空间中的所有 pod。将策略分配给服务
使用 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 网站指南。
在提出添加额外第三方链接的更改之前,您应该阅读 内容指南。