K8s - Kubernetes使用详解11(使用Canal网络实现Network Policy)

作者: hangge 发布时间: 2019-09-02 浏览: 3667 次 编辑

    我们知道目前已有多种支持 Kubernetes 的网络方案,比如 FlannelCalicoCanalWeave Net 等。因为它们都实现了 CNI 规范,所以用户无论选择哪种方案,得到的网络模型都一样,即每个 Pod 都有独立的 IP,可以直接通信。

    而这些方案除了底层实现不同,性能上有差异外。最大的区别就是就是是否支持 Network Policy 了。

十一、使用 Canal 网络实现 Network Policy

1,Network Policy 介绍

  • Network Policy 是 Kubernetes 的一种资源。Network Policy 通过 Label 选择 Pod,并指定其他 Pod 或外界如何与这些 Pod 通信。

  • 默认情况下,所有 Pod 是非隔离的,即任何来源的网络流量都能够访问 Pod,没有任何限制。当为 Pod 定义了 Network Policy,只有 Policy 允许的流量才能访问 Pod

2,Network Policy 的支持情况

不是所有的 Kubernetes 网络方案都支持 Network Policy。比如 Flannel 就不支持,Calico 是支持的。

本次我们使用 Canal 来演示 Network PolicyCanal 这个开源项目很有意思,它用 Flannel 实现 Kubernetes 集群网络,同时又用 Calico 实现 Network Policy

3,部署 Canal

(1)部署 Canal 与部署其他 Kubernetes 网络方案非常类似,都是在执行了 kubeadm init 初始化 Kubernetes 集群之后通过 kubectl apply 安装相应的网络方案。
(2)如果之前已经使用了其它网络方案,则可在每个节点上执行 kubeadm reset 销毁当前集群,让后重新 kubeadm init 初始化集群后再进行安装。

(1)假设我们执行如下命令初始化集群:

1
kubeadm init --pod-network-cidr=10.244.0.0/16


(2)接着就可以执行下面的命令部署 Canal

1
2
kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/canal/canal.yaml
  • 注意:这个命令可能会随版本变更,具体可以访问 kubernetes 官网查看(点击跳转):

原文:K8s - Kubernetes使用详解11(使用Canal网络实现Network Policy)

(3)Canal 部署成功后,可以执行如下命令查看:

1
2
kubectl get --namespace=kube-system daemonset canal
kubectl get --namespace=kube-system pod -o wide|grep canal

原文:K8s - Kubernetes使用详解11(使用Canal网络实现Network Policy)

4,Network Policy 的使用样例

(1)将设我们部署一个了 httpd 应用,其配置文件 httpd.yaml 内容如下:

  • httpd 添加了个 run: httpd 标签 label,这个是为了后面设置 Network Policy 访问规则使用。

  • httpd 有三个副本,通过 NodePort 类型的 Service 对外提供服务。

  • 无论是其它 Pod,还是集群节点、集群外都是可以访问这个 Service

原文:K8s - Kubernetes使用详解11(使用Canal网络实现Network Policy)


(2)接着我们创建一个 Network Policy(文件名为 policy.yml),内容如下:

  • 通过 matchLabels 配置定义将此 Network Policy 中的访问规则应用于 label  run: httpd 的 Pod(即 httpd 应用的三个副本 Pod

  • ingress 中定义只有 label  access: "true" 的 Pod 才能访问应用,且只能访问 80 端口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: access-httpd
spec:
  podSelector:
    matchLabels:
      run: httpd
  ingress:
    - from:
      - podSelector:
          matchLabels:
            accss: "true"
      ports:
        - protocol: TCP
          port: 80


(3)执行如下命令创建 Network Policy 后会发现:只有 label 为 access: "true" 的 Pod 才能访问 httpd 应用,且只能访问 80 端口(也无法 ping)。

1
kubectl apply -f policy.yml


(4)如果希望让集群节点和集群外也能够访问到这个 httpd 应用,可以对 Network Policy 做如下修改,然后执行 kubectl apply 命令应用新的 Network Policy 即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: access-httpd
spec:
  podSelector:
    matchLabels:
      run: httpd
  ingress:
    - from:
      - podSelector:
          matchLabels:
            accss: "true"
      - ipBlock:
        cidr: 10.0.0.0/24
      ports:
        - protocol: TCP
          port: 80


注意:除了通过 ingress 限制进入的流量,也可以用 egress 限制外出的流量。大家可以参考官网相关文档和示例,这里就不赘述了。


原文链接:https://www.hangge.com/blog/cache/detail_2440.html