使用ip-masq-agent灵活的控制容器服务Kubernetes集群的SNAT规则

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 在容器服务的集群中,默认情况下的flannel会对POD访问到非POD的网段做SNAT,以确保POD到集群外部的资源访问,但在某些情况下,比如在容器服务的VPC集群中,POD到集群外部的资源是直接可以访问的,这时我们就可以自己定义节点上的SNAT规则,而达到直接用容器IP访问VPC内其他服务。

使用ip-masq-agent灵活的控制容器服务Kubernetes集群的SNAT规则

在容器服务的集群中,默认情况下的flannel会对POD访问到非POD的网段做SNAT,以确保POD到集群外部的资源访问,但在某些情况下,比如在容器服务的VPC集群中,POD到集群外部的资源是直接可以访问的,这时我们就可以自己定义节点上的SNAT规则,而达到直接用容器IP访问VPC内其他服务。

安装配置ip-masq-agent组件

我们使用kubernetes 官方项目中的 ip-masq-agent 组件来实现对某些网段不做SNAT的需求,部署方式如下:

curl -L -O http://acs-public.oss-cn-hangzhou.aliyuncs.com/kubernetes/network/ip-masq-agent.yaml # 下载ip-masq-agent的配置文件
vim ip-masq-agent.yaml # 修改其中的nonMasqueradeCIDRs的配置增加或者删除不需要做SNAT的网段,并保存
kubectl apply -f ip-masq-agent.yaml # 使配置生效

然后我们使用如下命令判断ip-masq-agent都已正常运行:

# kubectl get pod -n kube-system -o wide | grep ip-masq-agent
ip-masq-agent-557qt                                          1/1       Running   0          30m
ip-masq-agent-dtzds                                          1/1       Running   0          30m
ip-masq-agent-f6kb6                                          1/1       Running   0          30m
ip-masq-agent-qmkgl                                          1/1       Running   0          30m
ip-masq-agent-rtkv8                                          1/1       Running   0          30m

关闭掉既有的SNAT规则

在配置好ip-masq-agent组件后,还是没有起到作用的,因为默认情况下容器服务使用flannel的网络插件,我们下面也将说明如何配置关闭掉flannelSNAT的功能:

  1. 1. 修改CNI的配置:

    kubectl edit configmap kube-flannel-cfg -n kube-system

    打开修改编辑器后,修改其中的cni-config.json的内容,在其中添加两处"ipMasq: false"的配置,修改如下:

      cni-conf.json: |
        {
          "name": "cb0",
          "type": "flannel",
          "ipMasq": false,
          "delegate": {
            "ipMasq": false,
            "isDefaultGateway": true
          }
        }

    然后保存修改退出编辑器。

  2. 2. 修改flannel daemonset的配置:

    # kubectl edit ds kube-flannel-ds -n kube-system

    打开修改编辑器后,修改flannel daemonset中kube-flannel容器的配置中的command,删除掉其中的--ip-masq,然后保存,修改后如下:

          containers:
          - command:
            - /opt/bin/flanneld
            - --kube-subnet-mgr  

    然后保存修改退出编辑器。

  3. 3. 使修改生效:

    因为kubernetes的daemonset配置后不会自动重新创建,需要手动重新创建flannel的pod,通过kubectl手动删除掉每个节点上的flannel-ds的pod使其重新创建:

    # kubectl get pod -o wide -n kube-system | grep kube-flannel-ds
    kube-flannel-ds-5tbjt                                        2/2       Running   4          6d        192.168.193.159   cn-hangzhou.i-bp1e5terjg0bgppqy6j3
    kube-flannel-ds-6mgjm                                        2/2       Running   13         6d        192.168.193.156   cn-hangzhou.i-bp1im9citpwp20zebrcr
    kube-flannel-ds-df9l9                                        2/2       Running   9          6d        192.168.193.155   cn-hangzhou.i-bp1j1j7011icxiaz0miu
    kube-flannel-ds-qdjhz                                        2/2       Running   6          6d        192.168.193.158   cn-hangzhou.i-bp1e5terjg0bgppqy6j4
    kube-flannel-ds-xdkpv                                        2/2       Running   20         6d        192.168.193.157   cn-hangzhou.i-bp1d7nsqol0apr1thvb7
    # kubectl get pod -o wide -n kube-system | grep kube-flannel-ds  | awk '{print $1}'  |xargs kubectl delete -n kube-system pod
    pod "kube-flannel-ds-5tbjt" deleted
    pod "kube-flannel-ds-6mgjm" deleted
    pod "kube-flannel-ds-df9l9" deleted
    pod "kube-flannel-ds-qdjhz" deleted
    pod "kube-flannel-ds-xdkpv" deleted
    # kubectl get pod -o wide -n kube-system | grep kube-flannel-ds # 等待kube-flannel-ds重建完成
    kubectl get pod -o wide -n kube-system | grep kube-flannel-ds
    kube-flannel-ds-c2pvx                                        2/2       Running   0          40s       192.168.193.156   cn-hangzhou.i-bp1im9citpwp20zebrcr
    kube-flannel-ds-htkmt                                        2/2       Running   0          30s       192.168.193.157   cn-hangzhou.i-bp1d7nsqol0apr1thvb7
    kube-flannel-ds-k6pfq                                        2/2       Running   0          20s       192.168.193.155   cn-hangzhou.i-bp1j1j7011icxiaz0miu
    kube-flannel-ds-p6tzx                                        2/2       Running   0          36s       192.168.193.158   cn-hangzhou.i-bp1e5terjg0bgppqy6j4
    kube-flannel-ds-sz5zg                                        2/2       Running   0          8s        192.168.193.159   cn-hangzhou.i-bp1e5terjg0bgppqy6j3

    这样flannel就被配置为了不会创建SNAT的规则了。

  4. 4. 到每个节点上清理之前flannel创建的SNAT的规则:

    # iptables -t nat --line-numbers -vnL POSTROUTING # 查看flannel创建的SNAT规则
    Chain POSTROUTING (policy ACCEPT 4 packets, 240 bytes)
    num   pkts bytes target     prot opt in     out     source               destination
    1      14M  814M KUBE-POSTROUTING  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* kubernetes postrouting rules */
    2        0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0
    3    5468K  328M RETURN     all  --  *      *       172.16.0.0/16        172.16.0.0/16
    4      209 12540 MASQUERADE  all  --  *      *       172.16.0.0/16       !224.0.0.0/4
    5        0     0 RETURN     all  --  *      *      !172.16.0.0/16        172.16.2.0/24
    6    4364K  262M MASQUERADE  all  --  *      *      !172.16.0.0/16        172.16.0.0/16
    7      481 29926 IP-MASQ-AGENT  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* ip-masq-agent: ensure nat POSTROUTING directs all non-LOCAL destination traffic to our custom IP-MASQ-AGENT chain */ ADDRTYPE match dst-type !LOCAL

    在上面这个命令中可以看到我们部署的ip-masq-agent的规则已经加到最后了,然后我们需要移除掉flannel添加的集群网段的4条规则,我们这个集群中的集群POD网段是172.16.0.0/16,这个需要根据您的集群选择的网段进行判断,所以我们这个集群中的flannel添加的规则是序号3~6这4条。

    在机器重启时会重新生成iptables,我们可以重启下需要生效的节点,就会清理掉之前的iptables了,如果不希望影响运行中的服务,也可以通过iptables命令手动删除掉这4条多余的iptables规则:

    # iptables -t nat -D POSTROUTING 6
    # iptables -t nat -D POSTROUTING 5
    # iptables -t nat -D POSTROUTING 4
    # iptables -t nat -D POSTROUTING 3

大工告成,验证配置

通过kubectl run启动一个测试容器,并指定我们修改好的一个节点:

# kubectl run -it --rm --image registry.aliyuncs.com/wangbs/netdia --overrides='{ "apiVersion": "extensions/v1beta1", "spec": { "nodeName": "cn-hangzhou.i-bp1e5terjg0bgppqy6j4"}}' test
/ # ping 192.168.200.253
    

然后通过抓包查看POD ping的包就不会再做SNAT了:

# tcpdump -i eth0 -nn -vv host 192.168.200.253
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
18:54:54.430700 IP (tos 0x0, ttl 63, id 33571, offset 0, flags [DF], proto ICMP (1), length 84)
    172.16.4.11 > 192.168.200.253: ICMP echo request, id 4096, seq 10, length 64
18:54:55.430828 IP (tos 0x0, ttl 63, id 33740, offset 0, flags [DF], proto ICMP (1), length 84)
    172.16.4.11 > 192.168.200.253: ICMP echo request, id 4096, seq 11, length 64
18:54:56.430947 IP (tos 0x0, ttl 63, id 33890, offset 0, flags [DF], proto ICMP (1), length 84)
    172.16.4.11 > 192.168.200.253: ICMP echo request, id 4096, seq 12, length 64
相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
16天前
|
存储 运维 Kubernetes
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
飞轮科技推出了 Doris 的 Kubernetes Operator 开源项目(简称:Doris Operator),并捐赠给 Apache 基金会。该工具集成了原生 Kubernetes 资源的复杂管理能力,并融合了 Doris 组件间的分布式协同、用户集群形态的按需定制等经验,为用户提供了一个更简洁、高效、易用的容器化部署方案。
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
|
11天前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
|
16天前
|
存储 监控 对象存储
ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。
|
24天前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
23天前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
97 11
|
2月前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
116 12
|
2月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
29天前
|
人工智能 运维 监控
容器服务Kubernetes场景下可观测体系生产级最佳实践
阿里云容器服务团队在2024年继续蝉联Gartner亚洲唯一全球领导者象限,其可观测体系是运维的核心能力之一。该体系涵盖重保运维、大规模集群稳定性、业务异常诊断等场景,特别是在AI和GPU场景下提供了全面的观测解决方案。通过Tracing、Metric和Log等技术,阿里云增强了对容器网络、存储及多集群架构的监控能力,帮助客户实现高效运维和成本优化。未来,结合AI助手,将进一步提升问题定位和解决效率,缩短MTTR,助力构建智能运维体系。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
Gemini 2.0:谷歌推出的原生多模态输入输出 + Agent 为核心的 AI 模型
谷歌最新推出的Gemini 2.0是一款原生多模态输入输出的AI模型,以Agent技术为核心,支持多种数据类型的输入与输出,具备强大的性能和多语言音频输出能力。本文将详细介绍Gemini 2.0的主要功能、技术原理及其在多个领域的应用场景。
306 20
Gemini 2.0:谷歌推出的原生多模态输入输出 + Agent 为核心的 AI 模型
|
2月前
|
人工智能 API 语音技术
TEN Agent:开源的实时多模态 AI 代理框架,支持语音、文本和图像的实时通信交互
TEN Agent 是一个开源的实时多模态 AI 代理框架,集成了 OpenAI Realtime API 和 RTC 技术,支持语音、文本和图像的多模态交互,具备实时通信、模块化设计和多语言支持等功能,适用于智能客服、实时语音助手等多种场景。
201 15
TEN Agent:开源的实时多模态 AI 代理框架,支持语音、文本和图像的实时通信交互

相关产品

  • 容器计算服务
  • 容器服务Kubernetes版