• 阿里云跨地域访问私网


    问题背景

    使用华北地域的两台ECS服务器搭建了k8s1.11集群,可参考:阿里云ECS搭建kubernetes1.11
    
    
    角色 主机名 私网 公网 公网类型
    master node1.com  172.31.2.130 120.27.2.2 固定公网
    node node2.com  172.31.2.131 120.27.2.3 固定公网
    原k8s集群节点之间使用私网通信,节点本地hosts解析如下。
    node1.com 172.31.2.130
    node2.com 172.31.2.131
    现华东地区有一新的ECS实例,主机名为harbor(因为这个节点装了harbor),希望加入上述集群,新节点信息如下表格
    备注:
    
    node1.com和node2.com之间私网通,node1.com、node2.com的私网与harbor节点私网不通。三个节点公网可正常通信。上述ip非真实ip
    角色 主机名 私网 公网 公网类型
    node harbor 10.1.75.3 47.110.11.34 弹性公网

     

    使用kubeadm加入节点

    
    
    #参考上一篇集群安装方法添加计算节点:阿里云ECS搭建kubernetes1.11

    #在harbor节点配置node1.com的解析为node1的公网ip
    echo "120.27.2.2 node1.com" >> /etc/hosts

    #获取加入集群需要使用的hash值 openssl x509
    -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' #获取加入集群需要使用的token值 kubeadm token list #如果上述命令没有token,说明已过期,通过如下命令重新生成 kubeadm token create #使用kubeadm加入集群 kubeadm join node1.com:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

    #报无法从master下载kubelet配置文件,如下

    [kubelet] Downloading configuration for the kubelet from the "kubelet-config-1.11" ConfigMap in the kube-system namespace
    Get https://172.31.2.130:6443/api/v1/namespaces/kube-system/configmaps/kubelet-config-1.11: dial tcp 172.31.2.130:6443: i/o timeout

    #上述报错信息表明,可见新增节点需要与node1.com节点的私网172.31.2.130进行通信(节点的kubelet服务需要定期上报节点状态给master)

    解决思路

    #思路一:node节点中,是哪里指定了与master通信的ip?找到并尝试修改这个ip为公网ip
    #查看/etc/kubernetes/bootstrap-kubelet.conf文件,文件中指定了master的ip地址为私网ip,但是该文件无法直接修改(修改之后执行kubeadm join会立即恢复)

    #思路二:重新安装k8s集群,集群之间节点使用公网通信,方案应该可行,由于需要重新安装集群,暂且不考虑。

    #思路三:新增节点harbor与node1私网虽然不通,但是公网之间是通的,考虑NAT,可以把从harbor节点中发出的目的ip地址为172.31.2.130的数据包在流向网络前进行DNAT转换,既将目的地址转换为node1的公网ip 120.27.2.2即可

    #iptables操作表nat的OUTPUT链,进行DNAT
    iptables -t nat -A OUTPUT -d 172.31.2.130 -p tcp -j DNAT --to-destination 120.27.2.2
    #为什么是在nat表的OUTPUT添加DNAT规则,可参考下表
    #从本地应用发出的数据包所经过的链在表nat的部分只有nat:OUTPUT和nat:POSTROUTING,而DNAT这个动作只允许PREROUTING/OUTPUT
    ip_tables: DNAT target: used from hooks POSTROUTING, but only usable from PREROUTING/OUTPUT


    #在harbor节点测试node1私网端口6443是否通
    telnet 172.31.2.130 6443

    #通过上述kubeadn join方法重新加入节点成功

    #查看pod状态,发现部署在harbor节点的Kube-flannel容器不断失败重启,如下

    #在node1通过kubectl logs查看CrashLoopBackOff的flannel容器,报连接10.1.75.3:10250 timeout(10.1.75.3为harbor节点的私网,10250为kubelet服务监听的端口)

    #参考上述DNAT,node1节点通过kubectl logs来获取harbor节点上跑的容器kube-flannel-ds-78wtf时需要与harbor节点的kubelet通信以获取日志,由于连接使用harbor私网,同样需要在node1节点做DNAT,如下

    iptables -t nat -A OUTPUT -d 10.1.75.3 -p tcp -j DNAT --to-destination 47.110.11.34

    #在node1添加完上述iptables规则后,通过kubectl logs查看pod日志如下:harbor节点的flannel容器连接api-server超时(10.96.0.1为kube-apiserver的cluster ip)

    #由于kube-flannel pod不ready,所以调度到harbor节点的pod一直处于ContainerCreating状态,通过describe pod,报network cni plugin not found

    #

    遗留问题:pod ip不通;cluster ip不通

  • 相关阅读:
    c#基于业务对象的筛选
    SQLServer索引调优实践
    C#中抽象类和接口的区别
    c#基础(2) 理解委托和事件
    建议学习jQuery的步骤!
    SQL SERVER存储过程调用存储过程并接收输出参数或返回值的方法
    ASP.NET基于JQUERY的高性能的TreeView
    GetManifestResourceStream得到的Stream是null的解决
    Using GDI+ on Windows Mobile 初体验
    提供一个Windows mobile Native UI 程序,循序渐进开发,并附有代码!
  • 原文地址:https://www.cnblogs.com/orchidzjl/p/10879912.html
Copyright © 2020-2023  润新知