声明网络策略

    你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

    您的 Kubernetes 服务器版本必须不低于版本 v1.8. 要获知版本信息,请输入 kubectl version.

    你首先需要有一个支持网络策略的 Kubernetes 集群。已经有许多支持 NetworkPolicy 的网络提供商,包括:

    创建一个nginx Deployment 并且通过服务将其暴露

    为了查看 Kubernetes 网络策略是怎样工作的,可以从创建一个nginx Deployment 并且通过服务将其暴露开始

    1. deployment.apps/nginx created
      1. service/nginx exposed

      上述命令创建了一个带有一个 nginx 的 Deployment,并将之通过名为 nginx 的 Service 暴露出来。名为 nginx 的 Pod 和 Deployment 都位于 default 名字空间内。

      1. kubectl get svc,pod
      1. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
      2. svc/kubernetes 10.100.0.1 <none> 443/TCP 46m
      3. svc/nginx 10.100.0.16 <none> 80/TCP 33s
      4. NAME READY STATUS RESTARTS AGE

      你应该可以从其它的 Pod 访问这个新的 nginx 服务。 要从 default 命名空间中的其它s Pod 来访问该服务。可以启动一个 busybox 容器:

      在你的 Shell 中,运行下面的命令:

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

      限制 nginx 服务的访问

      如果想限制对 nginx 服务的访问,只让那些拥有标签 access: true 的 Pod 访问它, 那么可以创建一个如下所示的 NetworkPolicy 对象:

      1. apiVersion: networking.k8s.io/v1
      2. kind: NetworkPolicy
      3. metadata:
      4. name: access-nginx
      5. podSelector:
      6. matchLabels:
      7. app: nginx
      8. ingress:
      9. - podSelector:
      10. matchLabels:
      11. access: "true"

      说明: NetworkPolicy 中包含选择策略所适用的 Pods 集合的 podSelector。 你可以看到上面的策略选择的是带有标签 app=nginx 的 Pods。 此标签是被自动添加到 nginx Deployment 中的 Pod 上的。 如果 podSelector 为空,则意味着选择的是名字空间中的所有 Pods。

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

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

      测试没有定义访问标签时访问服务

      如果你尝试从没有设定正确标签的 Pod 中去访问 nginx 服务,请求将会超时:

      在 Shell 中运行命令:

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

      创建一个拥有正确标签的 Pod,你将看到请求是被允许的:

      1. kubectl run busybox --rm -ti --labels="access=true" --image=busybox -- /bin/sh
      1. wget --spider --timeout=1 nginx