使用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的网络插件,我们下面也将说明如何配置关闭掉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
相关实践学习
使用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
目录
相关文章
|
6月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
549 1
|
6月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
366 89
|
11月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
717 9
|
11月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
7月前
|
存储 Kubernetes 网络安全
关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
759 2
|
9月前
|
运维 Kubernetes 持续交付
ACK One GitOps:让全球化游戏服务持续交付更简单
ACK One GitOps 致力于提供开箱即用的多集群 GitOps 持续交付能力,简化游戏等服务的多集群/多地域统一部署,让您更加专注于业务开发。
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
1089 33
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
681 19
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
存储 人工智能 Kubernetes
ACK Gateway with AI Extension:面向Kubernetes大模型推理的智能路由实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with AI Extension组件,在Kubernetes环境中为大语言模型(LLM)推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。

相关产品

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

    更多