zoukankan      html  css  js  c++  java
  • K8s生产环境下启用防火墙


    简述
    当初在安装K8s集群时,为了安装方便关闭了所有机器的防火墙,但是如果是生产环境,非常不安全,因此有了这篇文章。文章总结了在开启防火墙状态下,需要开放哪些端口,以及需要注意的点。

    准备
    服务器操作系统:Ubuntu 16.04
    防火墙命令:ufw
    集群:

    服务器角色 名称 ip
    etcd etcd1、2、3 192.168.22.104、105、106
    master master1、2 192.168.22.110、111
    load balance lbMaster、lbBackup 192.168.22.102、103
    node node1、2、3、4、5 192.168.22.107、108、109、141、142


    设置
    开放etcd集群所需端口2379(客户端监听)和2380(节点间内部通信)

    ufw allow 2379
    ufw allow 2380
    1
    2
    开放Master节点6443端口,kube-apiserver组件使用,Kubernetes API端口

    ufw allow 6443
    1
    开放Node节点

    开放LB节点8443端口,为VIP(虚拟IP)监听的服务端口,区别于默认的apiserver端口6443

    ufw allow 8443
    1
    开启以上节点后,访问Dashboard进行测试,会出现以下问题:

    Error: 'read tcp 172.20.1.0:56922->172.20.6.74:8443: read: connection timed out'
    Trying to reach: 'https://172.20.6.74:8443/'
    1
    2
    这是因为在安装K8s集群过程中,使用网络组件(这里是flannel)为集群中(Master和Node)的每个Pod虚拟了一个独立的IP。Pod中的所有容器共享同一个IP,通过端口来区分,Pod之间可以相互访问。上面的错误信息表示了各个服务器之间的虚拟IP段无法正常通信。

    查看服务器路由信息

    route -n
    1
    以下为Master1、2的路由信息

    在Master1上,ping不通Master2的虚拟IP段:172.20.1.0,这说明防火墙可能对flannel组件生效有影响,需要了解flannel工作原理才能找到问题所在。

    Flannel实质上是一种“覆盖网络(overlay network)”,将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持UDP、VxLAN、AWS VPC和GCE路由等数据转发方式。

    默认的节点间数据通信方式是UDP转发,源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务,数据到达以后被解包,这意味着它们也是通过真实网络的某个端口进行通信的,我们需要开放Flannel使用的特定端口。

    开启防火墙日志

    ufw logging on
    1
    在Master1上,再次ping Master2的虚拟IP段:172.20.1.0,查看日志内容

    tail -n 10 /var/log/ufw.log
    1
    日志

    Jul 26 20:15:13 master02 kernel: [40620.949660] [UFW BLOCK] IN=ens160
    OUT= MAC=00:50:56:ba:10:58:00:50:56:ba:55:f1:08:00 SRC=192.168.22.110 DST=192.168.22.111
    LEN=134 TOS=0x00 PREC=0x00 TTL=64 ID=13122 PROTO=UDP SPT=57102 DPT=8472 LEN=114
    1
    2
    3
    DPT是数据包的目标端口,Master1向Master2的8472端口发送数据,也就是说我们需要再开放8472端口,注意要在所有Master和Node节点上执行。

    ufw allow 8472
    1
    小结
    经测试,开启以下端口即可:

    服务器角色 端口
    etcd 2379、2380
    Master 6443、8472
    Node 8472
    LB 8443

  • 相关阅读:
    AngularJS定时器任务
    ssh常用
    HTTPClient模块的HttpGet和HttpPost
    eclipse下设置tomcat,修改Java代码不必重启tomcat
    【转】调试Release发布版程序的Crash错误
    C/C++ 函数压栈方式
    PHP 安全三板斧:过滤、验证和转义之转义篇 & Blade模板引擎避免XSS攻击原理探究
    让 MySQL 支持 emoji 存储
    Laravel 5.1 中创建自定义 Artisan 控制台命令实例教程
    常见的Web实时消息交互方式和SignalR
  • 原文地址:https://www.cnblogs.com/agang-php/p/12546592.html
Copyright © 2011-2022 走看看