<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>network policy | 伪架构师</title>
    <link>/tags/network-policy/</link>
      <atom:link href="/tags/network-policy/index.xml" rel="self" type="application/rss+xml" />
    <description>network policy</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Wed, 28 Feb 2018 22:57:14 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>network policy</title>
      <link>/tags/network-policy/</link>
    </image>
    
    <item>
      <title>Kubernetes 网络策略指南</title>
      <link>/post/network-policy-for-k8s/</link>
      <pubDate>Wed, 28 Feb 2018 22:57:14 +0800</pubDate>
      <guid>/post/network-policy-for-k8s/</guid>
      <description>

&lt;p&gt;&lt;img src=&#34;images/have-fun.gif&#34; alt=&#34;You can get stuff like this&#34; /&gt;
&lt;em&gt;有了网络策略，你也做得到！&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;这里包含一系列的 &lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/network-policies/&#34; target=&#34;_blank&#34;&gt;Kubernetes 网络策略&lt;/a&gt;的相关用例以及相关的 YAML 文件。想要知道如何在 Kubernetes 中对某一应用的流量进行阻拦或者限制，请继续阅读。&lt;/p&gt;

&lt;p&gt;尝试网络策略的最简单方法就是创建一个新的 &lt;a href=&#34;https://cloud.google.com/container-engine&#34; target=&#34;_blank&#34;&gt;Google Container Engine 集群&lt;/a&gt;。在现有集群上应用网络策略，可能会造成网络中断。在成文期间，多数云供应商尚未提供内置的网络策略支持。&lt;/p&gt;

&lt;p&gt;如果你对网络策略一窍不通，建议首先阅读我的文章：&lt;a href=&#34;https://ahmet.im/blog/kubernetes-network-policy/&#34; target=&#34;_blank&#34;&gt;Securing Kubernetes Cluster Networking&lt;/a&gt;。&lt;/p&gt;

&lt;h3 id=&#34;开始之前&#34;&gt;开始之前&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;创建集群&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;基础&#34;&gt;基础&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;拦截到一个应用的所有流量&lt;/li&gt;
&lt;li&gt;限制到一个应用的流量&lt;/li&gt;
&lt;li&gt;允许所有目标为某个应用的流量&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;命名空间&#34;&gt;命名空间&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;拦截当前命名空间中，所有白名单之外的流量&lt;/li&gt;
&lt;li&gt;拦截所有来自于其他命名空间的流量&lt;/li&gt;
&lt;li&gt;允许来自所有命名空间的，目标为某应用的流量&lt;/li&gt;
&lt;li&gt;允许所有来自于某命名空间的流量&lt;/li&gt;
&lt;li&gt;允许来自某命名空间某些 Pod 的流量&lt;/li&gt;
&lt;li&gt;限制当前命名空间内到某应用的流量&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;控制外部客户端流量&#34;&gt;控制外部客户端流量&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;允许外部客户端的流量&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;进阶&#34;&gt;进阶&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;只允许目标为指定端口的流量&lt;/li&gt;
&lt;li&gt;用多个选择器选择允许通过的流量&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;控制外发流量-egress&#34;&gt;控制外发流量（Egress）&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;拦截来自某应用的外发流量&lt;/li&gt;
&lt;li&gt;拦截命名空间内所有白名单之外的 Egress 流量&lt;/li&gt;
&lt;li&gt;限制来从指定应用到某些 Pod 的 egress 流量。&lt;/li&gt;
&lt;li&gt;只允许目标是命名空间内某 Pod 的流量。&lt;/li&gt;
&lt;li&gt;拦截外部的 egress 流量&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&#34;作者&#34;&gt;作者&lt;/h2&gt;

&lt;p&gt;Ahmet Alp Balkan (&lt;a href=&#34;https://twitter.com/ahmetb&#34; target=&#34;_blank&#34;&gt;@ahmetb&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Copyright 2017, Google Inc. Distributed under Apache License Version 2.0 ,see &lt;a href=&#34;LICENSE&#34; target=&#34;_blank&#34;&gt;LICENSE&lt;/a&gt; for details.&lt;/p&gt;

&lt;p&gt;声明: 这并非 Google 官方文档。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>借助 Calico，管窥 Kubernetes 网络策略</title>
      <link>/post/network-policy-basic-calico/</link>
      <pubDate>Thu, 09 Mar 2017 20:37:41 +0800</pubDate>
      <guid>/post/network-policy-basic-calico/</guid>
      <description>

&lt;p&gt;Kubernetes 提出了一系列 CXI 的标准容器接口，其中的 CNI 以插件方式支持多种网络。新增的 networkpolicy API 对象，提供了对网络策略的支持，本文以 Calico 为例，实际操作一个网络策略的创建和测试。&lt;/p&gt;

&lt;h2 id=&#34;环境准备&#34;&gt;环境准备&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;一个 Kubernetes 集群&lt;/li&gt;
&lt;li&gt;Kubelet 和 API Server 都开启了 &lt;code&gt;--allow_privileged=true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Kubelet 指定使用 CNI ：&lt;code&gt;--network-plugin=cni&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;为了避免某些不可描述的网络设施的影响，建议下载几个镜像

&lt;ul&gt;
&lt;li&gt;quay.io/calico/node:v1.0.2&lt;/li&gt;
&lt;li&gt;calico/cni:v1.5.6&lt;/li&gt;
&lt;li&gt;calico/kube-policy-controller:v0.5.2&lt;/li&gt;
&lt;li&gt;calico/ctl:v1.0.2&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;运行-calico&#34;&gt;运行 Calico&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;下载 &lt;code&gt;http://docs.projectcalico.org/v2.0/getting-started/kubernetes/installation/hosted/calico.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如果用私库镜像，需要修改其中的几个镜像地址&lt;/li&gt;
&lt;li&gt;修改 &lt;code&gt;data/etcd_endpoints&lt;/code&gt; 的数据为可访问的 etcd 的地址。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl create -f calico.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;这里在 kube-system 中创建了一个 DaemonSet 和一个 Deployment，分别用于提供 CNI 支持和网络策略支持。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ kubectl get deployment,daemonset,svc --all-namespaces                                          [9:55:14]
NAMESPACE     NAME                              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kube-system   deploy/calico-policy-controller   1         1         1            1           10h

NAMESPACE     NAME             DESIRED   CURRENT   READY     NODE-SELECTOR   AGE
kube-system   ds/calico-node   2         2         2         &amp;lt;none&amp;gt;          10h

NAMESPACE   NAME             CLUSTER-IP        EXTERNAL-IP   PORT(S)   AGE
default     svc/kubernetes   172.200.0.1       &amp;lt;none&amp;gt;        443/TCP   19h
default     svc/nginx        172.200.183.204   &amp;lt;none&amp;gt;        80/TCP    9h
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;网络策略&#34;&gt;网络策略&lt;/h2&gt;

&lt;p&gt;为测试效果，我们首先创建一个 Namespace&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl create ns policy&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;然后是 Nginx 部署和服务：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;---
kind: ReplicationController
apiVersion: v1
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  replicas: 1
  selector:
    name: nginx
  template:
    metadata:
      labels:
        name: nginx
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          protocol: TCP

---
kind: Service
apiVersion: v1
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  selector:
    name: nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;然后我们用 alpine 镜像测试一下对这一服务进行访问：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl run alpine --rm -it --image=alpine sh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;运行成功后，在 Alpine 的 Shell 中输入：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;wget -O - -T 5 http://nginx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;会出现 Nginx 的缺省页面的代码。&lt;/p&gt;

&lt;p&gt;接下来我们给 Default Namespace 加一个缺省拒绝访问的注解：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ kubectl annotate ns default &amp;quot;net.beta.kubernetes.io/network-policy={\&amp;quot;ingress\&amp;quot;: {\&amp;quot;isolation\&amp;quot;: \&amp;quot;DefaultDeny\&amp;quot;}}&amp;quot;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;重复测试过程，会发现超时错误。&lt;/p&gt;

&lt;p&gt;我们来创建一条策略：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;kind: NetworkPolicy
apiVersion: extensions/v1beta1
metadata:
  name: access-nginx
spec:
  podSelector:
    matchLabels:
      run: nginx
  ingress:
    - from:
      - podSelector:
          matchLabels:
            access: &amp;quot;true&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;很容易理解，对于符合 &amp;ldquo;run=nginx&amp;rdquo; 的 Pod，只有 &amp;ldquo;access=true&amp;rdquo; 的 Pod 能够访问&lt;/p&gt;

&lt;p&gt;给 Alpine 带上标签重新运行：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl run alp --image=alpine --labels=&amp;quot;access=true&amp;quot; --rm -ti sh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;重新 wget，会发现访问能力已经恢复。&lt;/p&gt;

&lt;p&gt;本文主要线索来自官方示例：&lt;code&gt;https://kubernetes.io/docs/getting-started-guides/network-policy/walkthrough/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;安装方法来自 Calico 官网。&lt;/p&gt;

&lt;p&gt;这只是一个很入门的介绍，后续会有更多进一步的尝试。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
