K8S之网络策略


参考视频:https://ke.qq.com/course/1709963

一、概述

网络策略(Network Policy),用于限制Pod出入流量(Pod的ACL),提供Pod级别和Namespace级别网络访问控制。

网络策略是有CNI(calico)组件实现的,底层调用iptable实现具体网络规则。

注意:flannel网络插件不支持网络策略

1.1.应用场景

  • 应用程序间的访问控制。例如微服务A允许访问微服务B,微服务C不能访问微服务A

  • 开发环境命名空间不能访问测试环境命名空间Pod

  • 当Pod暴露到外部时,需要做Pod白名单

  • 多租户网络环境隔离

1.2.Pod网络入口方向隔离

  • 基于Pod级网络隔离:只允许特定对象访问Pod(使用标签定义),允许白名单上的IP地址或者IP段访问Pod
  • 基于Namespace级网络隔离:多个命名空间,A和B命名空间Pod完全隔离。

1.3.Pod网络出口方向隔离

  • 拒绝某个Namespace上所有Pod访问外部
  • 基于目的IP的网络隔离:只允许Pod访问白名单上的IP地址或者IP段
  • 基于目标端口的网络隔离:只允许Pod访问白名单上的端口

二、案例

2.1.案例一:对项目Pod入流量访问控制

隔离default命名空间中标签为app=web的Pod,只允许default命名空间中标签为run=client1的Pod访问80端口

a.准备测试环境

kubectl create deployment web --image=nginx
kubectl run client1 --image=busybox -- sleep 36000
kubectl run client2 --image=busybox -- sleep 36000

Pod正常启动,注意标签部分
在这里插入图片描述

b.应用策略前的网络访问情况

获取web Pod的PodIP为10.244.235.212
在这里插入图片描述
分别进入到client1和client2中访问10.244.235.212
client1
在这里插入图片描述
client2
在这里插入图片描述
均可以正常访问

c.网络策略network_policy.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: web
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          project: default
    - podSelector:
        matchLabels:
          run: client1
    ports:
    - protocol: TCP
      port: 80

解释:

podSelector:目标Pod,根据标签选择
policyTypes:策略类型,指定策略用于入站、出站流量。
Ingress:from是可以访问的白名单,可以来自于IP段、命名空间、Pod标签等,ports是可以访问的端口。
Egress:这个Pod组可以访问外部的IP段和端口。

kubectl apply -f network_policy.yaml
kubectl get networkpolicy
在这里插入图片描述

d.应用策略后的网络访问情况

client1和client2均不能ping通web
client1可以访问web的80端口,client2不可以
在这里插入图片描述

2.2.案例二:Namespace级Pod出入流量访问控制

default命名空间下所有pod可以互相访问,也可以访问其他命名空间Pod,但其他命名空间不能访问default命名空间Pod

a.准备测试环境

在kube-system命名空间下创建client3 Pod

kubectl run client3 --image=busybox -nkube-system -- sleep 36000

b.网络策略network_policy.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-from-other-namespaces
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector: {}

解释:

podSelector: {}:如果未配置,默认所有Pod
from.podSelector: {} : 如果未配置,默认不允许

kaf network_policy.yaml
kubectl get networkpolicy
在这里插入图片描述

c.验证,省略

kube-system命名空间中的client3不能访问default命名空间中的web

<p> <span style="color:#333333;">Kubernetes</span><span style="color:#333333;">是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。</span> </p> <p> <span style="color:#333333;"><br /></span> </p> <p> <span style="color:#333333;">在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。</span> </p> <p> <span style="color:#333333;"> </span> </p> <p> <span style="color:#333333;">K8s</span><span style="color:#333333;">网络kubernetes的管理中是不可或缺的部分,本套课程主要围绕目前主流的flannel和calico两个网络组件进行讲解。还深入的剖析了calico和k8s网络策略等。</span> </p> <p> <br /></p> <p> <span style="color:#333333;">主要讲解K8S网络的以下几个方面:</span> </p> <p> <span style="color:#333333;">  1. Flannel</span><span style="color:#333333;">网络在k8s中的应用,及三种后端模式的演示。</span> </p> <p> <span style="color:#333333;">  2. Calico</span><span style="color:#333333;">网络在k8s中的架构及部署。</span> </p> <p> <span style="color:#333333;">  3. Calico</span><span style="color:#333333;">各选项的调整及对网络性能的优化。</span> </p> <p> <span style="color:#333333;">  4. Calico</span><span style="color:#333333;">网络策略和K8s网络策略的常见用法及案例。</span> </p> <p> <span style="color:#333333;">  5. Calico</span><span style="color:#333333;">网络策略的高级使用场景,比如限制到k8s节点的流量及高并发流量的旁路等。</span> </p> <p> <span style="color:#333333;">  6. Flannel</span><span style="color:#333333;">网络的迁移及和calico策略的集成。</span> </p> <p> <span style="color:#333333;"><br /></span> </p> <p> <span style="color:#FF0000;">注意: 本课程学习需要具有一定的Linux基础,网络基础,至少需要您了解网络七层协议,路由等基础知识,并掌握Docker和k8s相关知识点。</span> </p> <p> <span style="color:#FF0000;"><br /></span> </p> <p> <span style="color:#FF0000;"><img src="https://img-bss.csdn.net/202003160241495369.png" alt="" /><br /></span> </p> <p> <span style="color:#FF0000;"><br /></span> </p> <p> <span style="color:#FF0000;"><img src="https://img-bss.csdn.net/202003160242041406.png" alt="" /><br /></span> </p> <p> <span style="color:#FF0000;"><img src="https://img-bss.csdn.net/202003160242183493.png" alt="" /><br /></span> </p>
相关推荐
<p> <span style="color:#333333;">Kubernetes</span><span style="color:#333333;">是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。</span> </p> <p> <span style="color:#333333;"><br /></span> </p> <p> <span style="color:#333333;">在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。</span> </p> <p> <span style="color:#333333;"><br /></span> </p> <p> <span style="color:#333333;">虽说我们可以使用比如Kubeadm工具可以简化k8s集群的部署,但这却对我们k8s的各个组件如何协同工作,及排错造成困扰。本套课程主要是以二进制的方式来一步步的安装k8s的集群,来加深我们对K8s集群进一步的理解。同时也可以作为我们生产部署的一种方式。</span> </p> <p> <span style="color:#333333;"><br /></span> </p> <p> <strong><span style="color:#333333;"><span>知识讲解:</span></span></strong> </p> <p> <span style="color:#333333;"><span>   1.   </span></span><span style="color:#333333;">概述了K8s的集群的一个整体架构。</span> </p> <p> <span style="color:#333333;"> 2. 为了实现各个组件的通信,讲解了如何为各组件签发证书、配置kubeconfig、和产生加密的key及密钥。</span> </p> <p> <span style="color:#333333;"> 3. Etcd</span><span style="color:#333333;">键值存储集群的部署。</span> </p> <p> <span style="color:#333333;"> 4. K8s</span><span style="color:#333333;">的主节点的三大组件一步步的部署。</span> </p> <p> <span style="color:#333333;"> 5. K8s</span><span style="color:#333333;">的worker节点的三大组件及flannel网络插件部署。</span> </p> <p> <span style="color:#333333;"> 6. 部署kube coredns作为k8s内部的域名解析。</span> </p> <p> <span style="color:#333333;"><span><br /></span></span> </p> <p> <span style="color:#333333;"><span>注意:</span></span><span style="color:#FF0000;">本课程学习需要具有一定的Linux基础,**是学习过K8s集群或者在使用K8S使用有一段时间的。这样可以更好的理解本套课程内容。</span> </p> <p> <span style="color:#FF0000;"><br /></span> </p> <p> <span style="color:#FF0000;"><img src="https://img-bss.csdn.net/202003240658215582.png" alt="" /><br /></span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页