一、概述

k8s暴露服务的方式有很多使用ingress、nodeport等,这类比较适用于无状态的服务,对于statefulset部署的有状态的服务,(关于statefulset的介绍参考kubernetes的官网或参考我的https://www.cnblogs.com/cuishuai/p/10243291.html),由于statefulset使用的是headless service。是固定网络标示的,也就是服务的完整域名是不会改变的。但是有两个问题:

1、物理机在k8s集群的外面没办法解析k8s集群内部的域名

2、解析域名后网络不能通信

二、物理网络与k8s集群打通

有了上面提出的两个问题,我们先来简单分析一下k8s的网络,我们使用的是calico-bgp+ipvs,所以这里就以calico为例,calico为k8s提供了一个网络空间,提供的地址池和k8s初始化时指定的pod-cidr是相同的。部署服务的时候会在地址池里面为pod分配地址,比如设置的是192.168.0.0/16,首先是分配node节点,一般情况下calico会先给node节点随机分配一个网段,例如有个节点是node1 ,calico会分配一个192.168.19.0网段,具体的子网掩码(netmask)要看路由表在任意节点上执行(route -n)查看。

查看具体的分配,部署calico的时候选择的是将数据存储到etcd集群,所以也可以去etcd里面产看:

  1. # etcdctl get --prefix "/calico" --keys-only | grep "ipam/v2/host"
  2.  
  3. /calico/ipam/v2/host/ku13-/ipv4/block/192.244.190.128-
  4. /calico/ipam/v2/host/ku13-/ipv4/block/192.244.190.192-
  5. /calico/ipam/v2/host/ku13-/ipv4/block/192.244.32.0-
  6. /calico/ipam/v2/host/ku13-/ipv4/block/192.244.32.64-
  7. /calico/ipam/v2/host/ku13-/ipv4/block/192.244.6.192-
  8. /calico/ipam/v2/host/ku13-/ipv4/block/192.244.7.0-
  9. /calico/ipam/v2/host/ku13-/ipv4/block/192.244.7.64-
  10. /calico/ipam/v2/host/ku13-/ipv4/block/192.244.70.0-

还有一个服务kube-proxy,这个服务负责node之间的网络通信,刷新ipvs列表。具体的calico和kube-proxy工作详情这里不做详解。

我们了解到要想解决我们上面提出的两个问题,我们需要将kubernets里面的coredns服务拿出来,为物理机提供dns解析、然后需要将物理机与k8s集群网络打通。接下来我们解决这两个问题:

解决第一个问题也需要以第二个问题为前提,所以我们只需要解决了第二个问题,第一个问题只需要在物理机上面的/etc/resolv.conf添加一条nameserver记录。

解决第二个问题:网络打通

打通网络我们需要两个工具:calico、kube-proxy

我们之前的集群都是使用kubeadm部署的,所以我们可以很简单实现这两个服务的部署,如果不是使用kubeadm部署的集群可以参考网上这个服务的部署,本文不做介绍。主要介绍kubeadm部署的实现。

我们准备一个服务器,上面需要部署kubeadm、docker具体的准备参考之前的集群初始化,我们将新服务器以node节点的形式加入到集群里面,使用kubeadm join很方便的将服务器加入到现有的k8s集群里面,这个服务器只需要分配很小的资源,因为这个上面不会部署任何服务,只有kubeadm join时部署的calico-node、kube-proxy。

添加节点参考:https://www.cnblogs.com/cuishuai/p/9897006.html

节点成功加入集群后还要执行一个操作,就是设置节点不能被调度:

  1. kubctl drain [node-name] --ignore-daemonsets

这样我们新加入的这个节点上面只部署了calico-node、kube-proxy,并且该服务器节点是能和k8s集群通信的,我们把该节点作为k8s网络与物理网络的gateway,所有物理服务器进入k8s集群网络的路由都经过这个gateway。这样就实现了通讯。

2、生成路由规则

在上面新部署的服务器上面有到k8s集群的所有路由,我们将这些路由进行提取生成一个路由表给物理机使用,将所有路由设置成默认路由,都经过上面新加服务器的ip。

为了方便使用我写了一个生成脚本,此脚本在gateway节点即上面新加的节点上面执行:

#cat generate-rule

  1. #!/bin/bash
  2.  
  3. route -n | grep UG | grep -v ^ | awk '{print $1,$3}' >a.txt
  4.  
  5. ip=`ip a | grep eth0 | grep inet |awk -F '/' '{print $1}'|awk '{print $2}'`
  6.  
  7. service_net="192.96.0.0"
    service_mask="255.255.0.0"
  8.  
  9. #判断route.rule文件是否存在
  10. if [ -f route.rule ];then
  11. >route.rule
  12. fi
  1. #生成route.rule文件
  1. #添加coredns的路由
    echo "route add -net $service_net netmask $service_mask gw $ip" >route.rule
  2. while read NT MK
  3. do
  4. echo "route add -net $NT netmask $MK gw $ip " >>route.rule
  5. done < a.txt
  6.  
  7. #删除临时文件
  8. rm -rf a.txt

service_net是k8s service的网段,即coredns的service ip所在的网段,service_mask是k8s service的子网掩码,这个在使用kubeadm初始化的时候就指定了,我们使用的是:

https://www.cnblogs.com/cuishuai/p/9897006.html

  1. podSubnet: 192.244.0.0/
  2.  
  3. serviceSubnet: 192.96.0.0/

将service_net、service_mask换成自己的。

然后将生成的文件copy到物理机上,然后执行:

  1. sh route.rule

在物理机上面在/etc/resolv.conf里面添加coredns的service的ip,service名称是kube-dns,在任意master节点上查看:

  1. kubectl get svc -n kube-system | grep kube-dns
  1. kube-dns ClusterIP 192.96.0.10 <none> /UDP,/TCP 7d8h

将找到的ip地址添加到/etc/resolv.conf:

nameserver 192.96.0.10

在物理机上面测试连通性:

k8s与云服务器之间服务互访之节点网络打通的更多相关文章

  1. 配置云服务器 FTP 服务

    自己配置的环境: OS: 阿里云 CentOS 6.5 >>Begin: 1. 登录到阿里云服务器(如何登录阿里云服务器), 在root权限下, 通过如下命令安装 vsftp [root@ ...

  2. 实现linux服务器之间无密码互访

    最近老是在群里看到许多同学问,linux之间无密码互访怎么弄啊,百度的看得我头晕之类的,所以我就写写怎么样在两台linux服务器之间实现无密码互访,也就是让它们互相信任的意思,废话不多说,直接上菜. ...

  3. 云服务器、虚拟主机和VPS的区别

    虚拟主机就是利用网络空间技术,把一台服务器分成许多的"虚拟"的主机,每一台网络空间都具有独立的域名和IP地址,具有完整的Internet服务器功能.网络空间之间完全独立,在外界看来 ...

  4. 简单操作:10分钟实现在kubernetes(k8s)里面部署服务器集群并访问项目(docker三)

    前言 经过docker安装.k8s开启并登录,我们终于到 "部署k8s服务器集群并访问项目" 这一步了,实现的过程中有太多坑,好在都填平了,普天同庆. 在进行当前课题之前,我们需要 ...

  5. 不同云服务器下,ubuntu下开k3s集群

    首先先感谢老哥的文章:h构建多云环境下的K3S集群,但是我尝试在centos 8.2上面前面一直执行报错 并且安装glibc 2.17时还会报错make版本太低,所以直接放弃centos,投入ubun ...

  6. 云服务器、vps、虚拟主机的区别

    云服务器 Elastic Compute Service, 简称ECS 好多人理解云服务器和VPS一样,更有甚者说以前的VPS现在的说法就是云服务器,其实不然,云服务器是一个计算,网络,存储的组合.简 ...

  7. 云服务器linux系统修改时间和时区

    申请的云服务器时间不对,用同步网络时间的命令执行后依然有问题. 解决办法: # tzselect [root@ylyuat2-web02 logs]# TZ='Asia/Shanghai'[root@ ...

  8. 阿里云服务器 centos7 中继邮箱+转发服务 详细配置

    阿里云centos7 邮箱转发服务配置 一.文档编写目的: 网络拓扑图: 阿里云服务器屏蔽掉25端口后,内网服务器如何通过跳板机发送邮件到外网邮箱. 如果是可联网的阿里云机器,可以直接配置mailx使 ...

  9. 云服务器、VPS、虚拟主机三者之间的区别?

    更多精彩内容欢迎访问我的个人博客皮皮家园:https://www.zh66.club期待您的光临哦!我是皮皮猪,感谢各位光临,能为您排忧解难小站深感荣幸!祝您生活愉快! 什么是虚拟主机? 同云主机不一 ...

随机推荐

  1. win10 64位 安装scrapy

    在学习python时,不可避免下载了Anaconda,当我打算写爬虫时,urllib,requests,selenium,pyspider都已经安装好了,可以直接使用了,但是有一天我想要使用scrap ...

  2. 利用AnyProxy代理监控APP流量

    1.介绍 AnyProxy 是阿里巴巴基于 Node.js 开发的一款开源代理服务器. 代理服务器站在客户端和服务端的中间,它可以收集双方通信的每个比特.一个完整的代理请求过程为:客户端首先与代理服务 ...

  3. xml文档格式学习笔记

    xml入门经典 (pdf书籍) https://www.cnblogs.com/zhaopengcheng/p/6848802.html

  4. CentOS6.8常用服务

    service    level0      level1      level2      level3      level4      level5      level6      功能    ...

  5. mycat 主从切换分析过程

    67 68互为主从 66为67从 区分双主写的数据,设置不同的自增id 67: SET @@auto_increment_offset=2;SET @@auto_increment_increment ...

  6. weblogic获取应用目录路径(war包)

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...

  7. im4java+GraphicsMagick 的问题

    1.convert.exe: non-conforming drawing primitive definition `' @ error/draw.c/RenderMVGContent/3901. ...

  8. jquery,html5,css3主要特性总结

    jquery特性: 1.丰富简单的DOM选择器 2.同一函数实现get和set 3.支持链式方法书写 4.完善的事件处理功能 5.强大的css动画效果 6.完善的Ajax 7.简单的元素样式操作 8. ...

  9. 关于IO的整理

    我们知道io只是输入输出,在java语言中分为同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO,现在的IO,一般是用作两种用途:一种是进行文件或者目录的操作(将不同的输入输出源抽象成流,所以流 ...

  10. 使用Spring+MySql实现读写分离(一)关于windows下安装mysql5.6

    前面讲过关于mysql的优化,主要是建表时对于大量数据的表添加索引机制,提高查询效率,以及一些sql语句的简单优化,毕竟我也不是专业的数据库管理员,大牛勿喷. 今天写两章关于javaweb项目中,对于 ...