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

简介: 在容器服务的集群中,默认情况下的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的网络插件,我们下面也将说明如何配置关闭掉flannel的SNAT的功能:

  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
相关实践学习
使用ACS算力快速搭建生成式会话应用
阿里云容器计算服务 ACS(Container Compute Service)以Kubernetes为使用界面,采用Serverless形态提供弹性的算力资源,使您轻松高效运行容器应用。本文将指导您如何通过ACS控制台及ACS集群证书在ACS集群中快速部署并公开一个容器化生成式AI会话应用,并监控应用的运行情况。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1487 108
|
Kubernetes Devops Docker
Kubernetes 和 Docker Swarm:现代 DevOps 的理想容器编排工具
本指南深入解析 Kubernetes 与 Docker Swarm 两大主流容器编排工具,涵盖安装、架构、网络、监控等核心维度,助您根据团队能力与业务需求精准选型,把握云原生时代的技术主动权。
985 115
|
12月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
1044 6
|
存储 Kubernetes 网络安全
关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
1288 3
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
411 1
|
监控 Cloud Native Java
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
538 0
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。

相关产品

  • 容器计算服务
  • 容器服务Kubernetes版
  • 推荐镜像

    更多