k8s使用calico网络插件时,集群内节点防火墙策略配置方法

前言

我们在内网使用k8s时,有时候需要针对整个集群的节点设置防火墙,阻止一些外部访问,或者是仅允许白名单内的ip访问,传统做法是使用firewall之类的防火墙软件,但是,使用firewall存在如下问题:

  1. firewall针对k8s的nodeport端口设置的防火墙规则不生效
  2. 集群内节点较多时,挨个主机设置防火墙会比较繁琐。

如果集群的节点是托管到云平台上的,可以忽略本文章,直接去云平台设置防火墙策略。

如果我们的k8s插件是calico,可以通过calico的扩展功能来设置整个集群所有节点的防火墙,不会有上面两个问题的困扰。

calico的网络策略

calico网络策略的官方文档是: https://docs.tigera.io/calico/latest/network-policy/get-started/calico-policy/calico-network-policy

想要在安装了calico网络插件的k8s集群里面配置节点防火墙,首先我们需要将节点注册到calico上,在calico这个叫做 Host endpoint, 一个Host endpoint 指的是节点对外的出口,一般是一块网卡,网卡上带有ip地址,我们需要通过声明HostEndpoint来注册。
在声明HostEndpoint时,还可以指定该节点的标签,后期在进行防火墙配置时,可以通过标签来批量配置。

当声明HostEndpoint后,节点的网络策略将由Calico接管,默认的规则是拒绝所有连接。Calico为了防止整个节点的网络瘫痪,默认开放了一些端口,比如22等,后面会详细说明。

声明HostEndpoint

如前所述,我们首先需要声明一个HostEndpoint,下面是声明的Yaml:

apiVersion: projectcalico.org/v3
kind: HostEndpoint
metadata:
  name: node1-eth0
  labels:
    kubernetes-host: ingress
spec:
  interfaceName: eth0
  node: node1
  expectedIPs:
    - INSERT_IP_HERE

这个是全局配置,不需要namespace。
metadata.name是HostEndpoint的名字,一般是节点名-网卡
spec.interfaceName 是节点的网卡名,可以通过 ip addr 或者 ifconfig 等命令查看。
spec.node 是该节点在k8s中的name,可以通过 kubectl get node来查看
spec.expectedIPs 是该网卡的ip,这个是必填项。

下面是一个配置好的样例:

apiVersion: projectcalico.org/v3
kind: HostEndpoint
metadata:
  name: localhost.localdomain-enp0s8
  labels:
    kubernetes-host: ingress
spec:
  interfaceName: enp0s8
  node: localhost.localdomain
  expectedIPs:
    - 192.168.88.5

将上述内容保存到hostendpoint.yaml中执行 kubectl apply -f hostendpoint.yaml创建:

[root@localhost calico]# kubectl apply -f hostendpoint.yaml
hostendpoint.projectcalico.org/localhost.localdomain-enp0s8 created

配置默认开放的端口

接入calico的HostEndpoint默认开放了一些端口,官方清单如下:
https://docs.tigera.io/calico/latest/reference/host-endpoints/failsafe
下面是摘抄:

在这里插入图片描述

如果想要关闭这里面的部分端口,或者默认在所有节点上开放其他端口,可以通过配置 FelixConfiguration来完成,官方文档地址为: https://docs.tigera.io/calico/latest/reference/resources/felixconfig 。
如果想要修改,可以通过kubectl edit FelixConfiguration default来修改配置,下面是一个样例,默认开放的端口仅保留了22,其他全部删掉了(实际操作过程不要这么做!这里只是为了方便演示,仅仅保留一个)。

apiVersion: projectcalico.org/v3
kind: FelixConfiguration
metadata:
  name: default
spec:
  bpfLogLevel: ""
  floatingIPs: Disabled
  healthPort: 9099
  logSeverityScreen: Info
  reportingInterval: 0s
  failsafeInboundHostPorts:
    - port: 22
      protocol: tcp

开放ip白名单,其他ip默认禁止访问

设置好默认开放的端口后,下一步一般是拒绝其他的ip,仅保留指定的ip可以访问,下面是一个样例:

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: allow-cluster-internal-ingress-only
spec:
# 生效顺序从小到大排序,后面再增加开放端口的策略时,order < 20, 即可在这之前生效
  order: 20
  preDNAT: true
  applyOnForward: true
  ingress:
  # 首先接受白名单的所有请求
    - action: Allow
      source:
      # source 配置方法可以参考  https://docs.tigera.io/calico/latest/reference/resources/networkpolicy#entityrule
        nets: 
          - 192.168.88.0/24
  # 然后拒绝白名单ip以外的所有请求
    - action: Deny
      source:
      # Deny规则要加上排除白名单的网段,理论上不需要这个,但是遇到过奇怪的BUG,没加上导致把上面开放的ip都Drop掉了
        notNets: 
          - 192.168.88.0/24
  selector: has(kubernetes-host)   # 选择器。选择了包含kubernetes-host标签的所有HostEndpoint

开放指定端口

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: allow-external-port-ingress
spec:
  order: 10
  preDNAT: true
  applyOnForward: true
  ingress:
  # 放通目标是指定端口的所有请求  当然也可以增加source字段指定来源ip/ip段
    - action: Allow
      destination:
      # 配置方法可以参考  https://docs.tigera.io/calico/latest/reference/resources/networkpolicy#entityrule
        ports:
          - 3306
          - 30030
  selector: has(kubernetes-host)   # 选择器。选择了包含kubernetes-host标签的所有HostEndpoint

注意这里的selector可以给某一两个节点打上特殊标签,选择到指定的一两个节点,给他们开放端口。

更多细节请查阅官方文档,这里仅给出了少量用法,官方支持的功能还是很多的。

修改或查看已有的网络策略/HostEndpoint

查看已有的网络策略:
kubectl get GlobalNetworkPolicy
kubectl describe GlobalNetworkPolicy xxx
修改已有的网络策略
kubectl edit GlobalNetworkPolicy xxx
删除网络策略
kubectl delete GlobalNetworkPolicy xx

HostEndpoint的操作也是一样的,只是把GlobalNetworkPolicy改成HostEndpoint就可以了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/573419.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity inputSystem 读取输入值的方法

1&#xff1a;通过关在 PlayerInput 获取 设置后之后在同意物体上挂载C# 脚本 通过事件获得 2&#xff1a; 生成 C#脚本 通过C# 脚本获得 3&#xff1a;通过回调函数

redis中的缓存穿透问题

缓存穿透 缓存穿透问题&#xff1a; 一般请求来到后端&#xff0c;都是先从缓存中查找数据&#xff0c;如果缓存中找不到&#xff0c;才会去数据库中查询数据。 而缓存穿透就是基于这一点&#xff0c;不断发送请求查询不存在的数据&#xff0c;从而使数据库压力过大&#xff…

python+vue得物文具玩具礼品商城系统flask-django

网站素材&#xff1a;收集好看的素材&#xff0c;然后使用PS做出适合网页尺寸的图片。在需求分析阶段以前期调研结果为基础&#xff0c;理解系统功能、性能、可靠性等要求&#xff0c;采用数据流图、实体联系图、状态转换图、数据字典等给出系统的逻辑模型。在设计阶段&#xf…

【静态分析】静态分析笔记07 - 指针分析基础

参考&#xff1a; 【课程笔记】南大软件分析课程7——指针分析基础&#xff08;课时9/10&#xff09; - 简书 -------------------------------------------------------------- 1. 指针分析规则 规则&#xff1a;采用推导形式&#xff0c;横线上面是条件&#xff0c;横线下…

【VTKExamples::Meshes】第十八期 OBBDicer

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例OBBDicer,并解析接口vtkOBBDicer,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. …

GaussDB轻量化运维管理工具介绍

前言 本期课程将从管理平台的架构出发&#xff0c;结合平台的实例管理、实例升级、容灾管理和监控告警的功能和操作介绍&#xff0c;全面覆盖日常运维操作&#xff0c;带您理解并熟练运用GaussDB运维平台完成运维工作。 一、GaussDB 运维管理平台简介 开放生态层 友好Web界面…

解决office2016专业增强版 “你的许可证并非正版,你可能是盗版软件的受害者“

问题描述&#xff1a;安装完office后,用kms已经激活成功&#xff0c;但是一直在上面显示“你的许可证不是正版&#xff0c;并且你可能是盗版软件的受害者&#xff0c;使用正版Office,避免干扰并保护你的文件安全。” 尝试过网上的各种方法都没用&#xff0c;后面发现是用的HEU …

分享:9.3版本无缝导入AVEVA PDMS高版本工程12.0,12.1,E3D

9.3版本可以无缝导入AVEVA PDMS的工程。 UKP3d导入AVEVA PDMS工程的方法 http://47.94.91.234/forum.php?modviewthread&tid163583&fromuid6 (出处: 优易软件-工厂设计软件专家) &#xff08;从AVEVA PDMS导出时元件和等级的功能我们正做收尾工作&#xff0c;到时可以…

Kafka---总结篇

kafka架构 主要概念 broker: 存储消息的机器 控制器controller &#xff08;1&#xff09;使用zookeeper&#xff0c; 除了提供一般的broker功能之外&#xff0c;还负责选举分区首领。通过在zookeepr中创建一个名为 /controller的临时节点称为 controller。每个选出的contro…

百科词条创建要多久成功?

在互联网信息爆炸的时代&#xff0c;百科词条作为权威的知识分享平台&#xff0c;其重要性不言而喻。那么&#xff0c;创建一个百科词条需要多久才能成功呢&#xff1f;创建百科词条是一个相当需要有耐心的工作&#xff0c;接下来伯乐网络传媒就来给大家讲一讲。 一、影响百科词…

node-sass报错如何解决

npm install 安装的时候 报node-sass错误 这个一看就是node版本兼容性导致的问题 node-sass与node版本不匹配 下面是常见的node版本和对应的node-sass版本 解决办法 1.单独安装node-sass npm install node-sass9.0.0 还是报上面的错误&#xff01;&#xff01;&#xff01;&a…

论文笔记:Leveraging Language Foundation Models for Human Mobility Forecasting

SIGSPATIAL 2022 1intro 语言模型POI客流量预测 2 方法 3 实验

Midjourney如何利用quality控制图片质量,让细节更丰富

hello 小伙伴们&#xff0c;我是你们的老朋友——树下&#xff0c;今天分享Midjourney提示词常用参数——quality&#xff0c;通过更给quality的值可以生成质量更好的图片&#xff0c;让细节更丰富&#xff0c;那么这个参数是怎么用的呢&#xff1f;话不多说&#xff0c;直接开…

2014NOIP普及组真题 3. 螺旋矩阵

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1967 背景知识&#xff1a; 螺旋矩阵可以采用模拟的方式生成。就是顺时针四个方向 第1步、是第 1 行&#xff0c;方向为从左到右&#xff0c;数值1。当向右遇到 边界n 或者 格子已填过数…

基于卷积神经网络的手写数字识别

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

海外短剧:跨文化的新浪潮与看剧系统的搭建,海外短剧系统搭建开发定制

在全球化的大潮下&#xff0c;海外短剧作为一种新兴的文化交流方式&#xff0c;正逐渐受到越来越多人的喜爱。这种融合了各地文化元素、叙事手法新颖独特的短剧形式&#xff0c;不仅丰富了观众的视觉体验&#xff0c;也为影视媒体和想拓展海外市场的企业带来了无限商机。 一、…

MMSeg分析Flops和Params

Flops计算量&#xff0c;params参数量 在文件中 tools/analysis_tools/get_flops.py利用以下命令实现 python tools/analysis_tools/get_flops.py configs/xxx/xxx-Net.py后面可跟参数shape控制输入图片尺寸&#xff0c;例如 python tools/analysis_tools/get_flops.py conf…

Python Django框架的内容管理系统库之wagtail使用详解

概要 Python Wagtail库是一个基于Django框架的内容管理系统(CMS),它提供了丰富的功能和工具,帮助开发者快速构建灵活、强大的网站和应用。本文将介绍如何安装和使用Python Wagtail库,以及它的特性、基本功能、高级功能、实际应用场景和总结部分。 安装 首先,需要安装Py…

uni-app HBuilderX通过easycom省略import自动导入自定义组件

快速尝试 自HBuilderX 2.5.5起支持easycom组件模式。更新HBuilderX即可尝试。 easycom默认已启用&#xff0c;并对项目下的components和uni_modules目录开启自动扫描&#xff0c;对符合下面路径和命名规则的组件自动导入。 components/组件名/组件名.vue uni_modules/组件名/…

Go并发安全,锁和原子操作

一. 并发安全 有时候在Go代码中可能存在多个goroutine同时操作一个资源(临界区)&#xff0c;这种情况会发生竞态问题(数据竞态)。 1.1 互斥锁 互斥锁是一种常见的控制共享资源访问的方法&#xff0c;它能够保证同时只有一个goroutine可以访问共享资源。Go语言中使用sync包的Mut…