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

ops/2024/12/5 4:57:23/

前言

我们在内网使用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-eth0labels:kubernetes-host: ingress
spec:interfaceName: eth0node: node1expectedIPs:- 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-enp0s8labels:kubernetes-host: ingress
spec:interfaceName: enp0s8node: localhost.localdomainexpectedIPs:- 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: DisabledhealthPort: 9099logSeverityScreen: InforeportingInterval: 0sfailsafeInboundHostPorts:- port: 22protocol: tcp

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

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

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

开放指定端口

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:name: allow-external-port-ingress
spec:order: 10preDNAT: trueapplyOnForward: trueingress:# 放通目标是指定端口的所有请求  当然也可以增加source字段指定来源ip/ip段- action: Allowdestination:# 配置方法可以参考  https://docs.tigera.io/calico/latest/reference/resources/networkpolicy#entityruleports:- 3306- 30030selector: 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就可以了


http://www.ppmy.cn/ops/12709.html

相关文章

Oracle使用内部包自定义创建表空间和用户

如果之前有类似的表空间,可以使用dbms自动生成对应的表空间和数据文件 select dbms_metadata.get_ddl(TABLESPACE,ts.tablespace_name) from dba_tablespaces ts; 可以使用类似的 SQL> set echo off SQL> spool /data/logs/create_tablespace.log SQL> select dbms…

使用微信开发者工具模拟微信小程序定位

哈喽&#xff0c;各位同僚们&#xff0c;我们平时在测试微信小程序的时候&#xff0c;如果小程序中有获取定位或者地图的功能&#xff0c;测试场景中常常需要去模拟不同的位置&#xff0c;例如我们模拟在电子围栏的外面、里面和边界区域等。那么&#xff0c;我们如何在模拟微信…

【C语言__指针01__复习篇11】

目录 前言 一、什么是指针 二、计算机中常见的单位 三、CPU是怎样找到一块内存空间的 四、如何得到变量的地址 五、指针变量 六、解引用指针变量的作用 七、指针变量的大小 八、指针变量类型的意义 8.1 指针的解引用 8.2 指针-整数 九、void*指针 十、const修饰变…

wx小程序-button的bindtap事件

一、button标签 由于小程序语法中&#xff0c;处理函数不能带参数&#xff0c;所以不能实现直接调用要修改的数据。所以除了用bindtap&#xff08;提示&#xff1a;bindtap和bind:tap两种语法都是正确的&#xff09;绑定处理函数&#xff0c;还需要在button属性中添加一个data…

Node.js--npm常用指令及其详解

npm&#xff08;Node Package Manager&#xff09;是Node.js的包管理器&#xff0c;它允许你安装、更新、卸载和管理Node.js应用程序的依赖项。以下是npm的一些常用指令及其详解&#xff1a; 1. npm install 功能&#xff1a;安装项目依赖的模块。 用法&#xff1a;npm in…

离散数学之命题逻辑思维导图+大纲笔记(预习、期末复习,考研,)

大纲笔记&#xff1a; 命题逻辑的基本概念 命题与联结词 命题 命题是推理的基本单位 真命题&#xff0c;假命题 特征 陈述句 唯一的真值 是非真即假的陈述句 非命题 疑问句 祈使句 可真可假 悖论 模糊性 三个基本概念 复合命题 真值取决于原子命题的值和逻辑联结词 原子命题 逻…

【PCL】教程conditional_euclidean_clustering 对输入的点云数据进行条件欧式聚类分析...

[done, 3349.09 ms : 19553780 points] Available dimensions: x y z intensity 源点云 Statues_4.pcd 不同条件函数output.pcd 【按5切换到强度通道可视化】 终端输出&#xff1a; Loading... >> Done: 1200.46 ms, 19553780 points Downsampling... >> Done: 411…

WIFISKY 7层流控路由器 confirm.php RCE漏洞复现

0x01 产品简介 WIFISKY-7层流控路由器是一款可用于家庭或办公环境的无线路由器,具备流控功能以优化网络流量和提供更稳定的网络连接。该路由器采用了7层流控技术,能够依据网络数据包的内容进行智能管理,从而实现对网络流量的精细化控制和优化。这种技术可以提升网络的整体性…