k8s使用calico网络插件时,Nodeport 仅在指定节点暴露端口+防火墙策略配置方法
我们使用k8s的网络插件是calico时,可以通过calico的扩展功能来完成 Nodeport 仅在指定节点暴露端口以及针对整个k8s集群内节点的防火墙设置。
前言
我们在内网使用k8s时,对外暴露的服务通常是通过Nodport出去的,但是,Nodeport存在下面几个问题:
- Nodeport会在集群所有节点都暴露端口,有时候我们只希望在其中一两台暴露端口
- Nodeport暴露的端口无法通过firewall管理,无法限制端口访问来源,有时会存在安全问题。
k8s默认支持一些网络策略的设置,可以参考 k8s NetworkPolicy 介绍,但是,这些策略仅能对k8s里面的pod,对于Nodeport这种无法设置。
幸运的是,如果我们使用k8s的网络插件是calico,可以通过calico的扩展功能来完成 Nodeport 仅在指定节点暴露端口以及针对整个k8s集群内节点的防火墙设置。
关于集群防火墙设置的基础操作,请参考 k8s使用calico网络插件时,集群内节点防火墙策略配置方法,默认禁用全部访问的操作请参考该文档。
在全部禁用以后,我们可以选择几个心仪的节点开放端口了,下面以开放端口32050为例:
首先选择要开放的节点,编辑之前声明好的HostEndpoint
: kubectl edit HostEndpoint xxx
,编辑里面的labels,打上一个特定的标签,比如 open-node
。(忘记了之前的HostEndpoint叫什么可以先查看: kubectl get HostEndpoint
)
然后新建一个网络策略,优先级设置的比之前创建的拒绝全部访问的策略高(order越小小优先级越高),前面博客中创建的默认order为20,这里可以随便设置一个order小于20的,加入我们要开放32050端口,参考的配置如下:
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: allow-my-service
spec:
# 生效顺序从小到大排序,这里设置的较小,优先生效
order: 10
preDNAT: true
applyOnForward: true
ingress:
# 接受目标端口为32050的所有请求
- action: Allow
destination:
# 配置方法可以参考 https://docs.tigera.io/calico/latest/reference/resources/networkpolicy#entityrule
ports:
- 32050
selector: has(open-node) # 选择器。选择了包含open-node标签的所有HostEndpoint
这里还可以设置只允许指定来源的ip,排除指定来源的ip,排除指定端口,选择指定端口。具体规则设置方法请参考: calico官方文档
更多推荐
所有评论(0)