声明网络策略
本文档帮助你开始使用 Kubernetes 的 NetworkPolicy API 来声明控制 Pod 如何相互通信的网络策略。
开始之前
你需要有一个 Kubernetes 集群,并且 kubectl 命令行工具已配置为与你的集群通信。建议你在一个至少有两个不是控制平面主机的节点的集群上运行本教程。如果你还没有集群,可以使用 minikube 创建一个,或者使用以下 Kubernetes 游乐场之一:
你的 Kubernetes 服务器版本必须是 v1.8 或更高。要检查版本,请输入 kubectl version
。
确保你已经配置了支持网络策略的网络提供商。有许多网络提供商支持 NetworkPolicy,包括:
创建一个 nginx
Deployment 并通过 Service 暴露它
要了解 Kubernetes 网络策略如何工作,首先创建一个 nginx
Deployment。
kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
通过名为 nginx
的 Service 暴露该 Deployment。
kubectl expose deployment nginx --port=80
service/nginx exposed
上述命令创建一个包含 nginx Pod 的 Deployment,并通过名为 nginx
的 Service 暴露该 Deployment。nginx
Pod 和 Deployment 位于 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 访问该 Service 进行测试
你应该能够从其他 Pod 访问新的 nginx
Service。要从 default
命名空间中的另一个 Pod 访问 nginx
Service,请启动一个 busybox 容器:
kubectl run busybox --rm -ti --image=busybox -- /bin/sh
在你的 shell 中,运行以下命令:
wget --spider --timeout=1 nginx
Connecting to nginx (10.100.0.16:80)
remote file exists
限制对 nginx
Service 的访问
为了限制对 nginx
Service 的访问,使其仅允许带有标签 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
Deployment 中的 Pod。空的 podSelector
选择命名空间中的所有 Pod。为 Service 分派策略
使用 kubectl 从上述 nginx-policy.yaml
文件创建 NetworkPolicy
kubectl apply -f https://k8s.io/examples/service/networking/nginx-policy.yaml
networkpolicy.networking.k8s.io/access-nginx created
在未定义访问标签时测试对 Service 的访问
当你尝试从没有正确标签的 Pod 访问 nginx
Service 时,请求会超时:
kubectl run busybox --rm -ti --image=busybox -- /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 -- /bin/sh
在你的 shell 中,运行命令:
wget --spider --timeout=1 nginx
Connecting to nginx (10.100.0.16:80)
remote file exists
本页面上的条目引用了提供 Kubernetes 所需功能的第三方产品或项目。Kubernetes 项目作者对这些第三方产品或项目不负责。有关更多详细信息,请参阅CNCF 网站指南。
在提议添加额外第三方链接的更改之前,你应该阅读内容指南。