zoukankan      html  css  js  c++  java
  • 办公环境下k8s网络互通方案

    在 kubernetes 的网络模型中,基于官方默认的 CNI 网络插件 Flannel,这种 Overlay Network(覆盖网络)可以轻松的实现 pod 间网络的互通。当我们把基于 spring cloud 的微服务迁移到 k8s 中后,无须任何改动,微服务 pod 可以通过 Eureka 注册后可以互相轻松访问。

    但是实际使用中,我们出现了以下需求:

    • 1.办公室网络 和 k8s pod 网络不通。开发在电脑完成某个微服务模块开发后,希望本地启动后,能注册到 k8s 中开发环境的服务中心进行调试,而不是本地起一堆依赖的服务。
    • 2.办公室网络 和 k8s svc 网络不通。在 k8s 中运行的 mysql、redis 等,无法通过 ingress 7层暴露,电脑无法通过客户端工具直接访问;如果我们通过 service 的 NodePort 模式,会导致维护量工作量巨大。

    网络互通配置

    k8s 集群中新加一台配置不高(2核3G)的 node 节点(node-3)专门做路由转发,连接办公室网络和 k8s 集群 pod、svc

    • node-3 IP 地址 10.129.83.159
    • 内网DNS IP 地址 10.129.83.159
    • pod网段 172.20.0.0/16,svc网段 10.68.0.0/16
    • 办公网段 10.129.0.0/24

    给 node-3节点打上污点标签(taints),不让 k8s 调度 pod 来占用资源:

    kubectl taint nodes node-3 forward=node-3:NoSchedule

    node-3节点,做snat:

    # 开启转发
    # vim /etc/sysctl.d/k8s.conf
    net.ipv4.ip_forward = 1
    # sysctl -p
    
    # 来自办公室访问pod、service snat
    iptables -t nat -A POSTROUTING -s 10.129.0.0/24 -d 172.20.0.0/16 -j MASQUERADE
    iptables -t nat -A POSTROUTING -s 10.129.0.0/24 -d 10.68.0.0/16 -j  MASQUERADE

    在办公室的出口路由器上,设置静态路由,将 k8s pod 和 service 的网段,路由到 node-3节点上

    ip route 172.20.0.0 255.255.0.0 10.129.83.159
    ip route 10.68.0.0  255.255.0.0 10.129.83.159
     

    DNS 解析配置

    以上步骤操作后,我们就可以在本地电脑通过访问 pod ip 和 service ip 去访问服务。但是在 k8s 中,由于 pod ip 随时都可能在变化,service ip 也不是开发、测试能轻松获取到的。我们希望内网 DNS 在解析 *.cluster.local,去coreDNS寻找解析结果。

    这里也可以测试一下,podip是可以通的,但是svc不行,因为svc的ip是虚拟ip。

    例如,我们约定将(项目A 、开发环境一 、数据库mysql)部署到 ProjectA-dev1 这个 namespace 下,由于本地到 k8s 集群 service 网络已经打通,我们在本地电脑使用 mysql 客户端连接时,只需要填写mysql.ProjectA-dev1.svc.cluster.local即可,DNS 查询请求到了内网DNS后,走向 CoreDNS,从而解析出 service ip。

    由于内网 DNS 在解析 *.cluster.local,需要访问 CoreDNS 寻找解析结果。这就需要保证网络可达

    最简单的做法,我们把内网DNS部署在node-3这台节点上,那么他肯定访问到kube-dns 10.68.0.2

    # kubectl  get svc  -n kube-system |grep kube-dns

    kube-dns               ClusterIP   10.68.0.2       <none>        53/UDP,53/TCP,9153/TCP   7h1m

    因为当前环境中内网dns就部署在node-3这台机器上,所以直接配置即可。

    首先部署内网dns(有dns的略过)

     本环境以centos7为例,安装轻量级的dns服务dnsmasq

    #yum install -y dnsmasq

    #vim /etc/resolv.conf #这个DNS指定本地服务器ip

    # Generated by NetworkManager
    nameserver 10.129.83.159

    #vim /etc/dnsmasq.conf

    resolv-file=/etc/resolv.dnsmasq.conf  #上游DNS路径,这里面配置电信、谷歌等公有dns。
    strict-order #取消strict-order注释
    addn-hosts=/etc/dnsmasq.hosts #可以配置所有服务器的主机地址和对应的主机名
    listen-address=127.0.0.1,10.129.83.159 #监听地址,改成自己服务器IP
    server=/cluster.local/10.68.0.2 #指定以cluster.local为后缀的域名,使用coredns的地址解析。

    #systemctl start dnsmasq  #启动服务

     可以看到已经启动成功。

    #systemctl enable dnsmasq #开机自动启动

    注意:其他服务器或者本地windows要使用这个dns,就把dns配置为此服务器的地址。

    测试





  • 相关阅读:
    C#SortedList排序列表怎么样逆序输出
    使 SortList 实现重复键排序
    【转】delphi程序只允许运行一个实例的三种方法:
    Delphi中控制Excel(转载)
    spring和hibernate的集成
    使用Jedis操作redis
    使用java发送邮件
    error at ::0 can't find referenced pointcut...解决方法
    log4j简单的使用
    spring学习笔记三:Component注解(把POJO类实例化到spring的IOC容器中)
  • 原文地址:https://www.cnblogs.com/xiaobao2/p/11461345.html
Copyright © 2011-2022 走看看