k8s容器集群工作负载节点跨越多个云计算厂商

打印 上一主题 下一主题

主题 682|帖子 682|积分 2046

1. 背景介绍

  随着亚马逊云、阿里云、华为云、腾讯云等云计算服务厂商越来越安全、稳定,以及价格越来越便宜,越来越多的企业或个人开始尝试或正在利用云计算服务厂商提供的IaaS服务替换自建IDC机房中的底子办法资源。面对各个云计算厂商的营销套路,不少企业不知道选哪家云商的服务比较合适,一怕被绑架,上车容易下车难,第一年免费用,第二年没折扣;二怕今年上阿里,明年华为更便宜,后年腾讯更优惠,服务迁移难。如何让业务在不同云商之间随意切换呢?这样就能实现想用哪家的云就选哪家的资源。
  下边通过实验的方式尝试一种实现上述诉求的方法,即搭建一套k8s容器集群平台,不同云商上云主机部署工作负载节点,并注册到k8s集群。实现一套容器集群管理多个云商的工作负载节点,于是根据云商的优惠政策,动态的将容器化部署的服务有偏重点的分布到性价比更高的云商上。

  如上图所示,华为云上部署3个节点,阿里云上部署3个节点,其中华为云上 k8s-master1 与 k8s-master2 为 k8s 集群的管理服务,k8s-node1 为 k8s 集群的工作负载节点,阿里云上的 k8s-node2、k8s-node3、k8s-node4 为 k8s 集群的工作负载节点。
2. 跨云商内网买通

  通过建立GRE隧道,在华为云 k8s-master2 与阿里云 k8s-node2 节点之间建立 GRE 隧道,买通华为云与阿里云内网通讯。同时利用 iptables 设置流量转发规则,例如 k8s-master2 通过设置 iptables 规则将阿里云上的主机对 k8s-master1 与 k8s-node1 的流量举行转发,同理,k8s-node2 通过设置 iptables 规则将华为云上的主机对 k8s-node3 与 k8s-node4 的流量举行转发,从而实现华为云与阿里云上所有主机之间的内网互通。
  建立 GRE 隧道的方法请参考 构建GRE隧道买通不同云商的云主机内网 。这篇文章主要介绍了在两个云商之间搭建 GRE 隧道实现两个内网互通的方法。由于利用 route 工具添加的路由并不会持久话的生存(服务器重启将会丢失),所以,本章将会介绍如何搭建 GRE 隧道,并持久话生存。
2.1 阿里云环境安装部署

2.1.1 加载驱动模块

  在阿里云 k8s-node2 节点上执行下边下令
  1. cat >  /etc/sysctl.d/gre.conf <<EOF
  2. net.ipv4.ip_forward=1
  3. EOF
复制代码
2.1.2 添加 GRE 隧道开机启动脚本

  在阿里云 k8s-node2 节点上执行下边下令
  1. cat > /etc/init.d/gre.sh <<EOF
  2. #!/bin/bash
  3. ip tunnel del tunnel999
  4. ip tunnel add tunnel999 mode gre remote 112.124.59.21 local 172.26.32.235
  5. ip link set tunnel999 up mtu 1476
  6. ip addr add 192.168.100.2 peer 192.168.100.1/32 dev tunnel999
  7. ip route add 192.168.0.0/24 dev tunnel999
  8. EOF
  9. chmod +x /etc/init.d/gre.sh
  10. cat > /usr/lib/systemd/system/gre.service <<EOF
  11. [Unit]
  12. Description=GRE Service
  13. After=network.target
  14. [Service]
  15. Type=oneshot
  16. User=root
  17. ExecStart=/etc/init.d/gre.sh
  18. [Install]
  19. WantedBy=multi-user.target
  20. EOF
  21. systemctl enable gre
  22. systemctl start gre
复制代码
2.1.3 配置 iptalbes 规则

  在阿里云 k8s-node2 节点上执行下边下令
  1. iptables -t nat -A POSTROUTING -o eth0 -s 192.168.100.1 -j MASQUERADE
  2. iptables -A FORWARD -s 192.168.100.1 -o eth0 -j ACCEPT
  3. iptables -t nat -A POSTROUTING -o tunnel999 -s 192.168.0.0/24 -j MASQUERADE
  4. iptables -A FORWARD -s 192.168.0.0/24 -o tunnel999 -j ACCEPT
复制代码
2.1.4 在其他节点配置路由

  在阿里云 k8s-node3 和 k8s-node4 节点上执行下边的下令,添加华为云内网CIDR路由到 k8s-node2 节点内网IP上。
  1. route add -net 192.168.0.0/24 gw 172.26.32.235
复制代码
  添加完成后 k8s-node3 和 k8s-node4 暂时无法访问华为云主机内网IP,期待华为云上安装部署完成后,才可以访问华为云上主机内网IP。
2.2 华为云上安装部署

2.2.1 加载驱动模块

  在华为云 k8s-master2 节点上执行下边下令
  1. cat >  /etc/sysctl.d/gre.conf <<EOF
  2. net.ipv4.ip_forward=1
  3. EOF
复制代码
2.2.2 添加 GRE 隧道开机启动脚本

  在华为云 k8s-master2 节点上执行下边下令
  1. cat > /etc/init.d/gre.sh <<EOF
  2. #!/bin/bash
  3. ip tunnel del tunnel999
  4. ip tunnel add tunnel999 mode gre remote 114.116.84.123 local 192.168.0.200
  5. ip link set tunnel999 up mtu 1476
  6. ip addr add 192.168.100.1 peer 192.168.100.2/32 dev tunnel999
  7. ip route add 172.26.32.0/24 dev tunnel999
  8. EOF
  9. chmod +x /etc/init.d/gre.sh
  10. cat > /usr/lib/systemd/system/gre.service <<EOF
  11. [Unit]
  12. Description=GRE Service
  13. After=network.target
  14. [Service]
  15. Type=oneshot
  16. User=root
  17. ExecStart=/etc/init.d/gre.sh
  18. [Install]
  19. WantedBy=multi-user.target
  20. EOF
  21. systemctl enable gre
  22. systemctl start gre
复制代码
2.2.3 配置 iptalbes 规则

  在华为云 k8s-master2 节点上执行下边下令
  1. iptables -t nat -A POSTROUTING -o eth0 -s 192.168.100.2 -j MASQUERADE
  2. iptables -A FORWARD -s 192.168.100.2 -o eth0 -j ACCEPT
  3. iptables -t nat -A POSTROUTING -o tunnel999 -s 172.26.32.0/24 -j MASQUERADE
  4. iptables -A FORWARD -s 172.26.32.0/24 -o tunnel999 -j ACCEPT
复制代码
2.2.4 在其他节点配置路由

  在华为云 k8s-master1 和 k8s-node1 节点上执行下边下令,添加阿里云内网CIDR路由到 k8s-master2 节点内网IP上。
  1. route add -net 172.26.32.0/24 gw 192.168.0.200
复制代码
  添加完成后就可以在 k8s-node1 和 k8s-master1 节点上访问阿里云上所有云主机的内网IP,而且阿里云上的所有云主机可以访问华为云上所有云主机的内网IP。
3. 构建K8S集群

  首先在华为云上安装部署 kubernetes 集群主节点,具体操纵步骤请参考:部署安装kubernetes集群。
4. 容器集群跨云商添加工作负载节点

  在阿里云主机上安装 kubernetes worker 节点配置。主要涉及到:Linux 内核升级,Containerd 容器安装,Linux 参数优化,Kubelet与Kube-Proxy 组件部署。下边操纵以阿里云 172.26.32.235 主机为例。
4.1 安装Containerd 容器服务



  • 在线安装 containerd 服务
  1. yum install -y yum-utils device-mapper-persistent-data lvm2
  2. yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  3. yum install containerd
复制代码


  • 导出 containerd 默认配置
  1. containerd config default > /etc/containerd/config.toml
复制代码


  • 编辑 /etc/containerd/config.toml 文件
  1.         sandbox_image = "registry.k8s.io/pause:3.6"
  2.    
  3.     替换成
  4.    
  5.     sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6"
复制代码
  1.         [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  2.         SystemdCgroup = false
  3.         
  4.         替换成
  5.        
  6.         [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  7.         SystemdCgroup = true
复制代码
  添加国内镜像堆栈,这个非常关键,否则将会导致镜像下载失败,Pod中服务无法启动。
  1.     [plugins."io.containerd.grpc.v1.cri".registry]
  2.       ......
  3.       [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  4.       
  5.       在containerd 配置文件中找到上边内容,并在此处添加下边两行, 注意缩进,下边两行内容与上边一行有2个空格的缩进,下边两行内容之间也存在2个空格的缩进。
  6.       
  7.         [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  8.           endpoint = ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com"]
复制代码


  • 重启 containerd 容器运行时服务
  1. systemctl enable containerd
  2. systemctl restart containerd
复制代码
4.2 Linux 参数优化

  Linux 参数优化请参考 K8S安装过程七:Kubernetes 节点配置调整
4.3 Kubernetes Worker 节点组件安装

4.3.1 获取安装包

  从华为云已经安装部署好的节点上获取 kubernetes 的安装包。详细过程请参考:K8S安装过程九:Kubernetes Worker 节点安装


  • 获取安装包以及ssl证书。
  1. scp root@192.168.0.200:/opt/kubernetes.tar.gz /opt/
  2. mkdir -p /etc/kubernetes/ssl
  3. scp root@192.168.0.200:/etc/kubernetes/ssl/* /etc/kubernetes/ssl/
  4. cd /opt
  5. tar -xvf kubernetes.tar.gz
  6. mkdir /opt/kubernetes/manifests
复制代码
4.3.2 kubelet 创建 systemctl 启动服务

  1. cat > /usr/lib/systemd/system/kubelet.service <<EOF
  2. [Unit]
  3. Description=Kubernetes Kubelet
  4. After=docker.service
  5. [Service]
  6. EnvironmentFile=/opt/kubernetes/cfg/kubelet.conf
  7. ExecStart=/opt/kubernetes/server/bin/kubelet \$KUBELET_OPTS
  8. Restart=on-failure
  9. LimitNOFILE=65536
  10. [Install]
  11. WantedBy=multi-user.target
  12. EOF
复制代码
4.3.3 启动 kubelet

  1. systemctl enable kubelet
  2. systemctl start kubelet
复制代码


  • 查看 kubelet 服务启动状态
  1. systemctl status kubelet
复制代码

4.3.4 为 kube-proxy 创建 systemctl 启动服务

  1. cat > /usr/lib/systemd/system/kube-proxy.service <<EOF
  2. [Unit]
  3. Description=Kubernetes Proxy
  4. After=network.target
  5. [Service]
  6. EnvironmentFile=/opt/kubernetes/cfg/kube-proxy.conf
  7. ExecStart=/opt/kubernetes/server/bin/kube-proxy \$KUBE_PROXY_OPTS
  8. Restart=on-failure
  9. RestartSec=10
  10. LimitNOFILE=65536
  11. [Install]
  12. WantedBy=multi-user.target
  13. EOF
复制代码
4.3.5 启动 kube-proxy 服务

  1. systemctl enable kube-proxy
  2. systemctl start kube-proxy
复制代码


  • 查看 kube-proxy 服务的启动状态
  1. systemctl status kube-proxy
复制代码

  到此,跨越不同云商搭建容器集群完成,此时的容器集群中工作负载节点涵盖了华为云与阿里云。后续添加其他云商的云主机,流程与上述类似。

5. 总结



  • 容器集群中工作负载节点跨越多个云商,不同云商之间的服务互相调用实际上走的是公网流量,假如公网带宽资源不敷,将会导致跨云服务调用存在性能瓶颈。
  • 采用跨云商部署容器集群,发起将不同云商工作负载中运行的业务具备独立性,也即是减少不同云商上服务之间的互相调用。
  • 涉及到中间件的利用时,须要考虑跨越云商访问中间件时,包管访问性能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

知者何南

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表