【云原生】k8s NetworkPolicy 网络策略是怎么样的

这篇具有很好参考价值的文章主要介绍了【云原生】k8s NetworkPolicy 网络策略是怎么样的。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

随着微服务的流行,越来越多的云服务平台需要大量模块之间的网络调用。

在 Kubernetes 中,网络策略(NetworkPolicy)是一种强大的机制,可以控制 Pod 之间和 Pod 与外部网络之间的流量。

Kubernetes 中的 NetworkPolicy 定义了一组规则,这些规则允许或者拒绝特定流量的传输。通过使用 NetworkPolicy,Kubernetes 管理员能够更好地掌控容器网络,确保应用程序的网络安全性。

NetworkPolicy 可以实现什么

NetworkPolicy 可被定义为 Pod 标签选择器、命名空间选择器或者两者的组合。它可以实现以下功能:

  • 限制 Pod 之间的流量:通过指定 Ingress 规则,可以阻止来自其他 Pod 的流量进入目标 Pod。
  • 允许 Pod 之间的流量:需要为目标 Pod 配置 Egress 规则,以便只允许来自特定 Pod 的流量进入。
  • 限制 Pod 与外部网络的通信:通过指定 Egress 规则,可以控制哪些类型的外部流量可以进入 Pod,并防止未经授权的访问。
  • 允许 Pod 与外部网络的通信:需要为目标 Pod 配置 Ingress 规则,以便只允许来自特定 IP 地址、端口或协议的流量进入。

使用 NetworkPolicy 时,需要考虑什么

使用 NetworkPolicy 时,需要考虑以下几个方面:

  • NetworkPolicy 只在支持它的网络插件中起作用,例如 Calico、Cilium 和 Weave Net 等。
  • 没有定义任何 NetworkPolicy 规则,则所有的流量都会被允许。
  • 定义 NetworkPolicy 后,它只适用于当前命名空间中的 Pod。
  • 在 NetworkPolicy 中指定标签选择器时,应保证其唯一性,以免给其他 Pod 带来影响。

网络策略有哪些

默认情况下,如果名字空间中不存在任何策略,则所有进出该名字空间中 Pod 的流量都被允许。

Namespace 隔离流量

默认情况下,所有 Pod 之间都是互通的。每个 Namespace 可以配置独立的网络策略,来隔离 Pod 之间的网络流量。

由此,可以通过创建匹配 Pod 的 Network Policy 来作为默认的网络策略,比如默认拒绝所有 Pod 之间 Ingress 的通信,如下:

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

默认拒绝 Pod 之间 Egress(出口) 通信的策略:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector: {}
  policyTypes:
    - Egress

甚至是默认拒绝 Pod 之间 Ingress(入口) 和 Egress(出口) 通信的策略:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress

Pod 隔离

Pod 隔离可以分为出口的隔离和入口的隔离。其实这里的“隔离”不是绝对的,而是还有一些其它限制。

比如可以通过使用标签选择器(这里可以是 namespaceSelector 和 podSelector)来控制 Pod 之间的流量。

如下面的 Network Policy:

  • 允许 default namespace 中带有 role=myfront 标签的 Pod 访问 default namespace 中带有 role=mydb 标签 Pod 的 6379 端口
  • 允许带有 project=myprojects 标签的 namespace 中所有 Pod 访问 default namespace 中带有 role=mydb 标签 Pod 的 6379 端口
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: mydb
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              project: myproject
        - podSelector:
            matchLabels:
              role: myfront
      ports:
        - protocol: tcp
          port: 6379

另外一个同时开启 Ingress 和 Egress 通信的策略为:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: mydb
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        - ipBlock:
            cidr: 192.168.0.0/16
            except:
              - 192.168.1.0/24
        - namespaceSelector:
            matchLabels:
              project: myproject
        - podSelector:
            matchLabels:
              role: myfront
      ports:
        - protocol: TCP
          port: 6379
  egress:
    - to:
        - ipBlock:
            cidr: 10.1.0.0/24
      ports:
        - protocol: TCP
          port: 5978

它用来隔离 default namespace 中带有 role=mydb 标签的 Pod:

  • 允许 default namespace 中带有 role=myfront 标签的 Pod 访问 default namespace 中带有 role=mydb 标签 Pod 的 6379 端口
  • 允许带有 project=myprojects 标签的 namespace 中所有 Pod 访问 default namespace 中带有 role=mydb 标签 Pod 的 6379 端口
  • 允许 default namespace 中带有 role=mydb 标签的 Pod 访问 10.1.0.0/24 网段的 TCP 5987 端口

使用场景

禁止访问指定服务

kubectl run web --image=nginx --labels app=web,env=prod --expose --port 80

【云原生】k8s NetworkPolicy 网络策略是怎么样的

网络策略如下:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: web-deny-all
spec:
  podSelector:
    matchLabels:
      app: web
      env: prod

只允许指定 Pod 访问服务

kubectl run apiserver --image=nginx --labels app=bookstore,role=api --expose --port 80

网络策略如下:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: api-allow
spec:
  podSelector:
    matchLabels:
      app: bookstore
      role: api
  ingress:
  - from:
      - podSelector:
          matchLabels:
            app: bookstore

禁止 namespace 中所有 Pod 之间的相互访问

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
  namespace: default
spec:
  podSelector: {}

禁止其他 namespace 访问服务

kubectl create namespace secondary
kubectl run web --namespace secondary --image=nginx \
    --labels=app=web --expose --port 80

【云原生】k8s NetworkPolicy 网络策略是怎么样的

网络策略配置如下:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  namespace: secondary
  name: web-deny-other-namespaces
spec:
  podSelector:
    matchLabels:
  ingress:
  - from:
    - podSelector: {}

此策略可以确保即使没有被其他任何 NetworkPolicy 选择的 Pod 也不会被允许流出流量。 此策略不会更改任何 Pod 的入站流量隔离行为。

只允许指定 namespace 访问服务

kubectl run web --image=nginx \
    --labels=app=web --expose --port 80

网络策略如下:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: web-allow-prod
spec:
  podSelector:
    matchLabels:
      app: web
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              purpose: production

允许外网访问服务

kubectl run web --image=nginx --labels=app=web --port 80
kubectl expose deployment/web --type=LoadBalancer

网络策略如下:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: web-allow-external
spec:
  podSelector:
    matchLabels:
      app: web
  ingress:
    - ports:
        - port: 80
      from: []

有了这个策略,任何额外的策略都不会导致来自这些 Pod 的任何出站连接被拒绝。 此策略对进入任何 Pod 的隔离没有影响。
以上这些使用场景的 YAML 配置定义就不再赘述了,有不明白的地方可以看下我之前的文章。

总结

Kubernetes 中的 NetworkPolicy 是一个非常重要的特性,可以控制容器网络的流量和安全,确保应用程序的可靠性和安全性。

为了更好地使用它,需要对其有一定的理解并遵循相应的配置和管理规则。文章来源地址https://www.toymoban.com/news/detail-433253.html

到了这里,关于【云原生】k8s NetworkPolicy 网络策略是怎么样的的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【云原生】k8s中Contrainer 生命周期回调/策略/指针学习

    个人主页: 征服bug-CSDN博客 kubernetes专栏: kubernetes_征服bug的博客-CSDN博客  目录 1 容器生命周期 2 容器生命周期回调/事件/钩子 3 容器重启策略 4 自定义容器启动命令 5 容器探针 1 容器生命周期 Kubernetes 会跟踪 Pod 中每个容器的状态,就像它跟踪 Pod 总体上的阶段一样。 你可

    2024年02月14日
    浏览(45)
  • 【云原生 • Kubernetes】认识 k8s 网络、外部网络访问 k8s 内部服务

    目录 一、认识 Kubernetes 网络 二、外部网络如何访问 k8s 内部服务 1. NodePort 2. Load Balancer 3. Ingress Kubernetes 最底层的网络为节点网络,用来保证 k8s 集群的节点(master 和 worker、worker 节点之间)能够做正常的 IP 寻址和通讯。 Kubernetes 第二层网络就是 Pod 网络,构建于节点网络之上

    2024年01月16日
    浏览(72)
  • 【 云原生 | K8S 】部署 CNI 网络组件+k8s 多master集群部署+负载均衡及Dashboard k8s仪表盘图像化展示管理

    目录 1 部署 CNI 网络组件 1.1 部署 flannel 1.2 部署 Calico 1.3 部署 CoreDNS 2 负载均衡部署 3 部署 Dashboard K8S 中 Pod 网络通信: ●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器(Pod 内的容器是不会跨宿主机的)共享同一个网络命令空间,相当于它们在同一台机器上一样,可以用

    2024年01月22日
    浏览(55)
  • 【云原生】K8S二进制搭建二:部署CNI网络组件

    解决了什么问题? 容器镜像(带有应用程序规范的文件)必须以标准化,安全和隔离的方式启动 标准化,因为无论它们在何处运行,都需要标准的操作规则。 安全,因为你不希望任何不应该访问它的人,对它操作。 隔离,因为你不希望应用程序影响其他应用,或受其他应用

    2024年02月10日
    浏览(45)
  • 【云原生】k8s 前置环境 网络配置 VMware Linux共享上网(iptables forward)

    本文介绍了如何使用 Linux iptalbes 来使其他内网主机进行上网。 解释说明:一般情况下,VMware安装好后会出现两张网卡,vmnet1 与 vmnet8 。其中vmnet1 为仅主机模式(虚拟机之间可通信,虚拟机与宿主机可通信,不能上网);vmnet8 为 NAT 模式(虚拟机之间可通信,虚拟机与宿主机

    2024年02月21日
    浏览(55)
  • 【云原生-K8s】kubeadm搭建安装k8s集群v1.25版本完整教程【docker、网络插件calico、中间层cri-docker】

    从 k8s 1.24开始,dockershim已经从kubelet中移除,但因为历史问题docker却不支持kubernetes主推的CRI(容器运行时接口)标准,所以docker不能再作为k8s的容器运行时了,即从k8s v1.24开始不再使用docker了 但是如果想继续使用docker的话,可以在kubelet和docker之间加上一个中间层cri-docker。

    2024年02月03日
    浏览(45)
  • k8s的策略

    Scheduler的调度算法: 预算策略 过滤出合适的节点 优先策略 选择部署的节点 NodeName:硬策略,不走调度策略,node1 nodeSelector:根据节点的标签选择,会走一个调度算法 只要是走调度算法,在不满足预算策略的情况下,所有的pod都是pending Node节点的亲和性: 硬策略:必须满足

    2024年01月16日
    浏览(34)
  • k8s---调度策略设置

    1.命令 kubectl cordon master 禁止节点调度 kubeclt uncordon master 允许节点调度 2.设置污点 例; 3、设置容忍master污点 在 pod 的 spec 中设置 tolerations 字段 命令 查看是否设置成功

    2024年02月08日
    浏览(48)
  • 【K8S 云原生】K8S的图形化工具——Rancher

    目录 一、rancher概述 1、rancher概念 2、rancher和K8S的区别: 二、实验 1、安装部署 2、给集群添加监控: 3、创建命名空间: 4、创建deployment: 5、创建service: 6、创建ingress: 7、创建hpa 8、创建PVC 1、rancher概念 rancher实用一个开源的企业级多集群的K8S管理平台 2、rancher和K8S的区别

    2024年01月25日
    浏览(42)
  • 【K8S 云原生】K8S的包包管理器-helm

    目录 一、helm概念 1、什么是helm 2、helm的概念: 二、实验部署: 1、安装helm: 2、对chart仓库的基本使用: 2.1、查看和更新chart仓库 2.2、安装chart 2.3、卸载chart: 3、helm自定义模版: 3.1、使用官方模版 3.2、使用自定义模版 1、方法1:基于目录安装: 2、方法2:基于目录打包好

    2024年01月23日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包